本地搭了一个 RocketMQ 研究一下, 版本 5.0, 然后本地起了一个 SimpleCondumer 做拉取 pull, 一开始都挺正常的, 消息能正常推送, 然后客户端正常能拉取到
然后当我设置了 filter 之后就不对了, 我给客户端设置了一个特定的 tag 条件, 当这个 tag 值的消息生产后, 能正常消费, 但是如果是其他 tag 值的消息生产后, 奇怪的来了, 客户端日志显示没有接收到任何消息, 但是在 mq 那里显示消息已经被消费掉了
可以确定不是其他什么消费者把消息处理了, 因为如果这个客户端不启动, mq 可以看到消息一直是未处理状态, 客户端一启动, 未处理就是 0 了, 但是客户端接受消息也是 0 条, 那条消息到底怎么被消费掉了完全不知道
各位大佬有知道这是什么问题的吗?
1
onepunch 43 天前
|
2
yesterdaysun OP @onepunch 我就是按文档写的呀, 按我的理解, 我生产了一条 tag=t1 的消息, 然后我订阅 tag=t2 的消息, 这个消息不应该被消费者收到, 我也确实没有收到, 但是这条消息同时也应该留在队列里面, 不应该是被消费的状态, 但是我这里确实显示被消费了, 所以百思不得其解
|
![]() |
3
GooMS 43 天前 via Android
咱俩头像风格挺像的
|
4
Scarb 43 天前
你这个现象就是正常的啊,过滤不是说这个消息还会在未消费消息那里,而是拉取了之后不处理。
|
5
yesterdaysun OP @Scarb 好像有点理解了, 所有的消息会广播给所有的消费组, 但是组内会直接拉取全部并过滤, 所以如果我想要的是一部分消费 t1, 一部分消费 t2, 搞两个消费组就行, 我之前以为消息只回传一次, 一边消费完了就没有了, 其实如果新建消费组订阅的话, 消费位点会从 0 开始, 这样理解对吧
|
6
xiaofan2 43 天前
@yesterdaysun 你理解的不对 你可以理解为每个消费组都维护自己的消费进度 消费的过滤是在 broker 这里做的 而不是真正的到了你的消费者
|
7
l970090853 42 天前
原因是 RocketMQ 的消费者是全额拉取 topic 的消息,然后在本地过滤的。(不是该消费者配置 tag 的消息会被过滤掉)
比如只有 t1 ,t2 两条消息,则消费者拉取到[t1, t2]两条消息,过滤了后只剩 t1 一条消息,然后吐给你的 listener 处理。 |
![]() |
8
quan7u 42 天前
--“ 但是在 mq 那里显示消息已经被消费掉了”
mq 应该显示「消费但过滤」(消费组各自维护消费进度)这个你设置不同消费组消费不同的 tag 就能看出区别 |
![]() |
9
lingalonely 27 天前
对应你当前的消费者的确是消费了,过滤掉意味当前消费者不会再消费了,如果不是,那 offset 该怎么走
|