我有一个场景,将实例化同一个Verticle的两个或多个实例。我想确保只有一个实例正在消耗密钥' keyx'为了做到这一点,我检查一个服务发现实例,如果有某种类型的记录,如果没有,我可以肯定地说,没有人消费' keyx'。
因此,我在Service Discovery实例上发布了一条记录,并订阅了' keyx'。所有其他实例现在将向Service Discovery查询某些实例已经注册了' keyx'。
如果具有verticle实例的机器有任何严重问题,它将使Verticle被杀死并且记录仍将在Service Discovery上(在这种情况下,删除stop()方法中的记录将不起作用,因为这方法不会被调用)并且创建的所有其他实例都会认为实例仍在消耗' keyx'当可能不是这样的时候。
有人知道这个问题的任何可行解决方案吗?
谢谢;)
答案 0 :(得分:2)
一种方法是使用密钥自动过期的数据存储区。然后,客户端必须定期将密钥重新添加到商店以继续使用它,如果它们失败,则会自动删除密钥。 Redis提供此类功能(https://redis.io/commands/expire)。
或者,如果您没有此功能,则只需在设置密钥时存储时间戳。如果另一个客户端读取密钥但时间已过,则可以安全地使用密钥。