文章详情页 您现在的位置是:网站首页>文章详情
消息队列基础篇(下)
Jeyrce.Lu 发表于:2019年12月6日 19:07 分类:【服务器】 3374次阅读
消息队列在运行过程中也会有一些问题,接下来就讨论一下消息队列中重复消息问题和消息积压问题的处理方法。
一、如何处理消息重复问题
1.消息重复的必然性
上一篇我们讲到了消息队列为了保证消息可靠性,采取了分布式事务和消息回查机制,由于消息回查机制的存在,消息重复是必然存在的情况。
生产阶段,假如一条消息成功写入了消息队列,但是应答信号ACK在回传给Producer的过程中丢失,就会导致这条消息重复写入消息队列,那么消费端就会收到重复消息。
消费阶段,假如一条消息被成功消费,但是应答信号ACK回传给Broker的过程中丢失,消息就会再次推送给消费者产生重复消费。
2.消息服务质量
在MQTT协议中规定了三个等级的消息服务质量:
(1)At most once:至多一次。消息在传递时,最多会被送达一次。换一个说法就是,没什么消息可靠性保证,允许丢消息。
(2)At least once:至少一次。消息在传递时,至少会被送达一次。也就是说,不允许丢消息,但是允许有少量重复消息出现。
(3)Exactly once:恰好一次。消息在传递时,只会被送达一次,不允许丢失也不允许重复,这个是最高的等级。
三种消息质量等级消息准确性逐渐升高,实现难度也逐渐升高。那么我们是否可以通过使用消息队列中间件时设定Exactly once等级,让消息队列中间件本身来帮助我们既保证消息可靠性又没有消息重复呢?答案是:不能。目前包括Kafa在内的绝大多数消息队列中间件能够提供的消息等级是At least once。
3.幂等原理
(1)数学中的幂等: f(x) = f(x)^n
(2)引申的幂等: 一个或一串操作执行1次和执行n次造成的结果是相同的,那么这一串操作就是幂等操作。
(3)基于幂等的原理,对于消息消费结果来说:Exactly once = At least once + 幂等消费
4.如何设计幂等消费
消息中间件为At least once等级,我们只要保证消费是幂等消费,那么就能解决消息重复的问题。但是并不是所有的消费都是幂等的,因此我们需要在业务逻辑中利用一些组件的性质将非幂等消费转换为幂等消费。
常见的设计幂等消费的技巧:
(1)利用数据库唯一性约束:实际上不仅是唯一性,类似于CREATE IF NOT EXIST, SETNX等这样的约束都可以。
(2)设置前置消费条件:满足条件则消费并返回成功ACK,否则只返回成功ACK。
(3)GUID方案:每条消息设置全局唯一id,消费前先检查当前消息的id是否已经消费过,未消费过则消费后标记id返回成功ACK,否则直接返回成功ACK。
用一句话来概括就是:设计好幂等消费,就可以解决消息重复问题。
二、如何处理消息积压问题
消息积压也是消息队列在生产环境中经常遇到的问题,处理消息积压的原则是:先处理积压的消息,再排查问题。
1.系统优化
为了保证消息队列的正常运转,我们在设计系统的时候,就应该对生产端,消费端进行一个估算,确保正常运转的系统:生产速度 < 消费速度。
2.处理已经积压的大量消息
系统偶尔在一些网络波动,硬件设施影响的情况下可能出现生产速度大于消费速度的情况,随着时间的推移可以自行恢复。如果已经产生了大量的消息堆积,那么可以通过以下几个步骤进行人为干预。
(1)处理积压消息
我们第一件要做的事就是先处理掉积压的大量消息。我们可以实行服务降级策略,关闭我们非核心的业务,减少生产端的消息生产;在消费端我们可以临时扩容,将生产端扩容至平时的5-10倍,同时增加TOPIC中的消息队列数量,以此提高消费速度的方式快速消费掉积压的消息。
(2)排查问题
通过消息队列本身的监控以及日志,我们就能很快确定到底是生产端出了问题还是消费端出了问题导致消息积压,常见原因有:消息大量重复写入,消费失败引起大量重试,消费端硬件故障,分布式事务中出现死锁等。
(3)恢复环境
排查出问题后替换有问题的服务,等待消息队列积压的消息被消费掉,最后将生产端关闭的非核心业务正常开启,消费端撤掉临时扩容的服务器,恢复到正常状态即可。
三、消息队列在秒杀系统中的应用
秒杀系统实际上有很多种实现方式,其中一种简单的应用方式就是将秒杀的一部分业务利用消息队列进行异步实现。
版权声明 本文属于本站 原创作品,文章版权归本站及作者所有,请尊重作者的创作成果,转载、引用自觉附上本文永久地址: http://blog.lujianxin.com/x/art/uijbhbexwriy
上一篇:消息队列基础篇(上)
猜你喜欢
文章评论区
作者名片
- 作者昵称:Jeyrce.Lu
- 原创文章:61篇
- 转载文章:3篇
- 加入本站:2046天
作者其他文章
站长推荐
友情链接
站点信息
- 运行天数:2047天
- 累计访问:164169人次
- 今日访问:0人次
- 原创文章:69篇
- 转载文章:4篇
- 微信公众号:第一时间获取更新信息