Docker swarm 确保一个副本总是访问其他服务的同一个副本

Docker swarm make sure that one replica always access the same replica of other service

嘿,起初我不确定这是否可能。我的 docker 集群中有两种不同的服务。每个服务被复制 n 次。服务A通过dns访问服务B。下面是我的 docker 撰写文件的简化版本:

version: "3.7"
services:
  A:
    image: <dockerimage_A>
    deploy:
      replicas: 5
  B:
    image: <dockerimage_B>
    deploy:
      replicas: 5

服务 A 的副本通过来自 docker 的 DNS 条目访问服务 B 的副本并向 B 发送任务。B 任务的运行时间变化且处于阻塞状态。从 A 到 B 的连接也被阻塞。由于循环负载平衡,如果 A 和 B 的一个副本组合很快,那么快速的 A 连接到另一个 B 仍然被阻塞,而另一个 B 没有任何事情可做。

如果 A 的一个副本总是路由到 B 的同一个副本,那么解决这个问题将是理想的。是否有可能以这种方式更改负载平衡?

我通过以下 hacky 解决方案自行解决了这个问题,方法是使用插槽 ID 分别为每个副本设置主机名。

 services:
  A:
    hostname: "A-{{.Task.Slot}}"
  deploy:
    replicas: 2
  B:
  environment:
    - SERVICEA=http://A-{{.Task.Slot}}/
  deploy:
    replicas: 2