algorithm - 是否有任何好的算法来检测停止向服务器发送心跳的客户端?

标签 algorithm optimization data-structures client server

假设在一个固定的时间间隔内,有数百万的客户端在向一台服务器发送心跳,那么服务器判断客户端停止发送心跳的时间大于时间间隔失败。如果服务器只维护一个映射并不断迭代每个客户端以检查客户端是否超时,那将产生 O(n) 的复杂性,这对数百万客户端来说是可怕的。是否有一些算法可以像一些堆或二叉树一样使 O(log(n)) 复杂度来解决这样的问题?谢谢。

最佳答案

如果你保留一个双链表和一个散列图,你可以使用散列图找到与发送心跳的客户端对应的列表条目。 收到心跳后,您将列表条目解链并将其放在链表的末尾。

链表开头的条目是一个候选的“死亡”客户端。 链表可以遍历到第一个存活的客户端。

一些注意事项:

  1. 添加客户: 创建一个列表条目,将其添加到 HashMap 和链表的末尾。 O(1)

  2. 移除一个客户端: 通过在 HashMap 中查找来找到客户端列表条目。解开客户端。从 HashMap 中删除。 O(1).

  3. 处理心跳: 通过在 HashMap 中查找来找到客户端列表条目。取消链接客户端列表条目。将列表条目添加到链接列表的末尾。 O(1)

  4. 找到一个死去的客户: 查看链接列表的第一个条目。 O(1)

关于algorithm - 是否有任何好的算法来检测停止向服务器发送心跳的客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30454209/

相关文章:

java - 有人可以确认我的双调序列算法中的最小元素是否正确吗?

algorithm - 在长度在给定用户定义范围内的加权无向图中找到一个简单循环

sql - 一个简单但具有挑战性的 SQL 问题,至少我找不到出路,只能在外部进行 (c#)

c - C 中的二叉树练习

data-structures - 在 opencl 中使用自定义结构

java - 如何在 Java 中创建内存高效的数据结构

algorithm - 按求和算法对数字进行排序

java消除垃圾产生

algorithm - 从多组任意项目中挑选项目时最大限度地减少重复项

algorithm - 如何优化以下算法?