GitHub user JanYork closed a discussion: In nodejs, the SimpleConsumer receive 
method cannot guarantee that messages are obtained in order?

my consumer code:

```js
require('module-alias/register');

import { SimpleConsumer } from '@/consumer';

const consumer = new SimpleConsumer({
  consumerGroup: 'checkout-group',
  endpoints: '192.168.1.162:8081',
  subscriptions: new Map().set('checkout-topic-fifo', '*'),
  requestTimeout: 3000,
  awaitDuration: 30000 // long polling
});

console.log('checkout:consumer init success!');

const isShutdown = false;

async function startAndConsumeMessages() {
  try {
    await consumer.startup();
    console.log('checkout:consumer startup success!');

    async function consumeMessages() {
      try {
        const messages = await consumer.receive(10);

        if (messages.length > 0) {
          console.log('got %d messages', messages.length);

          for (const message of messages) {
            console.log('body=%o', message.body.toString());
            await consumer.ack(message);
          }
        } else {
          console.log('No messages received, waiting...');
        }
      } catch (error) {
        console.error('An error occurred:', error);
      } finally {
        console.log('checkout:waiting for messages...');

        if (!isShutdown) {
          await consumeMessages();
        }
      }
    }

    await consumeMessages();
  } catch (error) {
    console.error('An error occurred:', error);
  } finally {
    // ...
  }
}

startAndConsumeMessages().catch(console.error);
```

my producer code:

```js
require('module-alias/register');

import { Producer } from '@/producer';

const fifoProducer = new Producer({
  endpoints: 'localhost:8081'
});
console.log('checkout:simpleProducer init success!');

(async () => {
  fifoProducer.startup().then(async () => {
    console.log('checkout:simpleProducer startup success!');

    for (let i = 1; i <= 10; i++) {
      await fifoProducer.send({
        messageGroup: 'checkout-group',
        topic: 'checkout-topic-fifo',
        tag: 'checkout',
        keys: ['checkout-key'],
        body: Buffer.from(i.toString())
      });

      console.log('message %d sent', i);
      console.log('checkout:send message success!');
    }

    process.exit(0);
  });
})();
```

Producer execution log:
```
message 1 sent
checkout:send message success!
message 2 sent
checkout:send message success!
message 3 sent
checkout:send message success!
message 4 sent
checkout:send message success!
message 5 sent
checkout:send message success!
message 6 sent
checkout:send message success!
message 7 sent
checkout:send message success!
message 8 sent
checkout:send message success!
message 9 sent
checkout:send message success!
message 10 sent
checkout:send message success!
```

Consumer execution log:
```
checkout:consumer startup success!
got 10 messages
body='2'
body='3'
body='4'
body='5'
body='6'
body='7'
body='8'
body='9'
body='10'
body='1'
checkout:waiting for messages...
```

It seems that this situation only occurs when the consumer obtains messages for 
the first time after startup. The order of monitoring messages thereafter is 
consistent.

Isn't the receive method an atomic method? My Topic type is FIFO, and my 
messages are produced to the same group in order, but the receive method does 
not guarantee the order when it gets the message for the first time after the 
consumer starts, and only the first message does this.

GitHub link: https://github.com/apache/rocketmq/discussions/8113

----
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