如何向 PCF 中的应用程序的所有实例发送事件

How to send events to all instances of the application in PCF

我无法找到向 Pivotal Cloud Foundry 中的所有应用程序实例send/broadcast发送消息的方法。我们如何将某些事件通知给所有应用程序实例?如果我们使用 HTTP 请求,PCF 路由器会将其分派到应用程序的单个实例。我们如何解决这个问题?

开箱即用的 CF 不提供应用可以订阅的任何事件队列机制。

我会做什么(假设您有两个应用程序实例 A 和 B):

  • 在您的应用程序代码中提供一个事件端点,例如POST /api/event(或者,如果事件应该来自另一个应用程序(例如另一个微服务),则该应用程序可以直接将消息发送到队列中)
  • 所有应用实例都在内部事件队列上侦听新事件
  • 实例 A 接收来自 CF 路由器的调用并通过在内部事件队列上发出事件来处理它,实例不会 对事件做出反应,然而
  • 当A发布事件时,A和B收到事件并进行相应的处理

现在,您可以使用的内部事件队列很大程度上取决于您的部署。在 AWS 上,您可能可以使用 SQS or SNS or something similar. PCF, as I know, may also provide a messaging system which would suit here as well, rabbitmq. You could also use features of other services that would allow you to subscribe to events, such as redis (pub/sub commands) 或类似的。

如果您更具体地提供有关您想要实现的目标的更多信息,则可能会得到更详细的答案。

@Florian 所说的可能是更安全的选择,但如果您想要快速简便的操作,您可以使用 X-CF-APP-INSTANCE header 将 HTTP 请求直接发送到应用程序实例。 header 的格式为 YOUR-APP-GUID:YOUR-INSTANCE-INDEX.

https://docs.cloudfoundry.org/concepts/http-routing.html#app-instance-routing

因此,给定一个应用程序 GUID,您可以遍历实例数,比如 0 到 5,然后向每个实例发送 HTTP 请求。请务必检查响应以确认每一个都成功了。

这还要求您知道您的应用程序的应用程序 GUID(即 cf app <name> --guid)和您的应用程序的实例数。