史上最全RocketMq面试大全之RocketMq消息发送样例,分布式事务



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 事务消息流程分析

事务消息分为事务的发送及提交, 事务的补偿阶段.
在这里插入图片描述

  • 事务的发送及提交
    1. producer发送消息(half消息). 因为此时消息未提交, 此条消息对消费者来说是不可见的, 所以称为半消息.
    2. Broker服务器写入半消息后, 响应给Producer已写入成功.
    3. Producer接收到响应后, 提交本地事务.
    4. 如果本地事务提交成功, Broker就会提交消息, 然后消息对Consumer就可见了.
    5. 如果本地事务提交失败, 事务回滚, Broker会删除半消息.
  • 事务补偿阶段
    补偿阶段就是用于解决消息提交或回滚发生超时或失败的情况.
    1. 对没有提交/回滚的事务消息, 也就是producer超时未响应, Broker端会调用方法, 发起一次回查
    2. Producer收到回查消息, 检查回查消息对应的本地事务状态
    3. 根据本地事务状态, 重新提交或回滚事务.

6.2 事务消息状态

事务消息公有三种状态, 提交状态, 回滚状态, 中间状态

  • TransactionStatus.CommitTransaction: 提交事务, 它允许消费者消费此消息.
  • TransactionStatus.RollbackTransaction: 回滚事务, 它代表该消息将被删除, 不允许被消费.
  • TransactionStatus.Unknown: 中间状态, 它代表需要检查消息队列来确定状态.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值