RocketMQ原理解析-producer(转)

简介: RocketMQ原理解析-producer

1,启动流程

TIM_20181112163623

Producer如何感知要发送消息的broker(brokerAddrTable中的值是怎么获得的)?

  • producer本地集合中没有,会根据指定topic到namesrv获取TopicPublishInfo,并放入本地集合。
  • 定时从namesrv更新topic路由信息。

Producer与broker间的心跳

Producer定时发送心跳,将producer信息(其实就是procduer的group)定时发送到broker(brokerAddrTable集合中列出的)。

master接收消息,slave拷贝master

Producer发送消息,只发送到broker_master机器,通过broker的主从复制机制拷贝到broker_slave。

2,如何发送消息

producer轮询某topic下的所有queue的方式 实现发送方的负载均衡。

image

Topic下的所有队列如何理解?

Broker Topic queue 注册namesrv队列(Topic_A)
broker1 Topic_A queue0 , queue1 broker1_queue0 ,broker1_queue1
broker2 Topic_A queue0, queue2, queue3 broker2_queue0,broker2_queue1,broker2_queue2
broker3 Topic_A queue0 broker3_queue0

Producer如何实现轮询队列?

Producer从namesrv获得topic_A路由信息TopicPublishInfo。

//Topic_A的所有的队列
private List<MessageQueue> messageQueueList
//自增整型
private volatile ThreadLocalIndex sendWhichQueue
/**
  *选择一个发送队列
  *lastBrokerName不为空,代表上次选择的queue失败,本次避开同一个queue
  */
public MessageQueue selectOneMessageQueue(final String lastBrokerName){
  //计算队列下标
  //sendWhichQueue.getAndIncrement()每次调用+1
  Math.abs(sendWhichQueue.getAndIncrement()) % this.messageQueueList.size()
}

Producer发消息系统重试?

//消息发送失败重试次数默认为2
private int retryTimesWhenSendFailed = 2;
//发送消息超时时间
private int sendMsgTimeout = 3000;

发送失败,换个队列继续发送所需条件:

1. 重试次数不到retryTimesWhenSendFailed (默认2次)
2. 发送此条消息花费时间还没有到sendMsgTimeout (默认3000毫秒)

3,如何发送顺序消息

4,发送分布式事物消息

5,消息在broker落地之普通消息

6,消息在broker落地之事物消息

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
30天前
|
消息中间件 存储 数据库
RocketMQ 流数据库解析:如何实现一体化流处理?
RocketMQ 5.0 是一款云原生的消息中间件,旨在覆盖更多业务场景。它针对国内企业在数字化转型中面临的多场景消息处理需求,提供了一体化的解决方案。
111908 7
|
1月前
|
关系型数据库 MySQL Shell
CMake构建Makefile深度解析:从底层原理到复杂项目(三)
CMake构建Makefile深度解析:从底层原理到复杂项目
32 0
|
1月前
|
编译器 vr&ar C++
CMake构建Makefile深度解析:从底层原理到复杂项目(二)
CMake构建Makefile深度解析:从底层原理到复杂项目
35 0
|
30天前
|
存储 安全 编译器
【C++ 17 新功能 std::visit 】深入解析 C++17 中的 std::visit:从原理到实践
【C++ 17 新功能 std::visit 】深入解析 C++17 中的 std::visit:从原理到实践
70 0
|
26天前
|
安全 Java 数据安全/隐私保护
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
57 1
|
1天前
|
缓存 JavaScript 前端开发
|
2天前
|
SQL 分布式计算 资源调度
一文解析 ODPS SQL 任务优化方法原理
本文重点尝试从ODPS SQL的逻辑执行计划和Logview中的执行计划出发,分析日常数据研发过程中各种优化方法背后的原理,覆盖了部分调优方法的分析,从知道怎么优化,到为什么这样优化,以及还能怎样优化。
|
2天前
|
Java
并发编程之线程池的底层原理的详细解析
并发编程之线程池的底层原理的详细解析
11 0
|
2天前
|
JSON Java Maven
Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析
Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析
7 0
Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析
|
2天前
|
前端开发 JavaScript 编译器
深入解析JavaScript中的异步编程:Promises与async/await的使用与原理
【4月更文挑战第22天】本文深入解析JavaScript异步编程,重点讨论Promises和async/await。Promises用于管理异步操作,有pending、fulfilled和rejected三种状态。通过.then()和.catch()处理结果,但可能导致回调地狱。async/await是ES2017的语法糖,使异步编程更直观,类似同步代码,通过事件循环和微任务队列实现。两者各有优势,适用于不同场景,能有效提升代码可读性和维护性。

推荐镜像

更多