当前位置: 首页 > 知识库问答 >
问题:

Amazon SQS-轮询多线程上的多个队列

陆斌
2023-03-14

我正在使用他们的SQS队列服务为Amazon SES设置反弹、投诉和送货通知。

文档建议在轮询多个SQS队列时,在多个线程上进行轮询。使用长轮询时尤其如此,因为长轮询一个线程上的多个队列可能会导致轮询队列延迟来自不同队列的新消息。

因此,如果我想在我的ASP.NET MVC应用程序中轮询3个SQS队列,我是否应该像下面这样生成裸体线程:

 Thread bouncesThread = new Thread(() => 
 {
      IAmazonSQS sqsClient = AWSClientFactory.CreateAmazonSQSClient(RegionEndpoint.USWest2);
      while(true) 
      {
          //this will long-poll
          ReceiveMessageResponse receiveMessageResponse = sqsClient.ReceiveMessage(bouncesQueueRequest);

          ProcessQueuedBounce(receiveMessageResponse);
      }
 });

 bouncesThread.SetApartmentState(ApartmentState.STA);
 bouncesThread.Start();

或者是否有更好的方法来实现这一点,因为这是一个长时间运行的进程,并且应该在应用程序的长度内运行?是否应该使用iRegisteredObject

推荐的方法是什么?

共有1个答案

盖翰池
2023-03-14

这样做的“推荐”方法将根据您的用例和处理消息的瓶颈而有所不同。根据队列拆分为线程是防止SQS_QueueA被空SQS_QUEUEB阻塞的一个很好的开始。

您可能还希望:

  1. 为特定队列添加更多线程。例如,如果您有一个特别忙的sqs队列,您可能有多个线程从它接收消息。如果您对SQS有较高的延迟,这将是非常有益的。
  2. 将接收消息与处理消息分开-拥有一个单独的threadsafe队列用于保存ReceiveMessageResponse对象,然后拥有一个线程(或一组线程)专门负责处理该队列的结果。

结合以上内容,您可以根据哪一个是瓶颈分别扩展SQS轮询和结果处理。

如果您的线程正在做非常相似的事情(在本例中,轮询SQS队列并处理消息),那么您可能可以在这些线程之间共享部分或全部代码,将差异作为要传入的参数。

 类似资料:
  • 问题 你有一个线程队列集合,想为到来的元素轮询它们, 就跟你为一个客户端请求去轮询一个网络连接集合的方式一样。 解决方案 对于轮询问题的一个常见解决方案中有个很少有人知道的技巧,包含了一个隐藏的回路网络连接。 本质上讲其思想就是:对于每个你想要轮询的队列,你创建一对连接的套接字。 然后你在其中一个套接字上面编写代码来标识存在的数据, 另外一个套接字被传给 select() 或类似的一个轮询数据到达

  • 本文向大家介绍C#多线程处理多个队列数据的方法,包括了C#多线程处理多个队列数据的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#多线程处理多个队列数据的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 我是一个新手,但我真的很喜欢长轮询的想法。 在阅读了它之后,我会这样实现它: 客户端请求服务器(AJAX) 服务器正在轮询DB以获取更改 识别更改时或服务器响应超时后 我的问题是,对于每一个请求,都在服务器上启动一个线程,并且每个线程都轮询DB。 在服务器上运行一个接受所有传入请求的线程不是更有效吗?例如: 客户端请求服务器(AJAX) 服务器将请求添加到队列(无响应) 辅助线程轮询数据库以获取与

  • Nuttx工作线程(LP和HP)具有轮询间隔,仅针对工作线程0。我想知道为什么需要轮询间隔? 当有人将一个新工作排入工作队列时,将向一个辅助线程发出处理它的信号。如果所有工作线程都忙,则当线程完成当前工作并再次检查队列时,将处理排队的工作。 与sched_garbage_collection()工作一样,工作线程由sched_signal_free()发出信号。 那么当需要轮询间隔时会是什么情况呢

  • 问题内容: 等待(不旋转)直到两个(多处理)队列中的任何一个都可用的最佳方法是什么(两者都驻留在同一系统上)? 问题答案: 似乎还没有一种正式的方式来解决这个问题。或至少不是基于此: http://bugs.python.org/issue3831 您可以尝试类似本文所进行的操作-访问基础管道文件句柄: http://haltcondition.net/?p=2319 然后使用选择。

  • 问题内容: 我正在研究ajax长期轮询,但感到困惑。传统的ajax调用和长时间轮询有什么不同 此示例仅以递归方式调用服务器。与setInterval中的传统调用不同。 问题答案: 顾名思义,“ 长时间轮询” 意味着长时间轮询某些内容。 这是实际过程的开始,您对服务器上的某个脚本进行ajax调用,在本例中为,您需要使服务器脚本(例如)足够智能,以便仅在所需数据可用时才响应请求,该脚本应等待指定的时间