在这种情况下使用的最佳架构是什么?质量标准?社交网络?两者的结合?

What's the best architecture to use in this case? SQS? SNS? Combination of both?

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

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

我最初设计这个时使用 1 个 SQS 队列用于发送到外部服务器的消息,以及 1 个 SQS 队列用于返回的消息。一共两个队列。

不过,此设计似乎存在缺陷,因为某些消息仅针对某些服务器,但为了确定哪条消息针对哪个服务器,消息必须 'read' 离开队列并且 JSON 检查,然后将它们从其他轮询消息的服务器中隐藏起来。这可能导致服务器永远看不到它们的消息,因为它们一直被其他服务器隐藏。

那么我有什么替代这个设计的方法呢? AWS 之外有 400 台服务器。我可以有 400 个 SQS 队列(每个服务器一个),然后一个队列返回中央服务?好像有很多队列。

我想过使用 SNS 吗?但是我仍然有 400 个 SNS 主题,对吗?每个商店一个?

此问题的解决方案是 SQS。通读 http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-attributes.html

任何商店都可以消费的消息不会有任何消息属性;而特定商店的消息将具有属性 store=store1.

现在,所有商店将有两个监听器,一个具有消息属性;而一位没有过滤器的听众。

如果您有任何疑问,请联系我。

您绝对不应该检索不会处理的 Amazon SQS 消息。这可能会导致消息从未被所需服务器检索

您的选择是:

  • 为每个服务器创建一个队列。他们检查自己的队列。或者
  • 使用 API 网关创建您自己的 API。 服务器调用,识别自己。消息从数据库(不是 SQS)中检索并返回。 缺点:你必须自己写,做错误处理,隐形类型的功能等

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

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

提醒一句: Amazon SQS charges by API call (eg attempting to retrieve a message). Use long polling 减少请求数。

正如约翰所说,我的上述回答可能行不通; 一种解决方案可以使用任何 JMS 解决方案提供商,例如我使用过的 ActiveMQ,并且肯定会提供此功能;您可以在其中订阅基于过滤器的队列。

bitnami 为 activemq 提供了一个 AMI,您可以将其安装在微型 EC2 实例上。非常直接。