RocketMq总结

本文是对RocketMq的全面总结,涵盖了如何使用RocketMq,包括下载配置、生产者和消费者创建;RocketMq的部署结构与各组件(NameServer、Broker、Producer和Consumer)的功能;以及在实际生产中遇到的消息不丢、不重、顺序消费等问题及其解决方案。
摘要由CSDN通过智能技术生成

RocketMq总结


前言

rocketMq的学习总结,内容包括,如何使用,部署架构,各部分功能,各部分工作流程,关键功能的实现原理,mq实际问题解决原理
提示:以下是本篇文章正文内容,下面案例可供参考

一、怎么使用

1.下载解压改配置启动,控制台创建主题或命令创建主题
2.生产者

创建不同类型的消息,使用同步或异步发送,同步可靠,效率比异步低10%左右,但是因为网络抖动broker突然断电都会丢失消息。如果生产者不关心消息的消费结果,可以使用单向消息。如果关注发送结果,需要使用事务消息来保证生产者一定将消息成功发送到了broker。如果消息是幂等的,那不用事务消息也行,重新发。
消息的类型有:普通、延时、事务、顺序、广播消息
顺序消息分全局有序和分区有序、广播消息是客户端的消费方式,广播消费,每个消费组的每个实例都消费一次,广播模式不支持顺序消息,消费进度保存在客户端。生产者支持重试,并可以容错(消息发送时选择活着的延迟最小的broker),延时消息是生产之后过多久才能消费。延时消息18个level

3.消费者

设置消费模式为集群模式或广播模式。生产者负责保证消息发送并成功持久化到broker中,消费者根据消费点位控制消费进度。可以通过控制台来重放消息,重放时间最长不超过broker消息保存时间。消费有pull和push两种,push模式是通过长轮询实现的,pull的消费点位保存在客户端。消费者组实例变化会触发重平衡,重平衡根据不同的分配策略进行。平均、环形、一致hash、就近机房、指定机房、自定义。消费者订阅主题-topic

二、部署结构和功能

1.NameServer

保存主题和broker对应的路由信息,各自独立无通信,检查broker变化更新路由信息。接受broker心跳,10秒扫描检查一次未发心跳的broker,2分钟没有心跳就删除。功能类似zookeeper,没有zookeeper复杂,只要不全部崩溃不影响服务。

1.Broker

与所有NameServer建立长连接,每30秒向所有NameServer发一次心跳,注册自己。负责接收生产者消息并保存消息,供消费者消费。支持单主,多主,多主多从部署模式,主从同步可采用同步复制或异步复制。消息用尾部追加方式持久化到CommitLog文件中,并通过MessageQueue、IndexFile文件作为索引文件。持久化采用先写入PageCache再同步或异步刷入CommitLog中,如果是异步刷盘,可采用读写分离方式,即写入直接内存,再转存入PageCache中再刷盘。读还是直接读PageCache。每隔一段时间定时任务扫描所有处于Half的事务消息,回查Producer。每10秒扫描一次生产或消费者心跳,如果2分钟没有心跳,删除生产或消费者。采用0拷贝,顺序写尾部追加,提高读写速度。默认的是ASYNC_FLUSH异步刷盘。定时清除过期消息commitlog messagequeue indexfile

1.Producer

生产者随机与一个NameServer建立长连接,每30秒取一次broker路由信息,根据路由信息与所有Broker建立长连接。生产者生产不同的消息类型,使用同步或异步发送消息。事务消息是先发Half消息,消费者无法消费。再执行自己的事务内容,之后再发commit请求,完成事务消息发送。

1.Consumer

随机与一个NameServer建立长连接,每30秒取一次Broker信息,最多30秒可以感知到Broker离线,与订阅主题的每个Broker建立长连接,根据消费模式消费消息,分配方式多种,比如平均分配消息。消费完成向Broker提交结果更新消费位点。广播消息的消费位点保存在消费者本地。

三、生产实际问题

1.如何保证消息不丢

不同场景对消息丢失的容忍度不同,幂等是非常重要的,如果不是幂等消息,生产者可以使用事务消息保证一定生产成功。即使broker突然断电,网络故障,事务消息依然可以保证消息一定保存到了broker。或者通过发送状态来控制,发送后拿到结果更新状态,未拿到结果,查询消息。broker采用多主多从,同步复制保证集群数据一致。采用同步刷盘保证持久化成功。消费位点机制保证客户端至少消费一次。生产者客户端有消息重发,和容错机制。消息可以重放。只要是幂等消费,就可以采用异步复制 异步刷盘,异步发送,读写分离,提升性能。

2.如何保证消息不重

幂等幂等还是幂等。如果不是幂等,生产者需要通过业务状态控制发送最多只发送一次,并且保证发送成功持久化成功。消费者需要做到最多消费一次,采用集群消费模式,假如发生重平衡宕机恢复,很可能导致重复消费,可以用状态或者去重表悲观乐观锁解决。

3.顺序消费

全局有序代价很大,需要保证只有一个分区,单线程同步顺序发送。采用分区有序,根据编号%队列size来保证同一个编号永远发到同一个队列,单线程同步发送。顺序越严格性能越低。大部分场景都不是严格要求顺序的。

4.导致消息丢失的环节

生产者:网络抖动断电宕机,broker采用异步或读写分离同步和持久化,磁盘突然损坏。
消费者:

5.如何实现幂等

幂等就是可以重复执行接收消息的业务代码。
如果是数据库,可以使用主键或唯一索引,此时抛出数据库异常
可以用去重表,redis,内存等办法,记录一个消息的标志,再来就知道已经消费过。可以用乐观锁 悲观锁控制并发情况。在执行操作前先查询,再操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值