GitHub user SweetAAAAAA created a discussion: RocketMQ 5.3.2 gRPC批量发送不同Tag、不同MessageId的消息,在接收时无法得到正确结果
## 场景 我使用的语言是 PHP,框架用的是 Hyperf,目前正在制作 RocketMQ 的SDK。 我发现 `SendMessageRequest` 可以批量发送消息,但尝试的过程中发现了这种无法获取正确结果的问题。 ## 复现流程 条件:通过gRPC访问RocketMQ的Proxy 1. 构造SendMessageRequest,在`messages`字段塞入三条不同Tag、不同MessageId的消息 2. 发送请求,服务端存储消息并且返回三条消息的MessageId 3. 构造ReceiveMessageRequest,消息过滤方式为Tag,表达式为 `*`,并发送请求 4. 服务端返回数据,此时三条消息的Tag和MessageId均为第一条消息的数据,问题就出现在这里 ## 个人研究 ### Client 的研究 我确保自己编写的Client生成了不同的MessageId,并且消息体指定的也是不同的Tag: <img width="566" height="329" alt="图片" src="https://github.com/user-attachments/assets/34958ad1-381d-4fef-b211-519b5413cd23" /> <img width="433" height="167" alt="图片" src="https://github.com/user-attachments/assets/aa9bdf2c-66c7-42b1-970a-f63578c6dc0c" /> <img width="863" height="362" alt="图片" src="https://github.com/user-attachments/assets/6604cc1a-e3f8-4a1c-9b60-dbd9fb709dc2" /> 同时抓包,确认 SendMessageRequest 和 SendMessageResponse: #### SendMessageRequest: 第一条 <img width="615" height="415" alt="图片" src="https://github.com/user-attachments/assets/7472f4b4-c83a-4717-b974-1e8014cfe234" /> 第二条 <img width="573" height="364" alt="图片" src="https://github.com/user-attachments/assets/e522a90c-6d77-4de0-84af-51472ba34e78" /> 第三条 <img width="592" height="400" alt="图片" src="https://github.com/user-attachments/assets/06f322fa-da76-4ed3-b051-0bebb7242ff1" /> #### SendMessageResponse: <img width="1202" height="356" alt="图片" src="https://github.com/user-attachments/assets/96b17028-2bd7-4f30-b5ff-a0221868cef4" /> 服务端确实返回了刚刚发送的 MessageId。 > 这里还有个疑问:如果 entries 字段给的就是 RepeatedField,那为什么不把返回的 messageId 分离成多个 entry 呢? 至此,发送过程看起来似乎是没有问题的,所以我再去看了一下 ReceiveMessageRequest 和 ReceiveMessageResponse: #### ReceiveMessageRequest <img width="702" height="485" alt="图片" src="https://github.com/user-attachments/assets/7dd35800-16a7-4637-8bd5-5d83b7c7e443" /> <img width="702" height="206" alt="图片" src="https://github.com/user-attachments/assets/8c0bdf25-6bff-40dc-8d90-17ae6aa98e70" /> #### ReceiveMessageResponse 第一条 <img width="769" height="512" alt="图片" src="https://github.com/user-attachments/assets/62b0528d-c221-4515-9a0f-ec4223adba32" /> 第二条 <img width="769" height="494" alt="图片" src="https://github.com/user-attachments/assets/baa22d80-5d02-446d-8b94-53b3444ff971" #/> 第三条 <img width="769" height="503" alt="图片" src="https://github.com/user-attachments/assets/7c231d6a-fc50-4c18-9bf7-2f4f573c3d71" /> 至此可以发现三条消息,有相同的 messageId 和 tag。 ### Server 端的研究 我先查找了一下 ReceiveMessage 这个方法,调用链如下: <img width="563" height="153" alt="图片" src="https://github.com/user-attachments/assets/de0ef824-df21-47cd-b337-6cd6ffcadd1b" /> 从 popMessage 那边回来的结果就是不对的,“监视”窗口那边的结果没有发生改变: <img width="617" height="378" alt="图片" src="https://github.com/user-attachments/assets/6928ae16-99dc-4434-a77b-77b4906363c2" /> 跟进一下 popMessage: <img width="580" height="255" alt="图片" src="https://github.com/user-attachments/assets/2b595582-b0e3-4ff8-af7e-ac59042ab411" /> 看到 Code,检查一下引用,发现到了 Broker 里面: <img width="1137" height="309" alt="图片" src="https://github.com/user-attachments/assets/dd0a2491-2ce1-418a-897d-fe82d636707c" /> 但是看了一下代码,好像没有对这个 UNIQ_KEY 进行操作的,但是全局搜索一下有个 [buildCkMsg](https://github.com/apache/rocketmq/blob/7ab7ddd6d25a2dac37e8bac899c5a73c4de2dbcb/broker/src/main/java/org/apache/rocketmq/broker/processor/PopMessageProcessor.java#L929) 有这个引用,然后看一下调用链,猜测有可能是消息存储时就有这个问题: <img width="1107" height="469" alt="图片" src="https://github.com/user-attachments/assets/175296ba-e1e5-462c-b5fa-b8ba470b9b16" /> GitHub link: https://github.com/apache/rocketmq/discussions/9646 ---- This is an automatically sent email for dev@rocketmq.apache.org. To unsubscribe, please send an email to: dev-unsubscr...@rocketmq.apache.org