gpt4 book ai didi

multithreading - Amazon SQS 处理监听器的更好方式

转载 作者:行者123 更新时间:2023-12-04 04:28:01 24 4
gpt4 key购买 nike

我有一个 SQS 队列,其中有很多消息(通常有数千条)。目前,我有多个监听器(由从同一源创建的线程创建),每个监听器都监听队列并接收消息。一旦监听器从队列中收到消息,该监听器就会从队列中删除该消息。只有从队列中删除消息后,消息才会被处理。我的可见性超时为 30 秒。

我没有使用任何锁或任何东西来处理重复项,因为我会在收到消息后立即从队列中删除消息。直到现在我还没有看到口是心非的案例,但我只是担心它可能会出现。

现在的问题是,以这种方式拥有多个监听器还是在单个线程中监听队列,然后启动新线程来处理您收到的每条消息,哪种方法更好?

最佳答案

首先,有必要理解消息不可见超时的概念。

当从 Amazon SQS 队列中检索到一条消息时(例如,通过您的线程),该消息在 Amazon SQS 中被标记为不可见。最佳做法是让您的线程处理消息,然后在完成消息处理后删除消息。这样,如果线程失败,消息将自动再次在队列中可见,另一个线程可以处理它。

在您当前的应用程序设计中,如果线程失败,则消息将丢失并且不会重试。您应该考虑更改您的代码,以便仅在消息处理完毕后删除消息。

建议使用多线程来处理消息,因为这样可以通过并行处理消息来实现更高的消息吞吐量。这也是一个更简单的设计,简单总是最好的。让一个进程检索消息然后触发线程来处理消息的替代想法更加复杂,并且不会提供任何好处。

Amazon SQS 队列偶尔会多次返回相同的消息。这种情况很少见,但可能会发生。多线程设计可能会导致它比单线程设计发生得更多,因为多个线程可能同时检索相同的消息。但是,它仍然可能在单线程模型中发生

如果担心处理同一条消息两次,请考虑使用 FIFO queue (目前并非在每个 AWS 区域都可用)。这将保证每条消息只被接收一次。或者,您的代码需要检查特定消息是否已被处理(例如,通过检查数据库)。

多线程设计还允许您通过让多个系统(甚至跨多个可用区)处理消息来横向扩展,而您的单线程设计具有单点故障并且是可扩展性较差。

关于multithreading - Amazon SQS 处理监听器的更好方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44839683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com