关于rocketmq的consummer的处理message的具体细节

关于rocketmq的consummer的处理message的具体细节

老师你好:

https://img1.sycdn.imooc.com//climg/63fff675092044cf09270794.jpg

上面是OrderTimeout的代码。

下面是我的几个疑问,逐条描述。


1、rocketmq的消费者是能一下子消费topic下的多条message吗?为什么OrderTimeout入参可以是多个message,而返回值只有一个状态comumer.ComsumerResult,难道处理多个message也是必须同时成功同时失败的吗?


2、OrderTimeout中函数 首先是 for range 遍历这些多个message,但是for range里遇到error就直接return了,后面的message不处理了?


3、感觉如果说consummer处理多个message,必须是同时成功同时失败。上面的问题就可以解释了。总之就是对consummer能一下子处理多个message的这个流程不太了解,一下子选择接收多少个message?为什么不是只接收一个?接收多个message然后在代码中开协程处理这些message提高并发?


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

rocketmq的consumer本地会一直不停的从服务器拉取消息,即使是push_consumer也是拉取消息,消息一次会拉取多个的,如果还要继续深入的话需要看一下源码了

  • 努力学习啊啊 提问者 #1

        那这个for range 里遇到error 就直接return了算是项目写的bug吧。return了那不就直接跳过后面的message的处理了么。p.SendSync的时候出现了error就直接return ConsumeRetryLater了,这样会跳过for range 剩余的message处理。 那这样一下子拉多个message不就没意义了吗?

        老师能完善一下这块的代码吗?


        我感觉应该要先把for range里的message都处理完,然后针对那些出现error的message让rocketmq再重传。可是要不要重传不就是通过OrderTimeout的返回结果判断的吗,OrderTimeout又就只有一个返回结果,这个返回结果却代表了多个message的处理情况。自己点进去看看了rocketmq-client-go的源码,也是看的也云里雾里的。



    2023-03-03 16:31:55
  • 努力学习啊啊 提问者 #2

    还是说,假如一次取了10条消息,其中一条处理失败后return ConsumeRetryLater,这10条消息就不会被rocketmq的服务端删除,等待下一次被consumer消费?假如前9条message都成功就最后一个失败了,那这样处理效率不很低吗?

    2023-03-03 19:52:43
  • bobby 回复 提问者 努力学习啊啊 #3

    这个问题提的挺好的,这里如果msg中间出现了问题直接return会导致,后续的服务没有处理,但是数据是不会丢的,因为这里失败后,那么失败后的msg会重新从服务端拉取的,不会在本地就丢失了, 如果你希望处理多个后一次性提交 可以在for循环外进行return,可以参考 https://github.com/apache/rocketmq-client-go/blob/master/examples/consumer/simple/main.go,

    2023-03-06 09:38:30
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Go开发工程师全新版
  • 参与学习       489    人
  • 解答问题       559    个

风口上的技术,薪资水平遥遥领先,现在学习正值红利期! 未来3-5年,Go语言势必成为企业高性能项目中不可替代的语言 从基础到项目实战再到重构,对转行人员友好,真正从入门到精通!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师