我在AWS内部的EC2实例上有一个中央c#windows服务。它的工作是创建任务(JSON内部的指令),然后将其发送到在AWS外部的服务器上运行的各个Windows服务(想想在每个商店中都有服务器的砖和实体零售商店)。
这些单独的服务器基于JSON任务执行一些处理,然后将消息发送回AWS内部的中央Windows服务。此设计目前正在使用AWS SQS。
我最初使用1个SQS队列为外部服务器设置了消息,为回来的消息设置了1个SQS队列。总共有两个队列。
然而,这种设计似乎有缺陷,因为某些消息仅适用于某些服务器,但为了确定哪个消息适用于哪个服务器,必须“读取”消息。离开队列并检查JSON,然后将其隐藏在轮询消息的其他服务器上。这可能导致服务器永远不会看到他们的消息,因为他们不断被其他服务器隐藏。
那么我对这种设计的替代方案是什么? AWS外部有400台服务器。我可以有400个SQS队列(每个服务器一个),然后一个队列返回中央服务?它似乎很多队列。
我想过使用SNS?但那时我还有400个SNS主题吗?每个商店一个?
答案 0 :(得分:0)
解决方法是SQS。仔细阅读http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-attributes.html
任何商店可以使用的消息都没有任何消息属性;而特定商店的消息将具有属性store = store1。
现在,所有商店都有两个监听器,一个带有message属性;而一个没有过滤器的听众。
如果你有任何疑问,请打电话给我。答案 1 :(得分:0)
您肯定应该不检索不会被处理的Amazon SQS消息。这可能会导致所需服务器永远无法检索的情况。
您的选择是:
第一个选项是最简单的,几乎不需要编码更改。 SQS中似乎没有队列数量的限制。可以使用几行代码以编程方式创建400个队列。
根据您的应用程序的运行方式,您可能还需要一个服务器可以抓取的通用队列,甚至可能需要特定类别服务器的队列(例如,按地理位置或功能)。每个服务器首先检查自己的队列,然后检查其类的队列,然后检查通用队列。
提醒: Amazon SQS charges by API call(例如,尝试检索邮件)。使用long polling减少请求数量。
答案 2 :(得分:0)
约翰建议我的上述答案可能不起作用; 一个解决方案可以使用任何JMS解决方案提供商,如我使用的ActiveMQ,并且肯定提供此功能;您可以根据过滤器订阅队列。
bitnami为activemq提供AMI,您可以将其安装在micro EC2实例上。它很直接。