这是一个普遍的问题,但是出于论证的缘故,您可以并假设我们有一个通过AMQP和HTTP组合进行通信的进程集合。有两种情况需要考虑。
简单的一个:
较难的:
这可能像杀死主机+ pid或pod或pod + container
您可能希望重新启动整个服务或提供该服务的过程的某些子集。
现在,您可以自己分配一个UUID,但是需要一个表来映射它。它可能有多个列,但有时单个URI(或类似URI的东西)很有用,例如,作为“起源于/回复到”地址。
查看此问题的另一种方法。在过去,很容易确定一个过程。
主机名(或IP地址)+ PID
然后进行虚拟化,IP地址标识分配给VM的虚拟网络端口,而PID标识其中的进程。主机名和IP地址仍然足够。有时您也需要虚拟主机(尽管我从来不知道为什么)
现在,将容器添加到混合物中,容器不一定具有自己的IP地址。一个主机+PID可识别的容器 ,但你可能不知道的主机,如果你正在运行kubernetes或码头群。
现在,我们不再谈论流程,而是谈论服务。过去足以使用主机名(或IP地址)和端口来标识服务(YMMV- IP地址和端口号可以一起唯一地标识进程ID吗?。
现在,我们有了负载平衡器和其他技巧(例如,缓存代理),可以将消息重定向到实际提供服务的其他内容。
包含多个容器的容器或容器可能会提供服务,在这种情况下,您可能需要处理容器或容器。例如查看kubernetes在pod中重新启动容器看起来每个docker实例的容器名称都是唯一的,但除此之外没有。
因此,您可能想通过几种不同的方式来处理消息。有一个好的标准方法吗?
在我看来,要使用的显而易见的东西是URI(但是我可能错了)。是否有推荐的URI形式来处理 所有 可能的情况?(显然,对于简单的情况,我们有 procotocl :// host : port /)
经过一番考虑,我相信host + pid仍然足以(但不一定是最好的方式)来标识一个进程,只要您注意以下几点:
您的PID可能含义不明确。它可以是容器名称空间或主机的PID。
如果要从容器外部引用进程,则需要使用主机的PID,而不要使用容器中出现的PID,因为它位于单独的进程名称空间中。例如,请参见“ 好奇的情况下,pid名称空间”
容器可能能够识别主机和PID本身(毕竟它应该是一个沙箱)
IP地址将相对于内部网络(正常情况下)
主机名将通过DNS查找(通常)
现在,URI是指端口而不是PID,因此URI在这里不合适。PID @ HOST可能是一个明智的表示法,但请注意与user @ host混淆。
除了容器和Pod ID外,还有其他更方便的方式来标识处理资源,例如有状态集