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

时间:2014-10-14 04:45:07

标签: c# asp.net asp.net-mvc multithreading amazon-sqs

我正在使用他们的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 个答案:

答案 0 :(得分:2)

执行此操作的“推荐”方式将根据您的使用案例以及处理邮件的瓶颈而有所不同。基于队列分割成线程是一个很好的开始,可以防止SQS_QueueA被空的SQS_QueueB阻塞。

您可能还想:

  1. 为特定队列添加更多线程。例如,如果您有一个特别忙的sqs队列,则可能有多个线程从其接收消息。如果您有更高的SQS延迟,这将是非常有益的。
  2. 拆分从处理消息接收消息 - 具有用于保存ReceiveMessageResponse对象的单独线程安全队列,然后具有专门负责处理来自该队列的结果的线程(或线程组)。
  3. 结合上述内容,您可以根据哪个瓶颈单独扩展SQS轮询和结果处理。

    如果您的线程执行非常类似的操作(在这种情况下,轮询SQS队列并处理消息),您可以共享这些线程之间的部分或全部代码,使差异就像传入的参数一样