我正在使用芹菜和Zookeeper(Kazoo Lock)锁定工人。当我杀死(-9)的一名工人之前,我有问题,然后再释放锁,然后锁永远锁定。
所以我的问题是:在该过程中杀死该过程释放锁,还是在Zookeeper中进行一些错误?
zookeeper锁使用短暂节点。短暂节点是一个节点,只要创建的会话还活着。会话通过创建会话定期发送给Zookeeper的过程来保持会议。
因此,如果您杀死创建锁的过程,则最终将释放锁,因为Zookeeper不再接受心跳,会议将死亡。
因此,在释放锁之前杀死一个工人,最终应释放锁。
如果锁定从未发布,可能会发生一些事情,
- 其他人注意到锁已释放并获得了。大概您是因为存在争议,因此您在锁定,并且在释放锁时会尝试获取锁。
- 您的等待时间不够长。当您连接到Zookeeper时,您应该设置一个会话超时参数,那就是服务器将在不听任何心跳的情况下保持会话的活力多长时间,您必须等待这么长时间才能看到发布的锁
- Kazoo中有一个错误。这是可能的,但是看起来像Kazoo Lock食谱使用了短暂的节点,并且您描述的用例是非常基本的。
这不太可能是一个Zookeeper错误。
您怎么知道锁没有发布?
用杀伤信号杀死一个过程将无助于清除"软件锁",例如Zookeeper锁。
唯一被杀死信号杀死的锁是OS级别的锁,因为所有文件描述符都被杀死,因此文件描述符锁也被杀死。但是就Zookeeper而言,这些不是OS级别的锁(仅仅是因为即使在同一台计算机上的Zookeeper过程也不是您的Python过程之一)。
因此,它不是Zookeeper中的错误,也不是杀死-9的预期行为。