Request/Response Cloudfoundry 应用程序与 AWS SQS 的消息传递

Request/Response Messaging for Cloudfoundry Apps with AWS SQS

我想使用 AWS SQS 在我的微服务(以及以后可能的 SNS)之间进行通信。每个微服务可以有多个实例起来。

目前我正在尝试实现 Request/Response 消息队列模式。
据我了解,正常的方法是有一个请求队列,并为每个服务实例传递一个唯一的响应队列。
消费服务将处理消息并将响应发送到给定的响应队列。因此,响应将始终返回到请求服务的正确实例。

我的问题现在来自 Cloudfoundry。

它应该如何工作:
服务A需要向服务B请求数据。
有一个名为 A-request-B.
的队列 服务 A 以 6 个实例开始。
每个实例都创建自己的队列:B-response-A-instance[x]
来自 A 实例的每个请求都会在请求中发送其响应队列名称,以便将响应路由到正确的队列。

这是我所知道的保证 B 的响应到达 A 的正确实例的唯一方法。
这不起作用,因为 Cloudfoundry 不允许来自 SQS 的 "create-queue" 调用,即使我可以连接到 SQS 实例来发送和接收消息。
创建队列的唯一方法是通过命令行。 所以我必须事先手动创建这 6 个响应队列。
如果我启动 A 的第 7 个实例,它将失败,因为它没有自己的响应队列。

我也尝试过使用 SQS temporary queues,但它们也可以通过动态创建队列来工作,这在 Cloudfoundry 中是不可能的。

我目前无法使用 SQS,因此无法切换到 kafka/rabbitmq 或其他方式。

有没有其他方法可以将响应传递给匹配的服务实例?或者有其他方法可以在 Cloud Foundry 中创建队列吗?

以上评论的总结...

This doesn't work as Cloudfoundry doesn't allow the "create-queue" call from SQS

Cloud Foundry 并不关心您使用的是什么消息系统,除非您使用市场服务来创建它。在这种情况下,Cloud Foundry 将代表您创建服务实例。它通过与服务代理交谈来实现这一点,服务代理实际创建服务实例和用户凭据。

在您的情况下,Cloud foundry 通过 AWS Service Broker 处理创建 AWS SQS 的凭证。不幸的是,经纪人给你的凭据没有创建队列的权限。信用只允许发送和接收由代理创建的特定队列的消息。

对此你无能为力,但有几个选择:

  1. 不要使用市场服务。相反,只需直接转到 AWS,创建一个 IAM 用户,创建您的 SQS 资源,然后将 IAM 用户权限授予它们。

    然后使用您创建的资源的凭据和信息创建用户提供的服务。您可以将用户提供的服务绑定到您的应用程序,就像 AWS 服务代理创建的服务一样。您会失去使用代理的便利性,但在扩展 up/down 您的应用程序实例时不必跳过您列出的步骤。

  2. 您可以通过代理创建服务实例,然后创建服务密钥。服务密钥是一组长期有效的凭证,因此您可以进入 AWS,查找与该服务密钥关联的 IAM 用户并调整权限,以便您可以创建队列。

    然后您需要创建一个用户提供的服务,就像第一个选项一样,插入您的服务密钥的凭据和信息,并将用户提供的服务绑定到您想要使用该服务的任何应用程序。

    不要删除服务密钥,否则您修改的用户将被删除,您的用户提供的服务将停止工作。

希望对您有所帮助!