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

运行配置

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

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

启动Broke配置

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

RocketMq Console 搭建

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

编译 

$ 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 参数导致

判断消息对接

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 > 100000) {
// TODO 消息堆积情况的特殊处理
}
Broker突然关掉:
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值