赞
踩
MQ(Message Queue): 是一种应用程序间的通信方法。有别于程序之间直接通过远程调用进行通信,应用程序使用MQ进行通信时,通信的发起方将消息(数据)写入队列,接收方通过检 索队列中的消息(数据)来进行的。通常会使用MQ中间件进行信息的中转,而无需在程序之间建立直接的联接。用于接收、存储、分发消息的独立应用程序。常见的MQ中间件有:RabbitMQ 、RocketMQ、Kafka、Redis、ActiveMQ等。
MQ中间件的对比
应用之间通过引入MQ,使 应用之间的交互改为通过MQ消息来触发,降低应用之间的耦合。
解耦对比图
在高并发的场景中,可以通过引入MQ,将同步操作改为异步操作,通过消费者的数量,控制系统处理的并发度。
在秒杀等高并发场景中,短时间内会涌入大量的请求。通过MQ中间件将请求存储到队列中,通过消息消费者来处理业务,从而达到削峰的目的。
处理要点:
使用MQ作为事务的二次提交的中间节点,存储事务状态,事务参与者通过MQ接收事务状态,进行相应的事务操作。
处理要点:
数据发生变更时,通过 MQ将数据变更信息,分发到数据库、Redis、Hbase、搜索引擎等同构或异构系统中。
处理要点:
应用程序本身的事务与mq中间件的事务之间状态可能不一致,导致消息多发或漏发。
MQ的事务问题原因
有两个层面:
常见解决方案
消息表
将消息的发送过程拆分两步:
RocketMQ事务消息
事务消息发送步骤如下:
自研事务消息
在数据同步等对顺序要求高的场景,要保证从消息发送、消息存储、消息消费的全链路的顺序一致。
顺序错乱的常见原因
消息发送:多线程并行发送,有顺序的消息被写入到不同的分区,异常重试。
消息消费:多消费者并行消费,或消费者内部启用多线程消费。异常重试。
为什么要保证消息的顺序?
如果业务上通过消息发送的数据是有前后顺序关系时,则必须保证消息的顺序。 例如:通过MQ同步数据时,如果增、改、删的顺序在同步时变为删、改、增,数据将不被删除。
常见解决方案
RocketMQ的顺序消息
自研分区顺序消息
存在问题:
利用版本号保证顺序
当同一消息被重复投递或消费时,能保证消息消费的幂等性。那什么是防重与幂等呢?
防重:保证相同的消息只最多只执行一次 。
幂等:保证相同的消息,每次执行时结果相同。
为什么需要做消息的防重或幂等
常见解决方案
当系统中同时存在新老消息时,或消费逻辑发生变化时,需要设计版本机制保证消息的兼容性。
升级时的问题
通常基于性能和高可用的考虑,同一队列的消费者会有多个。当消息的内容或消息处理逻辑发生变 化,消费者需要升级时,会产生以下问题:
如何安全的升级消费逻辑
注册消费者
消费者流程图
如上图所示,需要将消息增加上具体的版本号,并将生产者的ip和端口号注册到zk上,这样消费者在接收到与自己版本不同到消息时,可以在zk中获取到对应版本到消费者,并将消息内容通过rest等请求方式发送给对应版本号的消费者进行处理,来保证消息的正确处理。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。