现在的位置: 首页 > 综合 > 正文

MYSQL模拟消息队列(转载)

2013年02月20日 ⁄ 综合 ⁄ 共 756字 ⁄ 字号 评论关闭

《PHP核心技术与最佳实践》第5章中的内容:MYSQL模拟消息队列

主要用于微博,团购秒杀等场合,其用意是将大量并发的数据库操作变得缓慢可控,达到削峰的目地。同时实现方式也比较简单易行。

比如微博某大V发布了一条微博,那么按照普通网站的架构,有两种处理方式:

  1. 在关注者刷新时,查找所有关注对象的微博,并为之排序输出
  2. 在发布微博时就查找发布者的所有关注者,然后全部insert一条新记录。

很显然,前者在规模巨大化之后,效果是灾难性的,因为会有大量并发去查找总在更新的表,同时还有大量内存中的临时结果的排序。后者稍好但是首先是会有大量的冗余信息出现,其次一个关注量巨大的大V发布一条微博,会带来一个insert的巨大高峰,而且是完全不可控的高峰,因为发博时机是随机的。

研究后可知方案2中的冗余问题可以无视,因为微博的绝对数据量并不大,并且这种插入可以分级分批进行,比如对于大量不活跃的关注者可以降低更新频率等。

对于insert高峰的问题,此处我们把有新微博之后就直接更新关注者表的方式,变成先insert到一个公共表中,然后以一个相对较慢的频率去取此表,再分发到关注者表中。可想而知,如果有信息高峰来临时,关注者的信息更新会相对变慢,但是只要没有慢到一定程度,关注者是很难感觉出来的,所以并不影响用户体验,同时又可以动态改变更新频率,来适应不同的负载情况。

如果进阶考虑的话,这个分发到关注者的过程,还可以加入很多过滤,比如有些关注者众多的用户实际大量关注者是僵尸(比如已经1月没有登陆记录),可以故意漏掉这些用户等。

其他考虑:

  1. 这个消息队列也可以用memcached来实现,内存中效率更高。
  2. 队列中已经发布的消息更改其状态,同时一定时间间隔之后清空已发布的消息,减少队列长度。
  3. 这种方式也比较便于在机群,分布式系统中扩展。

首先是会

抱歉!评论已关闭.