分布式消息队列RocketMQ
这篇分布式事务的文章写的比较好,分布式事务一般用于需要数据强一致性的地方,例如会员积分,游戏充值等需要money的地方。
Springboot中用RocketMQ(rocketmq-spring-boot-starter)解决分布式事务问题-CSDN博客
(1)Rocket基础知识解析
一、基本概念
1 消息
消息是指,消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。
2 主题
Topic表示一类消息的集合,每个主体包含若干条消息,每条消息只能属于一主题,是RocketMQ进行消息订阅的基本单位。
一个生产者可以同时发送多种Topic的消息,但是一个消费者只能对某种特定的Topic感兴趣,即只可以订阅和消费一种Topic的消息。
3 标签
4 队列
存储消息的物理实体。一个Topic中可以包含多个Queue,每个Queue中存放的是该Topic的消息。一个Topic的Queue也被称为一个Topic中消息的分区(Partition)。
一个Topic的Queue中的消息只能被一个消费者组中的一个消费者消费。一个Queue中的消息不允许同一个消费者组的多个消费者消费。
5 消息标识
RocketMQ每个消息都有唯一的MessageId,且可以携带具有业务标识的Key,方便对消息的查询。不过需要注意的是MessageId有两个,send()发送消息的时候发送者(producer端)会产生唯一的id(MsgId),消息到达Broker的时候也会产生唯一id(offestMsgId)
offsetMsgId是很容易重复的,但是MsgId重复的概率很低,自己创建的key会用的比较多一点。
二、系统架构
Producer
消息的生产者,负责生产消息。Producer通过MQ的负载均衡模块来选择相应的Broker集群队列进行消息的投递,投递的过程支持快速失败,并且这个过程延迟很低。
举个例子:
- 业务系统产生的日志写入到MQ中的过程就是消息生产的过程
- 电商平台用户提交的秒杀请求写入到MQ的过程,就是消息生产过程
RocketMQ中的消息产生者都是以生产者组的形式出现的。生产者组就是同一类生产者的集合,这类Producer发送相同的Topic类型的消息。一个生产者组可以同时发送多个Topic的消息。
上面这句话可能比较绕,不会很理解,下面这段话可以解释说明:
我们把一个生产者组里面的生产者实例定义成一个类,不是把一个类的生产者实例划分为一个生产者组。
举个例子:
假设我们是一个电商平台,需要处理订单相关的消息。我们可以定义两个Topic:
ORDER
和ORDER_DETAIL
。ORDER
Topic用于处理订单的基本信息,例如订单号、客户信息等,而**ORDER_DETAIL
** Topic用于处理订单的详细信息,例如订单项、商品信息等。我们可以创建一个生产者组,名为**
ORDER_PRODUCER_GROUP
,这个组包含多个生产者实例,这些实例分布在不同的机器上。这个生产者组可以发送ORDER
和ORDER_DETAIL
**两个Topic的消息。例如,某个生产者实例可以发送**
ORDER
** Topic的消息,例如订单号为**10001
的订单信息,而另一个生产者实例可以发送ORDER_DETAIL
** Topic的消息,例如订单号为**10001
**的订单项信息。这样,
ORDER_PRODUCER_GROUP
生产者组可以发送多个Topic的消息,包括**ORDER
和ORDER_DETAIL
**,从而处理订单相关的业务逻辑。这个例子可以形象地说明生产者组可以发送多个Topic的消息的概念。在这个例子中,两个生产者实例虽然发送不同的Topic的消息,但是它们都是属于同一类生产者,也就是**
ORDER_PRODUCER_GROUP
**生产者组的一部分。尽管它们发送的Topic不同,但是它们都是处理订单相关的业务逻辑的生产者实例。它们之间存在业务逻辑上的关联性,例如订单号为
10001
的订单信息和订单项信息之间的关联性。因此,在RocketMQ中,这两个生产者实例可以被视为同一类生产者,属于同一个生产者组
ORDER_PRODUCER_GROUP
。这两个生产者实例可以分布在不同的机器上,以提高发送消息的性能和可靠性。
Consumer
消息消费者,一个消息消费者会从Broker服务器中获得消息,并对消息进行业务相关处理。Topic是可以一个消费者可以消费多个Topic,一个Topic也可以被多个消费者消费。
上面两种情况的不同是因为消费模式的不同。
Publish-Subscribe模式与Queue模式。
- **Publish-Subscribe模式:**多个Consumer可以订阅同一个Topic,每个Counsumer可消费该Topic的所有消息。比如UP主更新视频,推送给所有的粉丝。
- **Queue模式:**一个Topic只能被一个Consume