当我尝试从两个不同的终端选项卡轮询相同的 Amazon SQS 时,我在两个选项卡中都没有收到相同的消息

Duk*_*ver 3 message-queue amazon-sqs amazon-web-services long-polling amazon-sns

我创建了一个 Amazon SNS 主题。我有一个订阅该主题的 Amazon SQS 队列。

我创建了一个默认的 SQS 队列(不是 FIFO 队列)。

我正在使用sqs-consumerAPI 来长轮询队列SQS

const app = Consumer.create({
    queueUrl: 'https://sqs.us-east-2.amazonaws.com/xxxxxxxxxxxx/xxxxxxxxxxx',
    handleMessage: async (message) => {

        console.log(message);
    },
    sqs: sqs//new AWS.SQS({apiVersion: '2012-11-05'})
});

app.on('error', (err) => {
    console.error(err.message);
});

app.on('processing_error', (err) => {
    console.error(err.message);
});

app.on('timeout_error', (err) => {
    console.error(err.message);
});

app.start();
Run Code Online (Sandbox Code Playgroud)

当我js通过执行以下操作从单个终端运行这段文件时node sqs_client.js,一切都工作得很好,消息也按正确的顺序发送。

但是,如果打开另一个终端窗口并运行node sqs_client.js,则传入消息的顺序变得非常随机。较新的消息可能以任何顺序进入第一终端窗口或第二终端窗口。

为什么会这样呢?有什么方法可以防止这种情况,以便我可以同时在两个终端窗口中收到相同的消息。

Joh*_*ein 5

您问:“有什么办法......我可以同时在两个终端窗口中收到相同的消息。”

这不是 Amazon SQS 的运作方式。Amazon SQS的大致流程是:

  • 消息被发送到队列
  • 消息在队列中最多保留 14 天(可以延长)
  • 一位消费者致电ReceiveMessages(),一次请求最多 10 条消息
  • 收到消息后,将其标记为不可见
  • 当消费者处理完消息后,消费者调用DeleteMessage()从队列中移除消息
  • 如果消费者在不可见超时期限没有调用,消息将重新出现在队列中并可供消费者接收。DeleteMessage()

因此,消息有意一次仅可供一个消费者使用。一旦消息被抓取,其他消费者就无法接收该消息。

如果您的要求是两个消费者接收相同的消息,那么您将需要重新设计您的架构。您没有提供足够的详细信息来推荐特定方法,但选项包括使用多个 Amazon SQS 队列或直接通过 Amazon SNS 而不是 Amazon SQS 发送消息。