赞
踩
队列(queue)是一种先进先出FIFO的线性表结构,只允许在尾部插入和在头部删除。最近一两年火爆的团购秒杀等应用,其中的大并发是会把数据库压垮的,一个解决方法就是把HTTP请求放入内存中的高速队列,然后对队列里的数据按一定的规则进行分流处理,这就是HTTP请求队列。比如,微博和SNS通常拥有上亿的受众数量,一个明星或公众人物可能有几千万的粉丝,如果一个公众人物发了条微博,那么就得推送到所有关注者那里(有推策略、拉策略、随机策略、优先策略等),这时就必须用到队列。面对大数据量和高并发的WEB应用,队列工具可大有所为。
下面以SNS中的动态分发的设计过程为例进行讲解队列在消息高度机制中的实现和使用。
当某用户发布一条动态的时候,先把这条动态插入feed表,然后判断当前用户组,普通朋友则给所有好友发布广播,往feedBroadCast表写入冗余数据,但这种频繁不间断的读写数据库会给服务器造成很大压力,注意到好友动态不必具有十分高的实时要求,所以这里采用异步的推,把动态推给好友而不是好友主支拉取。(我理解为在冗余表里异步写入数据,不是很理解把动态推给好友 是什么意思。。)
随着用户增加,在前端页面直接定稿大量数据会延长用户的等待时间,在多并发的情况下页面效率低压力集中,为解决上述问题,考虑使用数据的异步处理,而消息队列的背后实质就是一种“异步处理”的思想。
“消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器将消息从它的源中继到它的目标时充当中间人的角色。队列主要提供跌幅并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息直到成功传递。利用消息队列可以很好地异步处理数据传送和存储,当频繁地向数据中插入数据时就可采用消息队列异步插入,另外可将较慢的处理逻辑、有并发数量限制的处理逻辑,通过消息队列放在后台处理如视频转换发送手机短信等。
消息发送很简单,在动态产生之后,直接在DB中插入一条记录即可,这里,完全依赖数据库来模拟实现消息队列。接收者从已获取的消息列表中取出下一条消息。
在队列中存储的是消息,而不是实际要分发和处理的数据。秒杀队列中存储的仅仅是一个HTTP请求,SNS队列中存储的仅仅是一条制造出来的动态,而不是所有要分发的动态。动态的颁发不是消息队列所负责的,其由另一个程序处理。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。