我正在尝试模拟分布式文件系统,但在模拟心跳的工作方式时遇到了一些问题。我有一个存储文件元数据的名称节点和实际存储文件块的数据节点。我定期(像每3秒(从数据节点向名称节点发送一条消息,告诉名称节点它是活动的。
目前,我在name节点中有一个HashTable,它将数据节点名称(String(作为键存储,并将布尔值"告诉"我数据节点是否仍然有效。如果我收到来自数据节点的消息,哈希表中的值将切换为true。我遇到的困难是,如果我在10秒内没有收到来自数据节点的消息,我该如何将值切换回false?
我唯一能想到的就是给每个心跳加上时间戳,并将每个时间戳放在另一个包含数据节点名称和时间戳的哈希表中。然后编写一个函数,将当前时间与哈希表中的每个时间戳进行比较,并将布尔哈希表中时间戳为10秒以上的任何数据节点更改为false。然后将该函数放入一个无穷while循环中。有什么更好的方法来处理这样的事情?
您将映射从Map<String, Boolean>
更改为Map<String, Instant>
,因此它存储最后的心跳时间,而不仅仅是一个"活着"布尔值。
然后编写一个boolean isAlive(String name)
方法来查找映射条目。如果找到条目并且存储的Instant
在过去不到10秒,则返回true
,否则返回false
。
不需要使Map
保持最新。您只需用该方法封装映射,即可在查询时解释的映射值"live"。