RocketMQ学习

发布时间 2023-07-31 17:07:46作者: CodingOneTheWay

rabbitMQ(ons)特性

0拷贝 顺序写盘 随机读   延迟消息 事务消息 顺序消息 (rabbit没有这个)

基于netty nio框架

NameServer代替Zookeeper,寻址方式,更轻量级。

集群架构无单点,扩展性强。

消息重试机制,消息查询(rabbit不支持重试)

社区活跃、成熟度好

 模型

Producer 

Consumer

Broker

 

Netty分析

  • RemotingService
  • RemotingClient
    • 更新服务列表
    • 同步发送
    • 异步发送
    • 注册服务
      • 检查事务状态
    • 回调函数,生产者发异步消息的时候
  • RemotingServer
    • 注册admin接口
    • getProcessorPair
    • 同步发送
    • 异步发送
    • 这一块是netty编程模型 

  • netty底层源码解析
    • + 消息长度
    • + 序列化类型&&头部长度
    • + 消息头数据
    • + 消息主体数据。

racketMq: fastJson传输

 

消息投递 消息返回状态

  • send_ok 发送成功
  • flush_disk_timeout 有可能刷盘失败了
  • flush_slave_timeout 从节点同步失败
  • slave_not_available 从节点不可用

后三种要可靠性重投递。

延迟消息

在message上设置一个delayTimeLevel。发到broker后,会延迟。

 这个时间不能改,就固定选这些。

  • lv1 1s
  • lv2 5s
  • lv3 10s
  • 以此类推

 

怎么把消息发送到指定队列里

一个message默认有四个Mseeage Queue

MessageQueueSelector 负载均衡策略 轮询去发消息

cousumer 也是轮询消费

producer.send(Msg, selector, Obj);   selector就是指定发送的对象

 

Broker存储结构

consumer Queue  记录了,消息偏移量信息

commit Log  所有信息,包括偏移信息 

大小???

写盘方式 随机写 顺序读

消费端 0拷贝 

 

同步刷盘 异步刷盘

内存+磁盘存储两种刷盘方式

异步刷盘

同步刷盘

 

事务消息

不用事务的话,阻塞,增加处理时间,降低了RT。

架构场景

例子:支付A和支付B怎么可靠性解耦

  1. 消息发到MQ集群,同时提交事务A账户-100。
  2. 提交本地事务,发一个确认消息。
  3. 3这个时候才可见,之前不可见。

问题是:

2确认消息有可能发送失败,那一直都不可见。用mysql的存储,例如:0是不可见,1可见

解决:

MQ集群主动查询生产端,check是否成功。发ACK。

不断重试。

 代码例子

(大致)

 

 

 顺序消息

消费顺序和生成的顺序是相同的。例如场景:生成订单、付款、发货。

分为:

  • 全局顺序
    • 生成消费都是1个,这样才行。
  • 局部顺序
    • 保证每一组消息顺序执行
    • 生产和消费都要做限制才行
    • 要求:
      • 投递到同一个消息下,同一个队列中。
      • 消费端就是单线程取。读栈的模式。

 消费端

 

 

 

 

 

 

相关问题:

1.为什么使用mq,具体场景是什么?

  削峰填谷;扣减预算,积分,同步数据,记录日志,巡检优化,bcp检查,数据兜底。

2.使用什么mq,基于什么选型

  同事推荐;大qps单机最大写50Wtps;支持分布式高并发业务;有事务消息和顺序消息。

3.异步发送,怎么保证消息可靠性

  防止生产者丢失:异步有回调和异步无回调;本地消息表,更改状态,人工介入。

  防止MQ本身丢失:同步刷盘和异步刷盘,根据业务做取舍,异步的不可靠,但是效率高。

  防止消费者丢失:消费成功返回resume,否则一直执行,直到进入死信队列,人工处理。

4.消费失败重试,导致消息积压,怎么处理?

  修复时,同时建一个consumer去消费当前消息,记录消息内容。

  修复问题代码或服务。

  重试消息。

5.消息积压达到磁盘上限,消息丢失怎么办?

  本地消息表,筛选出未成功的数据。

6.rocketMq

  nameServer 注册中心

  producer 生产者集群

  consumer 消费者

7.为什么注册中心不用zookeeper

  1. zk满足cp,不能保证可用性。
  2. nameServer轻量级,水平扩展性好,
  3. 持久化机制zk太重
  4. 若依赖注册中心,从nameServer获取broker地址后,在生产者本地缓存。

8.brocker是怎么保存数据

9.master和slave是怎么同步的

raft协议 broker收到消息 置为uncommited,随后置为slave,置为commit。

10.Rocket为什么速度快

顺序存储,pagecache,异步刷盘。