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

Reply via email to