Apache RocketMQ简介

  1. Apache RocketMQ简单介绍
  • 是一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式特点。 Producer、Consumer队列都可以分布式。
  • Producer向一些队列轮流发送消息,队列集合称为 Topic,Consumer
    如果做广播消费,则一个consumer实例消费这个Topic 对应的所有队列,如果做集群消费,则多个Consumer实例平均消费这个topic对应的队列集合。(默认是集群消费)
  • 能够保证严格的消息顺序(因为性能原因,不能保证消息不重复,因为总有网络不可达的情况发生,需业务端保证)。 提供丰富的消息拉取模式 。

顺序消息扩容的过程中,如何在不停写的情况下保证消息顺序?
a. 成倍扩容,实现扩容前后,同样的key,hash到原队列,或者hash到新扩容的队列;
b. 扩容前,记录旧队列中的最大位点;
c. 对于每个Consumer Group,保证旧队列中的数据消费完,再消费新队列,也即:先对新队列进行禁读即可;

造成消息重复的根本原因是:网络不可靠。只要通过网络交换数据,就无法避免这个问题。所以解决这个问题的办法就是绕过这个问题。那么问题就变成了:如果消费端收到两条一样的消息,应该怎样处理?
a. 消费端处理消息的业务逻辑保持幂等性;
b. 保证每条消息都有唯一编号且保证消息处理成功与去重表的日志同时出现。
通过幂等性,不管来多少条重复消息,可以实现处理的结果都一样。再利用一张日志表来记录已经处理成功的消息的ID,如果新到的消息ID已经在日志表中,那么就可以不再处理这条消息,避免消息的重复处理。

  • 高效的订阅者水平扩展能力
  • 实时的消息订阅机制
  • 亿级消息堆积能力

分布式消息系统中,如何对消息进行重放?
消费位点就是一个数字,把Consumer Offset改一下就可以达到重放的目的了。

  • 较少的依赖
  1. Apache RocketMQ相关概念
    在这里插入图片描述
  • Name Server : 它是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。
  • Broker:Broker部署相对复杂, Broker分为Master与Slave, 一个Master可以对应多个Salve, 但是一个Slave只能对应一个Master, Master与Slave的对应关系通过指定相同的BrokerName和不同的BrokerId来定义,BrokerId为0表示Master, 非0表示Slave。Master也可以部署多个。每个Broker与Name Server集群中的所有节点建立长连接,定时注册Topic信息到所有的Name Server。
  • Consumer:Consumer与Name Server集群中的一个节点(随机选择,但不同于上一次)建立长连接,定期从Name Server获取Topic路由信息,并向提供Topic的Master、Slave建立长连接,且定时向Master、Slave发送心跳。
  • Producer:Producer与Name Server集群中的其中一个节点(随机选择,但不同于上一次)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master建立连接,且定时向Master发送心跳。
  1. Apache RocketMQ与Kafka的区别
  • 性能对比
    Kafka单机写入TPS约在百万条/秒,消息大小10个字节。
    RocketMQ单机写入TPS单实例约7万条/秒,单机部署3个Broker,可以跑到最高12万条/秒,消息大小10个字节
  • 消息投递实时性
    Kafka使用短轮询方式,实时性取决于轮询间隔时间
    RocketMQ使用长轮询,同Push方式实时性一致,消息的投递延时通常在几个毫秒。
  • 消费失败重试
    Kafka消费失败不支持重试
    RocketMQ消费失败支持定时重试,每次重试间隔时间顺延
  • 严格的消息顺序
    Kafka支持消息顺序,但是一台Broker宕机后,就会产生消息乱序
    RocketMQ支持严格的消息顺序,在顺序消息场景下,一台Broker宕机后,发送消息会失败,但是不会乱序。
  • 定时消息
    Kafka不支持定时消息
    支持定时消息
  1. 安装Apache RocketMQ

unzip rocketmq-all-4.5.2-bin-release.zip

  1. 启动Apache RocketMQ
  • 进入到Apache RocketMQ目标bin目录下

cd rocketmq-4.5.2/bin/

  • 启动Name Server

nohup sh bin/mqnamesrv &
tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success…
在这里插入图片描述

  • 启动Broker

nohup sh bin/mqbroker [-n localhost:9876] [-c conf/broker.conf] &
tail -f ~/logs/rocketmqlogs/broker.log
The broker[%s, 172.30.30.233:10911] boot success…

  • 关闭Apache RocketMQ

sh bin/mqshutdown broker
sh bin/mqshutdown namesrv
在这里插入图片描述
在这里插入图片描述

  • 常见问题

a. 如果报内部不足, 请修改bin目录下的runbroker.sh和runserver.sh两个文件中的JVM配置(默认都是使用8G内存)

  1. 常用的broker.conf文件配置。(其他的配置项可参考:https://www.cnblogs.com/zhyg/p/10255656.html)
#RocketMQ集群名称, 名称相同表示同一个集群
brokerClusterName = SJB_MQ_CLUSTER
#broker名称,名称相同表示在同一个集群内的同一组主从中
brokerName = broker-1
#0表示Master;  大于0表示Slave;不能是负数
brokerId = 0
#broker的角色。可以设置成以下三个角色。
## 1. ASYNC_MASTER 异步复制Master
## 2. SYNC_MASTER  同步复制Master
## 3. SLAVE 从
brokerRole = ASYNC_MASTER
#name server地址和端口,多个name server地址和端口用分号隔开
namesrvAddr=192.168.6.166:9876;192.168.6.167:9876
#broker的服务地址。这个配置可解决多网卡时,发送消息走外网的问题, 这里根据业务场景配上内网或外网的ip即可解决。
brokerIP1=192.168.6.167
#开启属性过滤
enablePropertyFilter=true
#磁盘文件空间充足情况下,默认每天什么时候执行删除过期文件,默认04表示凌晨4点
deleteWhen = 04
#文件保留时间,默认72小时,表示非当前写文件最后一次更新时间加上fileReservedTime小与当前时间,该文件将被清理
fileReservedTime = 48
#将数据保存到硬盘(即:刷盘)的方式。可以设置成以下两种
## 1. ASYNC_FLUSH 异步方式
## 2. SYNC_FLUSH  同步方式
flushDiskType = ASYNC_FLUSH
#在发送消息时,主体在一个broker上创建队列数量
defaultTopicQueueNums=8
#是否允许broker自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=false
#是否允许broker自动创建订阅组(即消费组),建议线下开启,线上关闭
autoCreateSubscriptionGroup=false
#broker对外服务的监听端口,默认10911
listenPort=10911
#单个ConmmitLog文件大小,默认1G大小
mapedFileSizeCommitLog=1073741824
#单个ConsumeQueue文件大小,默认30W条, 表示单个ConsumeQueue文件中存储30W个ConsumeQueue条目, 根据业务调整
mapedFileSizeConsumeQueue=1000000
checkTransactionMessageEnable=false
#服务端处理消息发送线程池数量。默认1
sendMessageThreadPoolNums=80
#消息存储到commitlog文件时获取锁类型,如果为true使用ReentrantLock,否则使用自旋锁
useReentrantLockWhenPutMessage=true
#服务端处理消息拉取线程池线程数量 默认为16加上当前操作系统CPU核数的两倍.
pullMessageThreadPoolNums=32
#borker启动的时候自动创建默认轨迹topic
traceTopicEnable=true
#在清除过期文件时,如果该文件被其他线程所占用(引用次数大于0,比如读取消息),此时会阻止此次删除任务,同时在第一次试图删除该文件时记录当前时间戳,而该参数表示表示第一次拒绝删除之后能保留的最大时间,在此时间内,同样可以被拒绝删除,同时会将引用减少1000个,超过该时间间隔后,文件将被强制删除。默认120秒
destroyMapedFileIntervalForcibly=120000
#重试删除文件间隔,配合destorymapedfileintervalforcibly
redeleteHangedFileInterval=120000
#commitlog目录所在分区的最大使用比例,如果commitlog目录所在的分区使用比例大于该值,则触发过期文件删除
diskMaxUsedSpaceRatio=88
#broker存储目录,默认为用户的主目录/store
storePathRootDir=/app/data/rocketmq/data
#CommitLog存储目录, 默认为${storePathRootDir}/commitlog
storePathCommitLog=/app/data/rocketmq/data/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/app/data/rocketmq/data/consumerqueue
#消息索引存储路径
storePathIndex=/app/data/rocketmq/data/index
#checkpoint 文件存储路径
storeCheckpoint=/app/data/rocketmq/data/checkpoint
#abort 文件存储路径
abortFile=/app/data/rocketmq/data/abort
#允许的最大消息体,默认4M
maxMessageSize=2097152
#发送队列等待时间。清除发送线程池任务队列的等待时间。如果系统时间减去任务放入队列中的时间小于waitTimeMillsInSendQueue,本次请求任务暂时不移除该任务。
waitTimeMillsInSendQueue=3000
#putMessage锁占用超过该时间,表示PageCache繁忙,并向客户端抛出该异常。默认1秒
osPageCacheBusyTimeOutMills=5000
#一次刷盘至少需要脏页的数量,针对CommitLog文件,默认4页
flushCommitLogLeastPages=12
#一次刷盘至少需要脏页的数量,默认2页,针对Consume文件
flushConsumeQueueLeastPages=6
#CommitLog两次刷盘的最大间隔,如果超过该间隔,按照fushCommitLogLeastPages要求直接执行刷盘操作。默认10000
flushCommitLogThoroughInterval=30000
#Consume两次刷盘的最大间隔,如果超过该间隔,将忽略。默认60000
flushConsumeQueueThoroughInterval=180000
  1. Apache RocketMQ要开放的端口
  • 9876
  • 10909
  • 10911
  1. 常见问题
  • 同一个消费集群一定要有相同的Tag Filter(过滤规则), 否则, 会以最后一个Broker的配置作为当前消费Group的最终配置。
  • Topic的名称是严格区分大小写的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值