背景
需要开发app抢购的api,需要处理大量的请求,需要有高响应率,例如淘宝和京东的秒杀,会在一个时间点有大量的请求。
设计思路
首先用nginx做负载均衡,根据ip_hash分配请求到不同服务器上,默认前三台服务器能处理请求,其余自动抛弃请求。
每台服务器上都设置有消息队列。
api的作用就是接收请求,请求放到消息队列里,返回给客户端一个等待处理结果的消息。
然后服务器后台一直跑一个处理消息的程序,当消息队列不为空的时候,开始处理消息,处理完消息,返回一个处理结果给客户端。
用到的技术
nginx的负载均衡技术
redis消息队列技术
api接口可用php快速开发
后台程序可用python,java,lua,c等。
redis消息队列
消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式。利用redis这两种场景的消息队列都能够实现。
生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列,谁先抢到消息谁就会从队列中取走消息;即对于每个消息只能被最多一个消费者拥有。
发布者订阅者模式:发布者生产消息放到队列里,多个监听队列的消费者都会收到同一份消息;即正常情况下每个消费者收到的消息应该都是一样的。
首先redis的设计是用来做缓存的,但是由于它自身的某种特性使得他可以用来做消息队列。它有几个阻塞式的API可以使用,正是这些阻塞式的API让他有做消息队列的能力。
另外做消息队列的其他特性,例如FIFO也很容易实现,只需要一个List对象从头取数据,从尾部塞数据即可实现。
redis能做消息队列得益于它的list对象blpop brpop接口以及Pub/Sub(发布/订阅)的某些接口。他们都是阻塞版的,所以可以用来做消息队列。
更多参考
http://www.cnblogs.com/lhfcws/p/3732535.html