缓存过期:hazelcast如何处理群集节点上的非同步时钟

时间:2014-10-21 09:23:24

标签: hazelcast

假设我有两个没有保证同步`系统时间的淡化节点(不要问为什么我会这样做,这只是一个假设的问题):

假设节点1的绝对时间在开始时设置为0(System.currentTimeMillis返回0),节点2的绝对时间设置为1000.

我创建一个存储在节点1上的锁,并将其到期时间设置为100毫秒。它在节点1绝对时间100和节点2绝对时间1100到期。现在节点2加入集群。我还检索在节点2上运行的应用程序中的锁(不试图锁定它的cource,因为它仍然锁定在节点1上)。现在我持有两个ILock引用锁,一个在节点1上运行的应用程序中,一个在节点2上运行的应用程序中。

当我在节点2上的ILock上调用操作时,它看到实际对象(在锁存储中)位于节点1上,因此它在节点1上远程调用操作。此时我们没有遇到问题时间差异了。如果我们等待100毫秒,节点1将使锁定到期。

但我们不等。相反,我们关闭节点1.锁被转移到节点2,因为节点1不再可用。在传输期间,节点1上的LockResourceImpl.writeData方法将锁的数据写入某个缓冲区。然后这个缓冲区被转移到节点2,LockResourceImpl.readData方法在那里读取它并设置值。

据我所知,时间戳只是被复制到各个字段而没有考虑节点2上的时钟可能不同。这意味着到期时间仍然是100(节点1设置的绝对时间) )节点2系统时间已经是1000。这意味着锁即使不会立即过期。

我理解正确吗?这实际上是个问题吗?

1 个答案:

答案 0 :(得分:0)

不,这不是问题。当节点死亡时,节点拥有的锁定的标准行为将立即释放。如果你考虑一下,它确实有意义,因为一个死节点没有用于锁定,如果你通过在另一台机器上使用锁定来强制进行定时等待,你的代码就会出现问题。

免责声明:我没有对此问题进行过调查,但所描述的行为是锁定群集(包括淡水广播)系统的标准。