如何从 supervisord 优雅地停止 Akka 集群成员

How to stop Akka Cluster member gracefully from supervisord

我 运行 一个由 supervisord (http://supervisord.org/) 控制的 Akka 集群(版本 2.5.0)。我的问题是,当我用 supervisorctl stop my-service 停止一个 akka 节点时,akka 节点停止,但没有足够的时间从 akka 集群中注销自己,而且其他节点不控制(即)单例参与者。

我的主管配置如下所示:

[program:my-service]
command=java -jar -Dconfig.file=application-1.conf -Dfile.encoding=UTF-8  my_service.jar
directory=/data/my-service
autorestart=true
autostart=true
user=lm-service
startsecs=3
startretries=3
stopsignal=KILL
stopwaitsecs=10
redirect_stderr=false
stdout_logfile=/data/my-service/logs/stdout
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/data/my-service/logs/stderr
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB

我是否必须在我的 akka 应用程序中添加一些关闭钩子,or/and我是否必须更改我的配置中的 stopsignal 参数?

停止信号应该是SIGTERMSIGTERM会触发akka的协调关闭系统,此时你的集群节点应该正确离开集群。参见:

不过,这并不能保证其他节点会及时取得控制权。看到这句话来自 http://doc.akka.io/docs/akka/current/scala/cluster-singleton.html:

Be aware that there is a short time period when there is no active singleton during the hand-over process.