mq干嘛用的 MQ有什么用怎么用
MQ的使用场景
1.过载保护
访问量的剧增可能会使系统因超负荷而崩溃,这种突发流量往往无法提前预知,当然加机器可以应对突发流量,但如果为此而投入资源随时待命无疑是一种浪费。如果使用MQ进行流量控制可以在不丢失请求的情况下保护系统,也就是常说的流量削锋。
2.异步通信
有些场景需要异步处理更为妥当,如下单发通知,注册发短信、邮件,A系统依赖B系统的数据但实时性要求并不是很高的场景。使用MQ可以使不同系统间异步通信,既能实现功能又不影响核心业务。常见的日志处理也是应用系统和日志系统之间的异步通信。
3.冗余
在某些场景下处理数据的过程会失败,此时如果数据未持久化就会造成丢失。MQ可以采用"插入-获取-删除"的范式,在把一个消息从队列中删除之前,需要处理系统明确指出该消息已经被处理完毕,以此来确保数据被安全的保存直到使用完毕。
4.服务解耦
松耦合系统更能适应未知的变化。判断系统间是否是松耦合的一个简单方法是,一个应用的变化是否会强制其它应用跟着改变?如果答案是肯定的那就说明相关模块之间是紧耦合的。此时AB模块可以通过约定消息协议使用MQ来达到解耦的目的,即只要符合消息协议,一个模块的改动不需要其他模块跟着变化。
MQ带来的问题一个方案必有两面性,MQ在给解决方案带来方便的同时也会给系统增加一些问题,这也是在使用MQ时需要考虑的。
1.延迟问题
这是MQ天然存在的问题,不可避免,只能将延迟降低到某个时间级别。
2.增加了系统的复杂度
使用MQ,需要引入消息丢失、重复消费、数据一致性保证等问题的解决方案,自然会增加系统的复杂度。
3.可能产生不一致的数据
4.系统可用性降低
以前只要考虑应用系统的问题,现在还要考虑MQ挂掉的问题,MQ挂掉,所关联的系统都会无法服务。
MQ选型比较常见的MQ有:rocketMQ、rabbitMQ、kafka
rocketMQ:alibaba使用Java语言开发的MQ,2012年开源,交由Apache管理,支持消息重复消费
rabbitMQ:使用erlang语言开发,高并发性能好,社区活跃最高,支持消息持久化
kafka:性能好
其他MQ:Pulsar(存储和计算分离)、JMQ(京东自研)、Redis、ActiveMQ、ZeroMQ等。各MQ特性的相关文章有很多,此处不再赘述。
MQ常见问题的处理方式
1.消息丢失的处理
生产阶段:如捕获消息发送的错误,并重发消息。
存储阶段:如通过配置刷盘和复制相关的参数,让消息写入到多个副本的磁盘上.
消费阶段:处理完全部消费业务逻辑之后,再发送消费确认。
2.重复消息的处理
2.1 在MQTT协议中有三种传递消息时的服务质量标准:
1)At most once: 至多一次。消息在传递时,最多会被送达一次。无可靠性。
2)At least once: 至少一次。消息在传递时,至少会被送达一次。不允许丢失,允许重复。
3)Exactly once:恰好一次。消息在传递时,只会被送达一次。不允许丢失也不允许重复,这个是最高的等级。
2.2 对于重复消息的解决方案:幂等 。At least once 幂等消费 = Exactly once
1)通过唯一约束控制:如数据库唯一索引、redis的setnx
2)设置前提条件:数据库查询、数据库版本号等
3)全局id:生产者给数据增加一个全局id,消费端去查询这个id有没有消费过,没有则进行处理。
3.消息积压的处理
消息积压本质上是由消息生产者和消费者的速度不匹配而产生的,需要结合实际场景针对消息优化。
1)发送端性能优化,如设置合适的并发和批量大小等。
2)消费端性能优化,如水平扩容(Consumer实例和分区数同步扩容)等。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com