代码之家  ›  专栏  ›  技术社区  ›  Cratylus

客户机-服务器系统中的客户机故障检测(分布式)

  •  1
  • Cratylus  · 技术社区  · 14 年前

    假设一个分布式通信系统,其中客户机和服务器通过无状态通道进行通信。
    客户机向服务器发送请求,服务器处理并保存每个客户机的内部记录。
    当系统发生各种事件时,服务器会根据需要向客户端发送通知。
    通知机制依赖于内部记录。
    我的问题是,分布式计算中处理客户机故障的标准AppOAch是什么?
    也就是说,在这种情况下,假设客户机进程崩溃或只是重新启动。 服务器仍然有客户机的记录,但现在客户机和服务器是同步的。 因此,客户端将根据重新启动前创建的记录接收通知。这是 不受欢迎
    检测客户机故障的标准化方法是什么?例如,客户端已重新启动,必须清除以前的记录?
    我考虑定期回拨给客户,如果无法联系到客户,请删除其记录,但我不确定这是否是一个好主意。 [编辑] 我想到回调是因为,发送回客户机的周期事件可能间隔很长,因此客户机故障不会很快被发现。

    有人能帮忙吗?我的应用程序域的上下文是Web服务。

    谢谢您!

    1 回复  |  直到 14 年前
        1
  •  2
  •   khachik    14 年前

    根据体系结构和领域的不同,标准方法因系统而异。服务器如何发现客户机停机?我认为您不需要回调,因为您发送通知并可以检测到客户端不可访问。例如:

    1. 向客户发送通知;
    2. 如果成功,转到1;
    3. 否则,清除队列中客户机的所有通知,设置一个标志以不收集客户机的事件。

    连接客户端时:

    1. 取消设置旗子;
    2. 开始发送通知

    或者更简单的方法:

    1. 在初始化会话之前,清除客户端连接时的通知队列;
    2. 运行一个低优先级线程来清除所有比X旧的客户机的所有通知,以清除永远不会返回的客户机通知。

    在原始作者评论后更新

    这在很大程度上取决于系统中的组织方式。假设:

    1. 服务器启动一个线程(我们称之为“代理”)为客户机服务,每个客户机一个线程。
    2. 当客户端正常关闭会话或关闭时,代理退出。
    3. 为每个客户端设置了一个私有(不在代理/客户端之间共享)记录集
    4. 有一个当前客户机的共享列表,另一个组件(不是普通代理,我们称之为“Dispatcher”)使用它为客户机分发记录。

    解决方案: 1。服务器启动一个代理并注册刚刚连接到客户机列表的客户机。调度程序收到新客户机到达的通知。 2。在连接客户端之前,代理将使用这些记录。在客户端关闭和/或失败时,代理将注销客户端并清除记录集。

    如果系统中的内容没有按上述方式组织,请提供一些详细信息。