【番外】Springboot集成推荐配置及十问RocketMQ

文章目录

  • Springboot推荐配置方式
  • 十问
    • 1. 为什么springboot系统集成只有一个producer,并集成到RocketMQTemplate里面?
    • 2. 为什么consumer必须要再额外使用一个MessageListener来处理消息?
    • 3. 一个系统只用一个producer和consumer可不可行?对比多个producer/consumer使用起来有什么差异?
    • 4. Pull和Push的consumer差异?
    • 5. TransactionProducer和DefaultProducer的差异和关系?
    • 6. 消费群组要保持统一的消费行为和策略具体指的是什么?能否一个组里使用事务消息、另一个使用顺序消息等?
    • 7. 官方不建议同一个组内订阅同一个topic的不同tag?
    • 8. 什么情况下MQ会丢失消息?
    • 9. 顺序消息是如何实现的?如果更改了队列数量会有什么影响?
    • 10. 广播消费模式时如果某个服务是双机是否会对同一个消息处理两次?

如果要解答rocketMQ的相关问题,一定要区分rocketMq的版本,4.X和5.0实现差异比较大,很多实现原理是使用方式都有很大的变化。以下解答仅使用于4.7.1版本。

Springboot推荐配置方式

RocketMq集成到Springboot项目中官方提供的starter包非常的简单高效,但很多项目其实还是用着Spring的方式去集成,虽然效果差不多,但如果每个项目都使用老的配置方式,累计花的时间及重复的轮子也是需要考虑的。Springboot集成的推荐配置方式如下文:

Springboot推荐配置方式

十问

1. 为什么springboot系统集成只有一个producer,并集成到RocketMQTemplate里面?

springboot集成rocketMq时,仅提供实例化单个生产组的producer和对应的RocketMQTemplate,相当于官方鼓励一个系统仅使用一个生产组的producer;而consumer则是通过注解@RocketMQMessageListener来实现实例化,且实例化的类型为DefaultMQPushConsumer,如果要实现PullConsumer则需要开发者自定义实现。RocketMQ的生产者和topic是多对多的关系,支持同一个生产者向多个topic发送消息,对于生产者遵循够用即可,最大复用原则,因此只需要创建一个生产者,无需为每个主题都创建一个生产者,不建议频繁的创建和销毁生产者。而RocketMQTemplate顾名思义是官方包装了一层方法提供给开发者使用。

2. 为什么consumer必须要再额外使用一个MessageListener来处理消息?

通过@RocketMQMessageListener注册的消费者都是PushConsumer,而PushConsumer内部封装了ConsumeMessageService对象,实现类分别是随机消费ConsumeMessageConcurrentlyService和顺序消费ConsumeMessageOrderlyService,因此外部的DefaultMQPushConsumer只是封装了基础信息的封装类,真实的消费拉取消息逻辑在其他的类里面。而@RocketMQMessageListener注解则是提供消费者订阅topic所需的各种信息。

3. 一个系统只用一个producer和consumer可不可行?对比多个producer/consumer使用起来有什么差异?

一个系统只用一个producer是没问题的,并且这是官方建议的用法。而consumer则不一样,一个consumer只推荐消费同一个topic+tag组,因此如果一个系统要承担消费多个topic+tag组的职责,则需要创建多个consumer。

4. Pull和Push的consumer差异?

Push其本质也是Pull,只是官方做了一些封装,使用Reactor线程模型去Broker拉取消息缓存到本地,再交给MessageListener做随机或顺序消费。而Pull则是最原始的方式,拉取消息、提交消息等操作都需要开发者自行实现,适用于特殊业务制定的场景。

5. TransactionProducer和DefaultProducer的差异和关系?

TransactionProducer是DefaultProducer的子类,而TransactionListener则是TransactionProducer开放出来监听查询程序事务回调的接口,发送事务消息的方法也是继承自DefaultProducer,只是DefaultProducer的事务方法直接调用会抛异常,事务消息发送完将是UNKNOW状态,等带监听器的COMMIT/ROLLBACK。

6. 消费群组要保持统一的消费行为和策略具体指的是什么?能否一个组里使用事务消息、另一个使用顺序消息等?

消费群组要保持统一的消费行为指的是同一个消费组下面的消费者,其订阅的topic、tag要一样,且ConsumeMode和MessageModel都要保持一致,否则容易导致统一消费组的消费者消费的消息不一致或消息丢失。事务消息类型对消费者是不可知的,仅发生在生产者和Broker之间。顺序消息和并发消息才是对应的,如果两者真的同时存在,根据其实现原理推测,两个消费者都可以按照其配置进行消息,只是会存在消息消费处理不一致的情况,容易导致业务异常。

7. 官方不建议同一个组内订阅同一个topic的不同tag?

先说一个大前提:producer真的生产了这些tag的消息,且这些消息被分配到了topic下的各个队列中。如果tag不一致,如C1订阅了全的tag,而C2只订阅了其中一个,因为消息队列在同一个消费组中只会被一个consumer消费,那么C1可以消费分配到队列的所有消息,而C2却只能消费分配到队列的其中一个tag消息,被C2订阅的消息队列其它tag消息都会丢失!因此同一个消费组的topic+tag组需要一致,而不同消费组因为是重新分配消息队列了,因此又是一组新的topic+tag组关系。

8. 什么情况下MQ会丢失消息?

需要从两个方面入手:一、Master Broker宕机导致刷盘同步失败丢失,几率极小,一旦发生必丢失消息,且新的消息也无法发送,如果无法保证MQ集群的稳定性,业务则需要有降级的容错处理,如手动记录,并使用定时任务补偿,或牺牲吞吐量设置同步刷盘(不建议)。二、业务配置或消费不合理导致丢失,如topic+tag组配置不合理,消费者继续使用异步处理消息且没有处理异常情况的程序bug等也会导致消费了但消息丢失的情况。

9. 顺序消息是如何实现的?如果更改了队列数量会有什么影响?

如果通过RocketMqTemplate发送顺序消息,其使用的取模方法是取hash值再对队列数量取模,用这个来确定消息存放在哪个队列中。队列数量发生变化后,无论取模逻辑是什么,很难避免切换时消息发生乱序,唯一能做的便是在消费端做好消费乱序的降级处理,保证就算乱序消费对业务产生的影响也比较小。

10. 广播消费模式时如果某个服务是双机是否会对同一个消息处理两次?

广播模式下同一个消费组的所有消费者都会消费这条消息,和几机没有关系。如果存在双机系统,只需要其中的一台消费某条消息,就不应该设置成广播模式,而应该是集群模式,这样整个消费组集群则只会消费一次。如果另一个业务场景需要消费也只需要新创建一个消费组集群再去消费一次即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/45346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

非堆成加密SM2算法java实现

基于SM2算法的Java示例代码,展示了如何进行公钥加密、私钥解密、私钥签名和公钥验签。 非堆成加密公私钥使用学习请查看:非堆成加密公私钥使用-CSDN博客 RSA算法:非堆成加密RSA算法java实现-CSDN博客 代码示例 展示了以下步骤&#xff1a…

Xcode打包与发布全攻略:将你的应用带上App Store

标题:Xcode打包与发布全攻略:将你的应用带上App Store 在应用开发旅程的最后阶段,打包和发布流程是将应用呈现给用户的关键步骤。Xcode,作为iOS和macOS应用开发的官方工具,提供了一套完整的打包和发布机制。本文将详细…

图形化编程题库:Scratch图形化编程1~4真题及答案汇总

图形化编程题库全面覆盖Scratch编程学习,精心整理了从基础到进阶的1~4级真题及详尽答案汇总。无论您是Scratch编程初学者还是寻求提升的练习者,这里都能找到丰富的练习题资源,助力您通过实战加深理解,掌握图形化编程的精髓与技巧。…

Centos7 yum 报错「Errno 256」No more mirrors to try 解决方法

解决方案大致有三种 一、更新yum 二、若不行,可能是因为DNS不稳定吧,因为yum安装时会从三个”repo源“(base,extras,updates)随机获取地址 三、分析总结法 背景 我使用yum方式安装软件时,比…

在Qt C++项目中调用7z API实现压缩和解压

文章目录 在Qt C++项目中调用7z API实现压缩和解压前置条件步骤一:配置7z库下载7z源码编译7z库步骤二:在Qt项目中集成7z库创建Qt项目配置.pro文件添加7z头文件步骤三:实现压缩功能创建压缩函数调用压缩函数步骤四:实现解压功能创建解压函数调用解压函数结论参考Win11下编译…

如何高效去除论文中的AI痕迹?AI助手在此,为你指点迷津

试试这四款AI论文工具和降重技术! 在科研领域,AI写作工具如同新一代的科研利器,它们能够极大提高文献查阅、思路整理和表达优化的效率,本质上促进了科研工作的进步。AI写作工具不仅快速获取并整理海量信息,还帮助我们…

C++心决之stl中那些你不知道的秘密(string篇)

目录 1. 为什么学习string类? 1.1 C语言中的字符串 2. 标准库中的string类 2.1 string类 2.2 string类的常用接口说明 1. string类对象的常见构造 2. string类对象的操作 3.vs和g下string结构的说明 3. string类的模拟实现 3.2 浅拷贝 3.3 深拷贝 3.4 写…

基于springboot的鲜花管理系统

系统文档需要联系,白嫖勿扰

四大内网穿透利器对比

本文精选四款市场上的佼佼者——巴比达、花生壳、Frp及NatApp,详细剖析它们的特点与优势,助力企业和个人用户精准选择,其中特别强调了巴比达在企业级安全访问方面的突出贡献。 1. 巴比达 特点 深度安全防护:巴比达提供全方位安…

软设模式之状态模式

设计模式中状态模式的意图是:允许一个对象在其内部状态被改变时改变它的行为 打个比方,在一款即时战略游戏中设计一辆坦克,坦克有普通攻击状态,还有一防空状态。通过设计一个坦克抽象父类,再在下面设计一个具体坦克子…

一文带你入门机器学习超参数优化算法

专栏介绍 1.专栏面向零基础或基础较差的机器学习入门的读者朋友,旨在利用实际代码案例和通俗化文字说明,使读者朋友快速上手机器学习及其相关知识体系。 2.专栏内容上包括数据采集、数据读写、数据预处理、分类\回归\聚类算法、可视化等技术。 3.需要强调的是,专栏仅介绍主…

程序员的自我约束炼成记

自我约束,是一个人能否走向成功的关键,不知道你是否同意?搞编程10几年了,从来不觉得有什么了不起的,但可以不断自我更新,学习新技术,自我约束力起了很大的作用,对我而言,…

“南征北战”| 卓翼飞思技术领航,助力人工智能大赛上海赛区选拔赛圆满落幕

卓翼飞思继6月支持辽宁赛区选拔赛圆满收官后,近日再次技术助力,为上海赛区的比赛画上圆满句号。值得一提的是,在此次比赛中来自上海工程技术大学、同济大学、上海商学院、上海农林职业技术学院,使用卓翼飞思设备的5支参赛队伍&…

Monaco 使用 DefinitionProvider

DefinitionProvider 可以弹出方法定义,效果如下,按住 command 鼠标左键,弹出方法说明。 点击时 Monaco Editor 会调用注册函数,注册函数返回文件地址和需要显示的位置,实现代码如下 return monaco.languages.register…

参与开源项目的经验和收获

关于当前开源项目的发展趋势,我认为有以下几个显著的特点: 快速增长的参与度和社区规模:随着全球化和互联网的普及,开源项目的参与度和社区规模在快速增长。无论是大型企业还是个人开发者,都越来越倾向于参与开源项目…

#if defined(WEBRTC_USE_H264) webrtc.a的宏机制

#ifndef是 if not define的缩写,#ifdef 是 if define 的缩写。 define有两种,一种是单纯宏定义,一种是定义宏为特定值。 #define WEBRTC_USE_H264#defined WEBRTC_USE_H264 11.1定义值用作预处理: #define A 0

常见点云处理总结汇总

点云处理是一系列操作和技术,用于分析和处理三维点云数据,以提取有用的信息并生成可视化结果。以下是常见的点云处理方法及其简要说明: 1. 点云预处理 滤波:去除噪声和无效点,如使用统计滤波、半径滤波等。下采样&a…

浏览器插件:Simple Allow Copy 正在监视你的一举一动

插件简述 "Simple Allow Copy"是一款可以帮助用户突破网页复制限制的浏览器扩展。它特别适用于那些禁止复制粘贴的网站,如百度文库、豆丁文库等。使用这款插件,用户可以轻松复制网页上的内容,无需手动输入或使用OCR工具。 该插件截…

电子签章 签到 互动 打卡 创意印章 支持小程序 H5 App

电子签章 签到 互动 打卡 创意印章 支持小程序 H5 App 定制化

彻底搞懂前端跨域解决方案

目录 1浏览器的同源策略 1.1同源策略概述 1.2什么是源(origin)? 2跨域会受到哪些限制 2.1限制DOM访问 2.2限制Cookie访问 2.3限制Ajax获取数据 3几个注意点 4CORS 解决 Ajax 跨域问题 4.1CORS 概述 4.2CORS 解决简单请求跨域 4.…