面霸养成(一)以一个秒杀系统开始,我们需要懂一些什么技术?

秒杀系统设计

“你如何设计一个秒杀系统?或者是你如何设计一个抢票系统?”
在面试高级ApiBoy和架构师的时候,应该有很多人都遇见过这个问题。有时候你不得不思考一下,即便现在网上许多面经里都包含了这类问题,为什么面试官还是乐此不疲的提出它呢?而且你在网上查找这些设计题的答案,也很难找到一个很全面的,能让你一下就能组织起语言去回答的文章。究其原因是因为这个题目涉及到的知识点还是很多的,哪怕你已经背好了答案,只要面试官随随便便发散或者挖掘一下深度,如果你没有很硬的技术知识储备,还是会很快败下阵来。

那么本专栏就是来探究一下如何搞明白一个秒杀系统,这其中确实需要理解方方面面的知识。而从另一个方面来讲,这也可以说是为大家提供一个学习的方向。

本文暂时只做一个大致的方案设计,讲述一下作为一个高级码农面对这个问题你需要从哪些方面来考虑你的系统。具体的知识后面的文章再进行梳理。

废话不说,我们开始设计我们的秒杀系统:

程序的入口 : 网关

对于一个系统的了解,绝对不是仅仅像有些文章写得那样,秒杀就只注意一些缓存和业务逻辑准确性,你的服务器(肯定是分布式)的整个架构都是可以优化的,一个处理大并发的服务肯定是方方面面都要优化到的,作为所有请求的入口,网关肯定是第一个优化的。

直接说结论,首先,使用Lvs+多主的nginx服务器来作为网关。(相关的详细只是后面的文章讲到。)

其次,网关可以做IP验证,使用nginx做一些简单的人机验证,过滤掉一些很明显的非人为请求。假设你的服务不想扩容,但是QPS又超过了你的服务能承载的数量,那么你可以直接在网关(nginx+lua)就过滤30%甚至50%的用户,返回秒杀失败的信息,这样这些请求根本就不需要进入你的服务,而nginx做简单的静态文本返回基本上你完全不用担心并发问题。

核心业务 : 服务代码

网关设计完成之后,自然是我们的核心业务,也就是来处理秒杀的真实代码,在这里面我们又需要注意哪些设计呢。

  • 安全

安全性自然是首要的,包括你的数据验证,你服务的稳定高可用(熔断降级限流等),你的业务逻辑准确性(不能超卖)等等,都需要在你的设计思路之中。

  • 性能

要记住,大型的服务一定是安全性有保障了之后,我们才会考虑高性能!特别是涉及到交易的服务,如果安全性不解决,高性能就会变成高速狗带。
那么在性能上,我们在设计上能做的有削峰,异步,多级缓存,多线程优化等。

服务环境 : 底层优化

除了代码之外,对使用到的一些中间件的配置也要有一个优化的思路与方案。

如php-fpm,nginx,tomcat,JVM, Redis, MySQL 等配置优化,不同的语言可能有部分差异,但是优化思路都大同小异。

兜底方案 : 容灾

对于一个系统设计,除了要完成业务,要追求性能之外,最重要的还有各种故障恢复,bug追踪的思路与设计。
作为面向bug编程的高手,你应该能明白总是会有一些莫名其妙的bug出现在你的系统中,所以一个好的系统不仅仅是一个出问题很少的系统,而且是一个恢复很快的系统。

总结

以上大致从几个方面总结了一下一个秒杀系统应该思考到的一些问题。网上有很多秒杀系统的设计方案,但是大多数都仅仅只考虑到了如何去实现秒杀这个功能。既然是一个系统设计,那么作为面试官,如果一个人写代码只考虑业务实现,而不考虑各方面的安全隐患和容错,那么自然会觉得此人没有做过一些大型的稳定的项目。
最重要的是,这个问题可以延伸出很多很基础的细节问题,如果你只是看看博客,背一背大致的思路,那么在面试官的追问下,你马上就会原形毕露了。
本文简单的概述了一下设计需要注意的方向,以秒杀作为一个引子,接下来会从网络协议开始慢慢的深入讲解一些常见的面试题,当你把这些基础原理都弄懂了之后,你再回头对照这篇文章的思路,就能自己设计出一个高性能的并发服务架构了。不仅仅只是秒杀!

你可能感兴趣的:(面霸养成计划)