本文共 875 字,大约阅读时间需要 2 分钟。
队列原理:
队列是一种非常有趣的数据结构,它遵循 FIFO(先进先出)的规则。业务系统和队列处理系统之间没有直接的联系。写入队列的系统只负责将数据推送到队列中,不需要关心队列中的数据是否被读取或处理。读取队列的系统同样只负责从队列中获取数据进行处理,两者的工作是完全解耦的。
应用场景:
冗余:通过持久化存储实现数据的冗余,后续由订单处理程序获取并处理完成后删除原数据记录。 解耦:将业务系统和队列处理系统分开,避免单点故障。例如,订单系统和物流系统可以通过队列进行解耦,保证两者之间的松散耦合。 流量削锋:在秒杀和抢购场景中,使用消息队列限制并存储请求,确保系统在高并发情况下的稳定性。 异步通信:通过消息队列实现系统间的异步操作,减少 Blocking 操作,提升系统性能和响应速度。 扩展性:在有多个系统需要处理相同类型数据时,所有系统都可以订阅同一个队列,实现动态扩展。 消息处理触发机制:
死循环方式:适用于短时间内需要处理大量消息的场景,例如秒杀活动。 定时任务:通过定时任务分配处理任务,避免在高并发情况下系统过载。例如,订单系统将订单写入队列后立即返回成功,配货系统则每隔几分钟定时读取队列并处理订单。 守护进程:使用守护进程监控队列状态,定期检查队列中是否有待处理的消息。例如,在 PHP 中可以使用 PHP-FPM 和 CGI 脚本实现。 使用 MySQL 实现解耦案例:
为什么要解耦?
如果订单系统和物流系统耦合在一起,订单系统一旦崩溃,物流系统也会受到影响。通过解耦,可以让订单系统专注于接收和处理订单,物流系统专注于处理物流信息,从而提升系统的稳定性和可靠性。
表的设计:
订单系统写入队列的代码:
配货系统读取队列的代码:
执行定时任务:
如何使用 Crontab 告诉系统定时执行任务?
注意:
这日志文件需要自己新建。
使用 Redis 进行流量削锋案例:
思路:
秒杀程序将请求写入 Redis。 检查 Redis 中已存放的数据长度,如果超过上限直接返回秒杀结束。 使用死循环处理存入 Redis 的数据并入库。 转载地址:http://fxtfk.baihongyu.com/