如果服务不可用,请删除服务发现上的条目
Remove entry on Service Discovery if service not available
我有一个场景,其中将实例化同一 Verticle 的两个或多个实例。我想确保只有一个实例正在使用密钥 'keyx',为了做到这一点,我检查服务发现实例是否存在某种类型的记录,如果不存在,我可以放心地说没有人消费 'keyx'。
因此,我在服务发现实例上发布了一条记录并订阅了 'keyx'。所有其他实例现在将使用服务发现检查某个实例是否已为 'keyx' 注册。
如果有Verticle实例的机器有严重问题,它会杀死Verticle并且记录仍然在Service Discovery上(在这种情况下,在stop()方法中删除记录是行不通的)因为不会调用此方法)并且创建的所有其他实例将相信一个实例仍在消耗 'keyx' ,而实际情况可能并非如此。
有人知道这个问题的可行解决方案吗?
谢谢 ;)
一种方法是使用密钥自动过期的数据存储。然后客户端必须定期将密钥重新添加到存储中以继续使用它,如果失败则密钥将自动删除。 Redis 提供了这种功能 (https://redis.io/commands/expire)。
或者,如果您没有此功能,您可以在设置密钥时简单地存储一个时间戳。如果另一个客户端读取了该密钥但时间已过,则它可以安全地使用该密钥。
我有一个场景,其中将实例化同一 Verticle 的两个或多个实例。我想确保只有一个实例正在使用密钥 'keyx',为了做到这一点,我检查服务发现实例是否存在某种类型的记录,如果不存在,我可以放心地说没有人消费 'keyx'。
因此,我在服务发现实例上发布了一条记录并订阅了 'keyx'。所有其他实例现在将使用服务发现检查某个实例是否已为 'keyx' 注册。
如果有Verticle实例的机器有严重问题,它会杀死Verticle并且记录仍然在Service Discovery上(在这种情况下,在stop()方法中删除记录是行不通的)因为不会调用此方法)并且创建的所有其他实例将相信一个实例仍在消耗 'keyx' ,而实际情况可能并非如此。
有人知道这个问题的可行解决方案吗?
谢谢 ;)
一种方法是使用密钥自动过期的数据存储。然后客户端必须定期将密钥重新添加到存储中以继续使用它,如果失败则密钥将自动删除。 Redis 提供了这种功能 (https://redis.io/commands/expire)。
或者,如果您没有此功能,您可以在设置密钥时简单地存储一个时间戳。如果另一个客户端读取了该密钥但时间已过,则它可以安全地使用该密钥。