Amazon web services 当我试图从两个不同的终端选项卡轮询相同的Amazon SQ时,我在这两个选项卡中都没有得到相同的消息

Amazon web services 当我试图从两个不同的终端选项卡轮询相同的Amazon SQ时,我在这两个选项卡中都没有得到相同的消息,amazon-web-services,message-queue,amazon-sqs,amazon-sns,long-polling,Amazon Web Services,Message Queue,Amazon Sqs,Amazon Sns,Long Polling,我创建了一个亚马逊SNS主题。我有一个Amazon SQS队列订阅了该主题 我创建了一个默认的SQS队列,而不是FIFO队列 我使用sqs消费者API对sqs队列进行长时间轮询 当我通过执行node sqs_client.js从单个终端运行这段js文件时,一切都正常工作,消息以正确的顺序发送 但是,如果打开另一个终端窗口并运行节点sqs_client.js,则传入消息的顺序将变得非常随机。新消息可能以任何顺序出现在第一个终端窗口或第二个终端窗口中 为什么会这样?有没有办法防止这种情况发生,以便我

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

我创建了一个默认的SQS队列,而不是FIFO队列

我使用sqs消费者API对sqs队列进行长时间轮询

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

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

为什么会这样?有没有办法防止这种情况发生,以便我可以同时在两个终端窗口中获得相同的消息。

SQS产品页面位于:

问:AmazonSQS是否提供消息订购

对。FIFO先进先出队列在 发送和接收哪些消息。如果使用FIFO队列,则 不必在消息中放置顺序信息。更多 有关详细信息,请参阅AmazonSQS开发人员指南中的FIFO队列逻辑

标准队列提供了一种松散的FIFO功能,可以尝试 保留消息的顺序。但是,因为标准队列是 设计为使用高度分布式的 在体系结构中,按照消息发送的确切顺序接收消息是非常重要的 不能保证


您是否使用了标准队列,从而失去了FIFO?

您会问:有没有办法……我可以同时在两个终端窗口中获得相同的消息

这不是Amazon SQS的运作方式。Amazon SQS的一般流程为:

消息被发送到队列 消息在队列中的时间最多可延长14天 消费者拨打ReceiveMessages,一次最多需要10条信息 当收到消息时,它被标记为不可见 消费者处理完消息后,会调用DeleteMessage从队列中删除消息 如果使用者未在不可见超时期间调用DeleteMessage,则该消息将重新出现在队列上,并可供使用者接收 因此,消息一次仅对一个消费者可用。一旦抓取了一条消息,其他消费者就无法接收该消息


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

我没有使用FIFO队列。但是,我觉得问题在于我对SQS的总体理解,而不是FIFO体系结构。您好,John Rotenstein,您完全理解我的问题。值得称赞的是:-。谈到我的体系结构,在我的后端服务器代码中,我将消息发布到SNS主题。SNS主题将此队列作为端点。在我的前端代码中,我长时间轮询队列。有没有其他方法可以让多个消费者同时获得相同的消息?使用Amazon SQS的唯一方法是让Amazon SNS将消息发送到两个Amazon SQS队列。然后,每个使用者将从自己的队列中读取数据。但是,不能保证每个人都能在同一时间收到相同的消息。或者,Amazon SNS可以向HTTP端点发送消息,这样它可以触发您的程序,而不是您的程序轮询队列。它可以同时发送到多个端点。这是一种推送架构,而不是拉/轮询架构。嗨@John Rotenstein:你的目标实现得很好。谢谢。如果您确实觉得我的问题有一些有意义的价值,而不是盲目地从现有问题中复制粘贴,请随时投票。
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();