客户端的leader选举实现由多种选择,最简单的做法是使用zookeeper,例如ZK Curator framework
这里我只简单说明一下我在ETCD中实现leader election的做法
- 每一个client需要启动的时候需要有一个唯一的ID
- 需要一个目录来保存leader的信息: 例如: /root/path
- client判断自己是否为leader的时候:12#获取etcd上的leader信息curl http://127.0.0.1:2379/v2/keys/root/path
如果返回成功,判断leader是否是自己,例如判断ID是否和自己的ID相同。
如果返回失败,设置/root/path的值,并把TTL设置为60s(具体的根据自己的需要设定)1curl http://127.0.0.1:2379/v2/keys/root/path -XPUT -d value=$(ID) -d ttl=60
这样TTL时间一到,节点就会被删除,所有的client再公平竞争
ETCD Java client, 基于OkHttp实现,依赖少,避免http client/async httpclient的包版本冲突