yangjian102621 opened a new issue, #946:
URL: https://github.com/apache/rocketmq-client-go/issues/946
**BUG REPORT**
When i send some orderly message with producer, there are not in ordered
when the consumer pull the message.
**ENV**
- OS: Ubuntu22.04
- Golang Version: go1.17.10 linux/amd64
- rocketmq-client-go version: v2.1.1
- RocketMQ version: 4.9.4
**Producer code**
```go
p, err := rocketmq.NewProducer(
producer.WithNameServer(config.NameSrvAddr),
producer.WithGroupName(config.ProducerGroup),
producer.WithRetry(2),
)
if err != nil {
panic(err)
}
err = p.Start()
if err != nil {
panic(err)
}
for i := 0; i < 3; i++ {
orderId := strconv.Itoa(i)
for j := 0; j < 5; j++ {
msg := &primitive.Message{
Topic: config.Topic,
Body: []byte("Ordered Message Step -> " +
strconv.Itoa(j)),
}
msg.WithShardingKey(orderId)
res, err := p.SendSync(context.Background(), msg)
if err != nil {
fmt.Errorf("send message success: result=%s\n",
res.String())
continue
}
fmt.Printf("send message success: result=%s\n",
res.String())
}
}
// close producer
err = p.Shutdown()
if err != nil {
fmt.Printf("shutdown producer error: %s\n", err.Error())
}
```
**Consumer code**
```go
c, err := rocketmq.NewPushConsumer(
consumer.WithGroupName(config.ConsumerGroup),
consumer.WithNameServer(config.NameSrvAddr),
consumer.WithConsumerModel(consumer.Clustering),
consumer.WithConsumeFromWhere(consumer.ConsumeFromFirstOffset),
consumer.WithConsumerOrder(true),
)
if err != nil {
panic(err)
}
err = c.Subscribe(config.Topic, consumer.MessageSelector{}, func(ctx
context.Context,
msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) {
orderlyCtx, _ := primitive.GetOrderlyCtx(ctx)
logrus.Infof("orderly context: %v\n", orderlyCtx)
for i := range msgs {
logrus.Infof("Receive message: %s, orderId: %s",
msgs[i].Body, msgs[i].GetShardingKey())
}
return consumer.ConsumeSuccess, nil
})
if err != nil {
panic(err)
}
// Note: start after subscribe
err = c.Start()
if err != nil {
panic(err)
}
logrus.Info("Consumer Started.")
stop := make(chan os.Signal)
signal.Notify(stop, os.Interrupt, os.Kill)
select {
case <-stop:
err = c.Shutdown()
if err != nil {
fmt.Printf("shutdown Consumer error: %s", err.Error())
}
}
```
I expected the steps of the message for the same order to be in order, but
it's not actually
```
INFO[0003] Receive message: Ordered Message Step -> 2, orderId: 0
INFO[0003] Receive message: Ordered Message Step -> 1, orderId: 1
INFO[0003] Receive message: Ordered Message Step -> 0, orderId: 2
INFO[0003] Receive message: Ordered Message Step -> 4, orderId: 2
INFO[0003] Receive message: Ordered Message Step -> 1, orderId: 0
INFO[0003] Receive message: Ordered Message Step -> 0, orderId: 1
INFO[0003] Receive message: Ordered Message Step -> 4, orderId: 1
INFO[0003] Receive message: Ordered Message Step -> 3, orderId: 2
INFO[0003] Receive message: Ordered Message Step -> 3, orderId: 0
INFO[0003] Receive message: Ordered Message Step -> 2, orderId: 1
INFO[0003] Receive message: Ordered Message Step -> 1, orderId: 2
INFO[0003] Receive message: Ordered Message Step -> 0, orderId: 0
INFO[0003] Receive message: Ordered Message Step -> 4, orderId: 0
INFO[0003] Receive message: Ordered Message Step -> 3, orderId: 1
INFO[0003] Receive message: Ordered Message Step -> 2, orderId: 2
```
Some thing else is that i send orderly message with java SDK work OK, the go
client consumer could receive orderly message.
**Java SDK producer**
```java
ublic class OrderProducer {
public static void main(String[] args) throws Exception
{
DefaultMQProducer producer = new
DefaultMQProducer(Config.PRODUCER_GROUP_NAME);
producer.setNamesrvAddr(Config.NAME_SRV_ADDR);
producer.start();
for (int i = 1; i < 3; i++) {
int orderId = i;
for (int j = 1; j <= 5;j++){
Message msg = new Message(
Config.TOPIC,
"Order_"+orderId,
"KEY" + orderId,
("Order Step " +
j).getBytes(RemotingHelper.DEFAULT_CHARSET)
);
SendResult sendResult = producer.send(msg, new
MessageQueueSelector() {
@Override
public MessageQueue
select(List<MessageQueue> mqs, Message msg, Object arg) {
Integer id = (Integer) arg;
int index = id % mqs.size();
return mqs.get(index);
}
}, orderId);
System.out.printf("%s%n", sendResult);
}
}
// close producer
producer.shutdown();
}
}
```
The golang consumer client received ordered messages:
```
INFO[0000] Consumer Started.
INFO[0063] Receive message: Order Step 1, orderId: KEY2
INFO[0063] Receive message: Order Step 2, orderId: KEY2
INFO[0063] Receive message: Order Step 1, orderId: KEY4
INFO[0063] Receive message: Order Step 2, orderId: KEY4
INFO[0063] Receive message: Order Step 3, orderId: KEY4
INFO[0063] Receive message: Order Step 4, orderId: KEY4
INFO[0063] Receive message: Order Step 5, orderId: KEY4
INFO[0063] Receive message: Order Step 3, orderId: KEY2
INFO[0063] Receive message: Order Step 4, orderId: KEY2
INFO[0063] Receive message: Order Step 5, orderId: KEY2
INFO[0063] Receive message: Order Step 1, orderId: KEY1
INFO[0063] Receive message: Order Step 2, orderId: KEY1
INFO[0063] Receive message: Order Step 3, orderId: KEY1
INFO[0063] Receive message: Order Step 1, orderId: KEY3
INFO[0063] Receive message: Order Step 2, orderId: KEY3
INFO[0063] Receive message: Order Step 3, orderId: KEY3
INFO[0063] Receive message: Order Step 4, orderId: KEY3
INFO[0063] Receive message: Order Step 5, orderId: KEY3
INFO[0063] Receive message: Order Step 4, orderId: KEY1
INFO[0063] Receive message: Order Step 5, orderId: KEY1
INFO[0063] Receive message: Order Step 1, orderId: KEY5
INFO[0063] Receive message: Order Step 2, orderId: KEY5
INFO[0063] Receive message: Order Step 3, orderId: KEY5
INFO[0063] Receive message: Order Step 4, orderId: KEY5
INFO[0063] Receive message: Order Step 5, orderId: KEY5
```
I do not know what the matter is , i need help, thanks.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]