Rocketmq原理简介

Rocketmq原理简介架构图模块职责划分 rocketmq common 通用的枚举 基类方法 或者数据结构 包名有 admin consumer filter hook message rocketmq remoting 使用 netty 的客户端 服务端 使用 fastjson 序列化 自定义二进制协议 rocketmq srvutil 只有一个 ServerUtil 类 只提供 Server 程序依赖 尽可能减少客户端依赖 rocketmq store 消息存储 索引 consumerLog commitLog 等 rock

架构图

Rocketmq原理简介

模块职责划分

  • rocketmq-common:通用的枚举、基类方法、或者数据结构,包名有admin、consumer、filter、hook、message
  • rocketmq-remoting:使用netty的客户端、服务端,使用fastjson序列化,自定义二进制协议
  • rocketmq-srvutil:只有一个ServerUtil类,只提供Server程序依赖,尽可能减少客户端依赖
  • rocketmq-store:消息存储,索引,consumerLog,commitLog等
  • rocketmq-client:消息发送和接收,包含consumer和producer
  • rocketmq-filtersrv:消息过滤器
  • rocketmq-broker:服务端,接受消息,存储消息,consumer拉取消息
  • rocketmq-tools:命令行工具
  • rocketmq-namesrv:NameServer,类似服务注册中心,broker在这里注册,consumer和producer在这里找到broker地址

运行源代码

it地址: https://github.com/apache/rocketmq.git

Rocketmq原理简介

运行配置

启动NameServer启动配置,配置下RocketHome

环境变量:ROCKETMQ_HOME=C:\codes\rocketmq-release-4.0.0-incubating

Rocketmq原理简介

启动Broke配置

broker的启动类为org.apache.rocketmq.broker.BrokerStartup,添加程序运行参数-n 127.0.0.1:9876 autoCreateTopicEnable=true即可运行broker服务,broker服务根据配置的9876端口会将自身信息注册到namesrv中。

Rocketmq原理简介

Rocketmq原理简介

RocketMq Console 搭建

git clone https://github.com/apache/rocketmq-externals.git

Rocketmq原理简介

编译 

$ mvn clean package -Dmaven.test.skip=true $ java -jar target/rocketmq-console-ng-1.0.0.jar #如果配置文件没有填写Name Server的话,可以在启动项目时指定namesrvAddr

运行

nohup java -jar rocketmq-console-ng-2.0.0.jar    –server.port=8090 –rocketmq.config.namesrvAddr=’localhost:9876′ &

RocketMq架构,特性,实例代码

rocketmq/docs/cn at master · apache/rocketmq · GitHub

RocketMq实现原理疑问

一个mq的重要概念一般有那些?

  producer,consumer,broker,partition,register center,rpc链接,序列化,数据持久化,rebalace

nameserver的作用是啥?

记录了Broke,topic,Queue的关系。

Topic和Queue,Broke 是什么样的关系,然后消息是如何发送和消费的?

1:一般来说订阅发布机制 只需要一个Queue就可以实现了,秉承着FIFO的原则,但是假如一个只有Queue,消费端的并发量就上不去,所以设计上就需要把消息分散到多个Queue上面去,然后consumer

消费对应的Queue,这样消费并发就上去了,然后把这一组Queue 就当做一个topic.

2:Broker就是存放Queue的服务,可以是多个topic的 Queue. 它们之间的关系是 一个topic对应多个Queue,然后Queue平均散落在broke上, 一个Broke至少有一个Queue.

在producer端发送消息的时候是需要指定 Topic, 然后按照某种策略发送到Queue, 一般一个Topic有默认4个Queue,然后就散落在broke上(假如有多个broke)。

3:消费的时候,consumer直接订阅的是queue,假如有4个queue,2个consumer它们会平分。然后去Queue所在的broke去消费。

是如何做持久化的?

Commitlog

rebalace是如何实现的?

通过nameserver,尽量做到平均。

问题记录

1:启动consumer连接 mq broke 但是ClientAddr 总是显示外网IP, 根据netty的测试结果,假如netty  client 用内网连接  netty server根据channel获取remoteAddress是内网,后面发现启动mqbroke的时候 -c broke.cnf 参数导致Rocketmq原理简介

判断消息对接

public
ConsumeConcurrentlyStatus consumeMessage(
//
List msgs,
//
ConsumeConcurrentlyContext context) {
long
offset = msgs.get(0).getQueueOffset();
String maxOffset =
//
msgs.get(0).getProperty(Message.
PROPERTY_MAX_OFFSET
);
long
diff = Long.
parseLong
(maxOffset) – offset;
if
(diff > ) {
//
TODO
消息堆积情况的特殊处理
}
Broker突然关掉:
一次 RocketMQ 进程自动退出排查经验分享(实战篇) – 中间件兴趣圈 – 博客园
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228851.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午6:03
下一篇 2026年3月16日 下午6:03


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号