mysql 消息队列_MYSQL模拟消息队列(转载) | 学步园

本文介绍如何使用MySQL模拟消息队列解决微博等场景下高并发问题。通过将直接更新关注者表的操作改为先写入公共表,再以较慢频率分发到关注者表的方法,实现了操作的削峰填谷,提高了系统的稳定性和用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

在关注者刷新时,查找所有关注对象的微博,并为之排序输出

在发布微博时就查找发布者的所有关注者,然后全部insert一条新记录。

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

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

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

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

其他考虑:

这个消息队列也可以用memcached来实现,内存中效率更高。

队列中已经发布的消息更改其状态,同时一定时间间隔之后清空已发布的消息,减少队列长度。

这种方式也比较便于在机群,分布式系统中扩展。

首先是会

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值