在这种情况下,最好的架构是什么? SQS? SNS?两者结合?

时间:2017-07-31 08:03:43

标签: c# amazon-web-services amazon-sqs amazon-sns

我在AWS内部的EC2实例上有一个中央c#windows服务。它的工作是创建任务(JSON内部的指令),然后将其发送到在AWS外部的服务器上运行的各个Windows服务(想想在每个商店中都有服务器的砖和实体零售商店)。

这些单独的服务器基于JSON任务执行一些处理,然后将消息发送回AWS内部的中央Windows服务。此设计目前正在使用AWS SQS。

我最初使用1个SQS队列为外部服务器设置了消息,为回来的消息设置了1个SQS队列。总共有两个队列。

然而,这种设计似乎有缺陷,因为某些消息仅适用于某些服务器,但为了确定哪个消息适用于哪个服务器,必须“读取”消息。离开队列并检查JSON,然后将其隐藏在轮询消息的其他服务器上。这可能导致服务器永远不会看到他们的消息,因为他们不断被其他服务器隐藏。

那么我对这种设计的替代方案是什么? AWS外部有400台服务器。我可以有400个SQS队列(每个服务器一个),然后一个队列返回中央服务?它似乎很多队列。

我想过使用SNS?但那时我还有400个SNS主题吗?每个商店一个?

3 个答案:

答案 0 :(得分:0)

解决方法是SQS。仔细阅读http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-attributes.html

任何商店可以使用的消息都没有任何消息属性;而特定商店的消息将具有属性store = store1。

现在,所有商店都有两个监听器,一个带有message属性;而一个没有过滤器的听众。

如果你有任何疑问,请打电话给我。

答案 1 :(得分:0)

您肯定应该检索不会被处理的Amazon SQS消息。这可能会导致所需服务器永远无法检索的情况。

您的选择是:

  • 为每台服务器创建一个队列。他们检查自己的队列。 OR
  • 使用API​​网关创建您自己的API。服务器调用,标识自己。从数据库(而不是SQS)检索消息并提供回来。 缺点:您必须自己编写,执行错误处理,隐身类型功能等。

第一个选项是最简单的,几乎不需要编码更改。 SQS中似乎没有队列数量的限制。可以使用几行代码以编程方式创建400个队列。

根据您的应用程序的运行方式,您可能还需要一个服务器可以抓取的通用队列,甚至可能需要特定类别服务器的队列(例如,按地理位置或功能)。每个服务器首先检查自己的队列,然后检查其类的队列,然后检查通用队列。

提醒: Amazon SQS charges by API call(例如,尝试检索邮件)。使用long polling减少请求数量。

答案 2 :(得分:0)

约翰建议我的上述答案可能不起作用; 一个解决方案可以使用任何JMS解决方案提供商,如我使用的ActiveMQ,并且肯定提供此功能;您可以根据过滤器订阅队列。

bitnami为activemq提供AMI,您可以将其安装在micro EC2实例上。它很直接。