rocketmq? rocketmq的应用场景
一、rocketmq和rabbitmq的区别rocketmq使用
1.RabbitMQ
是基于AMQP协议的具有跨语言的特性,支持多种开发语言,基于erlang语言编写,天生具有高并发.
2.rocketMQ
是基于JMS的是阿里巴巴旗下开发的mq,只能用java语言,声称可用性极高,消息从来不会丢失.
两者的区别和联系:
JMS是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据交互的格式
JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的。
JMS规定了两种消息模型;而AMQP的消息模型更加丰富
二、rocketmq工作模式
(1)集群模式:同一个consumerGroupName下的多个consumer平摊消息队列中的消息,例如三个消费者处于同一个group下,且订阅了同一个topic,加入生产者往消息队列中放入了这个topic的6条消息,那么消费者消费消息的总和为6条,消费完的消息不能被其他实例所消费
(2)广播模式:指的是consumer属于同一个ConsumerGroup,消息也会被ConsumerGroup中的每个Consumer都消费一次,广播消费中ConsumerGroup概念可以认为在消息划分方面无意义
三、RocketMQ事务消息可以用来解决分布式事务吗
RocketMQ的事务消息并不是用于解决业务分布式事务,当然可以基于MQ实现最终一致性。RocketMQ实现的事务消息的基本思路其实就是一次分布式事务一致性的经典实现。
RocketMQ事务消息的目的是确保业务与消息发送这两个步骤实现一致性,即要么都成功,要么都失败,请看下面一段伪代码:
publicMapcreateOrder(OrderDtoorderInfo){//开始数据库事务
//step1:组装业务
//step2:调用dao方法插入数据库
orderMapper.insert(order);
//发送消息,以便订单系统的下游能够根据该订单信息,完成其后续流程,例如通知物流系统发货等
producer.send(msg);
}//提交事务或回滚事务(例如数据库发生唯一性约束等错误,或者消息发送后突然宕机,导致该事务无法提交)
那现在就有可能出现一个问题:订单落数据库与消息发送这两个分布式操作(一个操作本地数据库,另外一个通过网络向消息中间件发送消息)如何保证要么成功,要么失败呢?这就是RocketMQ引入事务消息的目的。
RocketMQ实现事务消息的原理如下图所示,其基本原理如下:
1、应用程序在事务内完成相关业务数据落库后,需要同步调用RocketMQ消息发送接口,发送状态为prepare的消息,消息发送成功后,RocketMQ服务器会回调RocketMQ消息发送者的事件监听程序,记录消息的本地事务状态,该相关标记与本地业务操作同属一个事务,确保消息发送与本地事务的原子性。
2、RocketMQ在收到类型为prepare的消息时,会首先备份消息的原主题与原消息消费队列,然后将消息存储在主题为RMQ_SYS_TRANS_HALF_TOPIC的消息消费队列中。
3、RocketMQ消息服务器开启一个定时任务,消费RMQ_SYS_TRANS_HALF_TOPIC的消息,向消息发送端(应用程序)发起消息事务状态回查,应用程序根据保存的事务状态回馈消息服务器事务的状态(提交、回滚、未知),如果是提交或回滚,则消息服务器提交或回滚消息,如果是未知,待下一次回查,RocketMQ允许设置一条消息的回查间隔与回查次数,如果在超过回查次数后未知消息的事务状态,则默认回滚消息。