考虑有一个包含5个副本的docker服务。我想对所有5个副本进行休息调用。如果任何副本失败,则整个请求都将失败。我想这样做是因为有时容器内的代码停止运行而不响应其余的调用。是否可以对服务进行单次休息调用,如果任何容器无法返回响应,则整个请求将失败
答案 0 :(得分:0)
Docker的负载均衡器将您的请求代理到五个任务之一。这就是它的意图。如果要向服务发送消息并收集所有任务的结果,则必须自己实现。您可以将代理放在最前面或在应用程序中实现一些群集消息分发。
在您的情况下,请查看docker运行状况检查。您定义了一个在容器内定期运行的命令,如果失败,则docker会认为您的容器不健康并杀死它。您需要编写一个简短的脚本来发送REST调用,并在失败时返回非零退出代码。
答案 1 :(得分:0)
为以后的参考,从Compose文件版本3.3开始,新查看者可以使用服务的deploy
支持'endpoint_mode'选项。现在,还可以使用选项“ dnsrr”代替默认的“ vip”(虚拟IP /代理负载均衡器):
DNS轮询(DNSRR)服务发现不使用单个虚拟IP。 Docker设置服务的DNS条目,以便对服务名称的DNS查询返回IP地址列表,并且客户端直接连接到其中之一。在想要使用自己的负载平衡器或混合Windows和Linux应用程序的情况下,DNS轮询很有用。
现在,在您的服务(在网络内部)中使用“ nslookup” /“ dig + short” / etc之类的命令,现在将解析为容器IP列表,而不是它们前面的代理负载均衡器。
nslookup <yourservice> | awk '/^Address: / { print $2 }' | xargs | sed -e 's/ /,/g'
可以用于逗号分隔的IP地址字符串。 Java替代品:
Arrays.asList(java.net.InetAddress.getAllByName(<yourservice>));
您可以相应地调整应用程序的代码。
基于此,您可以在等待每个容器的响应以及如何处理诸如并非所有容器在指定时间内进行答复之类的情况时实现自己的行为。
对于撰写版本3.3+ compatibility的文件,docker引擎版本应为17.06.0 +。
另一种方法是解决tasks.<service-name>
。可以在this service discovery question中找到更多信息。