这是一个普遍问题,但出于争论的目的,您可以假设我们有一组通过 AMQP 和 HTTP 组合进行通信的进程。有两种具体情况需要考虑。
最简单的一个:
- Q) 如果 A 向 B 发送消息,B 如何识别 A 发送回复的位置。
- A) A 必须以某种方式告诉 B 将其发送到哪里(交换为 AMQP,URL 为 http)
较难的:
- 问)监控进程如何向 A 发送消息(其他因素促使了这种愿望 - 例如 B 说 A 向我发送了一个错误的请求)
-
Q) 监控进程如何终止或重启 A.
这可能类似于杀死主机 + pid 或 pod 或 pod + 容器
(例如参见kubernetes 在 pod 内重启容器 https://stackoverflow.com/questions/46123457/kubernetes-restart-container-within-pod)
您可能希望重新启动整个服务或提供该服务的进程的某些子集。
现在您可以自己分配一个 UUID,但您需要一个表来映射它。
这可能有多个列,但有时单个 URI(或类似 URI 的东西)很有用,例如作为“源自/回复”地址。
另一种看待这个问题的方式。
在过去,识别流程很容易。
主机名(或 IP 地址)+ PID 就足够了
然后是虚拟化,IP 地址标识分配给 VM 的虚拟网络端口,PID 标识其中的进程。
主机名和 IP 地址仍然足够。
有时你也需要虚拟主机(尽管我不清楚为什么)
现在将容器添加到混合容器中,容器不一定有自己的 IP 地址。 Ahost+pid可以识别容器 https://stackoverflow.com/questions/39931316/what-is-the-pid-in-the-host-of-a-process-running-inside-a-docker-container?rq=1但如果您运行的是 kubernetes 或 docker swarm,您可能不知道主机。
现在我们不再谈论流程,而是谈论服务。
过去使用主机名(或 IP 地址)和端口来识别服务就足够了(YMMV -IP地址和端口号一起可以唯一标识进程ID吗? https://stackoverflow.com/questions/8731714/can-an-ip-address-and-a-port-number-together-uniquely-identify-a-process-id).
现在我们有负载均衡器和其他技巧(例如缓存代理)来将消息重定向到实际提供服务的其他东西。
服务可能由一个容器或包含多个容器的 Pod 提供,在这种情况下,您可能需要对 Pod 或容器进行寻址。
参见示例kubernetes 在 pod 内重启容器 https://stackoverflow.com/questions/46123457/kubernetes-restart-container-within-pod看起来每个 docker 实例的容器名称都是唯一的,但除此之外不会。
因此,您可能需要采用几种不同的方式来处理消息。
有一个好的标准方法可以做到这一点吗?
在我看来,显而易见的是要使用 URI(但我可能是错的)。
是否有推荐的 URI 形式来处理all可能的情况?
(显然我们有原科托克://host:port/ 对于简单的情况)