文章目录
1. 发送消息基本样例
1.1 消息发送
- 发送同步消息: 这种可靠性同步地发送方式使用的比较广泛, 比如: 重要的消息通知, 短信通知.
- 发送异步消息: 异步消息通常用在对响应时间敏感的业务场景, 即发送端不能容忍长时间地等待Broker的响应.
- 单向发送消息: 这种方式主要用在不特别关心发送结果的场景, 例如日志发送.
1.2 消费消息
- 集群模式: 消费者采用集群模式消费消息, 多个消费者共同消费队列消息, 每个消费者处理的消息不同. (默认是采用集群模式消费消息的)
- 广播模式: 消费者采用广播的方式消费消息 每个消费者消费的消息都是相同的.
2. 顺序消息
消息有序指的是可以按照消息的发送顺序来消费, RokcetMq可以严格的保证消息有序, 分为分区有序或全局有序.
顺序消费的原理解析, 在默认的情况下消息发送会采用Round Robin轮询方式把消息发送到不同的quene(分区队列); 而消费消息的时候从多个queue上拉取消息, 这种情况发送和消费是不能保证顺序的.
- 如果控制发送的顺序消息只依次发送到同一个queue中, 消费的时候只从这个queue上依次拉取, 则就保证了顺序. 当发送和消费参与的queue只有一个, 则是全局有序;
- 如果多个queue参与, 则为分区有序, 也就是相对每个queue, 消息是有序的.
3. 延时消息
可以理解为能给消息指定被消费的时间, 比如电商里, 提交了一个订单就可以发送一个延时消息, 1h后去检查这个订单的状态, 如果还是未付款就取消订单释放库存.
不过现在RocketMq并不支持任意时间的延迟, 需要设置几个固定的延时等级, 从1s到2h分别对应这等级1到18. 在使用的时候可以进行配置.
4. 批量消息
批量发送消息能显著提高传递小消息的性能.
- 这些批量消息应该有相同的topic, 相同的waitStroeMsgOk.
- 而且不能是延时消息.
- 而且一批消息的总大小不应超过4MB.
5. 过滤消息
过滤消息也就是同一个topic中设置二级标题, 也就是设置tag进行更细致的区分消息.
- 一条消息只能有一个标签tag
- 对于复杂的场景可能起不了作用.
- 可以结合sql语句进行筛选.
6. RocketMq事务消息(分布式事务)
RocketMq是众多消息中间件中支持事务消息的, RocketMq4.3.0以上版本支持事务消息.
6.1 事务消息流程分析
事务消息分为事务的发送及提交, 事务的补偿阶段.
- 事务的发送及提交
- producer发送消息(half消息). 因为此时消息未提交, 此条消息对消费者来说是不可见的, 所以称为半消息.
- Broker服务器写入半消息后, 响应给Producer已写入成功.
- Producer接收到响应后, 提交本地事务.
- 如果本地事务提交成功, Broker就会提交消息, 然后消息对Consumer就可见了.
- 如果本地事务提交失败, 事务回滚, Broker会删除半消息.
- 事务补偿阶段
补偿阶段就是用于解决消息提交或回滚发生超时或失败的情况.- 对没有提交/回滚的事务消息, 也就是producer超时未响应, Broker端会调用方法, 发起一次回查
- Producer收到回查消息, 检查回查消息对应的本地事务状态
- 根据本地事务状态, 重新提交或回滚事务.
6.2 事务消息状态
事务消息公有三种状态, 提交状态, 回滚状态, 中间状态
- TransactionStatus.CommitTransaction: 提交事务, 它允许消费者消费此消息.
- TransactionStatus.RollbackTransaction: 回滚事务, 它代表该消息将被删除, 不允许被消费.
- TransactionStatus.Unknown: 中间状态, 它代表需要检查消息队列来确定状态.