rocketmq介绍和消息队列事务处理机制

RocketMQ介绍
rocketmq是支持发布(Pub)和订阅(Sub),可靠的先进先出、严格顺序、亿级消息堆积能力的分布式消息队列
rocketmq消息队列包含Producer、Name Server、Broker、Consumer等四大块组成
Producer:也就是常说的生产者,生产者的作用就是将消息发送到 MQ,生产者本身既可以产生消息,如读取文本信息,将读取的文本信息发送到 MQ
Name Server:提供轻量级的服务发现和路由信息,每个 NameServer 记录完整的路由信息,提供等效的读写服务,并支持快速存储扩展
Broker:是 RocketMQ 系统的主要角色,就是前面一直说的 MQ。Broker 接收来自生产者的消息,储存以及为消费者拉取消息的请求做好准备
Consumer:也就是常说的消费者,接收 MQ 消息的应用程序就是一个消费者。拥有相同 Consumer Group 的消费者称为一个消费者集群
生产者走向: Producer--->Name Server--->Broker

消费者走向: Customer--->Name Server--->Broker


以下是其他相关支持组件
Topic:主题是对消息的逻辑分类,比如说有订单类相关的消息,也有支付类相关的消息,那么就需要进行分类。
Tag:标签可以被认为是对主题的进一步细化,可以理解为二级分类,一般在相同业务模块中通过引入标签来标记不同用途,同时消费者也可以根据不同的标签进行消息的过滤。
如下所示:
Message msg = new Message("TopicTest",// topic
                            "TagA",                     // tag
                            "ORDER",                    // key
                            ("Hello").getBytes()); // body

SendResult sendResult = producer.send(msg);

部署Broker
部署方式包含单Master、多Master、多Master多Slave(集群采用异步复制方式)、多Master多Slave(集群采用同步双写方式)等四大类组成
单Master: 优点:除了配置简单没什么优点
          缺点:不可靠,该机器重启或宕机,将导致整个服务不可用
多Master:优点:配置简单,性能最高
缺点:可能会有少量消息丢失(配置相关),单台机器重启或宕机期间,该机器下未被消费的消息在机器恢复前不可订阅,影响消息实时性
多Master多Slave(集群采用异步复制方式):   
优点:性能同多Master几乎一样,实时性高,主备间切换对应用透明,不需人工干预
        缺点:Master宕机或磁盘损坏时会有少量消息丢失
多Master多Slave(集群采用同步双写方式):
       优点:服务可用性与数据可用性非常高
       缺点:性能比异步集群略低,当前版本主宕备不能自动切换为主

消息队列分布式事务

一般用法比较广泛的消息队列有rabbitMQ、rocketMQ、kafka等消息中间件,但是rabbitMQ和kafka这两个消息中间件没有事务,接下来我们以rocketMQ举例子,

我们以一个转帐的场景为例来说明这个问题:Bob向Smith转账100块。

在开发中我们将大事务拆分成=小事务+异步


事务流程:

第一步:首先生产者发送Prepared消息给MQ,状态为不可消费状态(就是消费者无法消息)   ---该消息包含Smith姓名以及转账金额和状态等等

扫描二维码关注公众号,回复: 1087137 查看本文章

第二步:执行本地事务   ---该事务就是从Bob账户扣款100块

第三部:如果本地事务执行失败就回滚,并将Prepared消息删除,如果本地事务执行成功,确认消息发送(就是修改Prepared消息状态为可消费状态)

第四步:消费端开始消费队列。如果成功,给MQ返回回执。表示成功,生产者可以订阅该消息或者监听该消息,表示整个消息队列是成功的  --比如:支付包账户余额转到银行卡。到账状态和时间都是靠生产者监听和订阅MQ实现转账成功的逻辑。

如果消息端出现消费失败(这里有好多原因:程序报错,账户被冻结了等等),那么MQ可以重发消息。可以设定6次,超过次数可人工处理。



猜你喜欢

转载自blog.csdn.net/qq_39291929/article/details/79250506