微服务原理与实战第九章RocketMQ

  • Post author:
  • Post category:其他

RocKetMQ分布式消息通信

RocKetMQ是一个低延迟,高可靠,可伸缩、易于使用的分布式消息中间件,也叫消息队列。其优点是高吞吐、低延迟、海量消息堆积等优点,同时提供顺序消息,事务消息,定时消息,消息重试,与追踪功能。

RocketMQ的应用常见

  1. 削峰填谷:如果秒杀、抢红包
  2. 异步解藕:交易系统、物流、购物车
  3. 顺序收发:交易系统创建订单、支付、退款
  4. 分布式事务一致性:交易系统、红包
  5. 大数据分析:业务数据实时分析
  6. 分布式缓存同步:双11感应价格变化

RocketMQ集群

整体架构设计

  1. Producer:消息发布的角色,主要把消息发送到Broker,支持分布式集群方式部署。
  2. Consumer:消息消费者的角色,主要负责把Broker订阅消息消费,支持分布式集群方式部署。
  3. Broker:消息存储的角色,主要负责消息的存储、投递和查询,以及服务高可用保证,支持分布式集群方式部署。
    在这里插入图片描述
  4. NameServer服务管理角色,主要负责管理Broker集群的路由信息,支持分布式集群方式。

NameServer是一个Topic路由注册中心

  1. 服务注册:NameServer接受Broker集群的注册信息,保存下来作为路由信息的基本数据,并提供心跳检测机制,检查Broker是否存活。
  2. 路由信息管理:NameServer保存了Broker集群的路由信息,用于提供给客户端查询Broker的队列信息。Producer和Consumer通过NameServer可以知道Broker集群的路由信息,从而进行信息交换

基本概念

  1. Message:消息
  2. Topic:主题
  3. Queue:消息队列
  4. Tag:消息标志
  5. UserProperties:用户自定义的属性集合,属于消息的一部分
  6. ProducerGroup:同一个Producer集合,这类发送同一类消息。
  7. ConsumerGroup:同一类的Consumer集合消费同一类消息。

如何实现顺序消费

顺序发送的技术原理

  1. 局部有序:指发送同一个队列的消息有序,可以在发送消息时指定队列,在消费消息时也按顺序消费。不同订单ID之间并行,统一个ID有序。
  2. 全局有序:设置Topic只有1个队列可以实现全局有序,创建Topic时手动设置。

RocketMQ三种消息发送方式

  1. 同步:发送网络请求后会根据同步等待Broker服务器的返回结果,支持发送失败重试,适用于比较重要的消息通知场景。
  2. 异步:异步发送网络请求,不会阻塞当前线程,不支持失败重试,适用于对响应时间要求更高的场景。
  3. 单向:单向发送原理和异步一直,不支持回调。适用于响应时间非常短、对可靠性要求不高的场景,例如日志收集。

顺序消费的技术原理

顺序消费的原理:是因为同一个消息队列只允许Consumer中的一个消费线程拉去消费。Consumer中有多个消费线程池,多个线程会同时消费消息。在有序消费的情况下线程请求到Broker时会先申请独占锁,获得锁的请求则允许消费。

消息的幂等性

  1. at-most-once:消息投递后不论消费是否成功,不会重复投递,有可能会导致数据未被消费,RocketMQ未使用该方式。
  2. at-least-once:消费投递后,消费完成后,向服务器返回ACK,如果没有消费则一定不会返回ACK。由于网络异常】客户端重启等原因,服务器未能收到客户端返回的ACK,服务器则会再次投递,这就会导致可能重复 消费,RocketMQ通过ACK保证消息至少被消费一次。
  3. exactly-only-once:

事务消息的原理

  1. 发送预处理消息成功后,开始执行本地事务。

  2. 如果本地事务执行成功,发送提交请求提交本地事务。在这里插入图片描述

  3. 如果本地事务执行失败了,发送回滚请求回滚事务消息,消息不回投递给客户端

  4. 如果本地事务状态未知,网络故障或Producer宕机,Broker未收到二次确定的消息。由Broker端发送请求给Producer进行消息回查,确认提交或者回滚。如果消息状态一直未被确认,需要人工介入。
    在这里插入图片描述


版权声明:本文为qq_39734254原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。