我如何使用 Consul 来确保只有一个服务在执行一项任务?
我已经按照 http://www.consul.io/ 中的示例进行了操作。但我不是 100% 确定该走哪条路。我应该使用KV吗?我应该使用服务吗?或者我应该使用注册服务作为健康检查并使其可以在给定的时间间隔被集群调用?
例如,假设有几个数据中心。在每个数据中心内,都有许多服务正在运行。这些服务中的每一项都可以发送电子邮件。这些服务必须检查是否有任何电子邮件要发送。如果有,然后发送电子邮件。但是,我不希望多次发送同一封电子邮件。
它如何确保所有电子邮件都已发送,并且没有多次发送?
我可以使用其他技术来做到这一点,但我正在尝试使用 Consul 来实现这一点。
最佳答案
这正是 Consul Distributed Locks 的用例。
例如,假设您在不同的 AWS 可用区中有三台服务器用于故障转移。每个都启动:
consul lock -verbose lock-name ./run_server.sh
领事代理只会运行
./run_server.sh
服务器首先获取锁的命令。如果 ./run_server.sh
在带有锁的服务器上失败 Consul 代理将释放锁,另一个首先获取它的节点将执行 ./run_server.sh
.这样您就可以进行故障转移,并且一次只能运行一个服务器。如果您正确注册了您的 Consul 健康检查,您将能够看到第一个节点上的服务器出现故障,您可以修复并重新启动 consul lock ...
。在该节点上,它将阻塞,直到它可以获取锁。目前,分布式锁定只能在单个 Consul 数据中心内发生。但是,由于由您决定 Consul 服务器组成数据中心的内容,您应该能够解决您的问题。如果您想跨联合领事数据中心进行锁定,您将不得不等待它,因为它是一个路线图项目。
关于consul - 如何在领导人选举中使用 Consul?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27679341/