客户端 - 服务器系统中的客户端故障检测

时间:2010-11-11 08:11:23

标签: java web-applications client-server distributed

假设客户端和服务器通过无状态通道进行通信的分布式通信系统 客户端向服务器发送请求,服务器处理并保留每个客户端的内部记录 当需要时,服务器会在系统发生各种事件时向客户端发回通知 通知机制取决于内部记录 我的问题是,分布式计算中用于处理客户端故障的标准方法是什么? 即在此上下文中,假设客户端进程崩溃或只是重新启动。 服务器仍然具有客户端的记录,但现在客户端和服务器是同步的。 因此,客户端将根据重新启动之前创建的记录获取通知。这是不受欢迎的 什么是检测客户端故障的标准化方法?例如。客户端已重新启动,以前的记录必须删除? 我想到了客户端的定期回调,如果客户端无法访问,请删除其记录,但我不确定这是不是一个好主意。 [编辑] 我想到了回调,因为发送回客户端的期间事件可能是非常大的间隔,因此客户端故障不会很快显现

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

谢谢!

1 个答案:

答案 0 :(得分:2)

标准方法因系统而异,具体取决于架构和域。服务器如何发现客户端已关闭?我认为您不需要回调,因为您发送通知并且可以检测到客户端无法访问。例如:

  1. 向客户发送通知;
  2. 如果成功,转到1;
  3. else擦除客户端队列中的所有通知,设置标志以不为客户端收集事件。
  4. 连接客户端时:

    1. 取消设置旗帜;
    2. 开始发送通知
    3. 甚至更简单的方法:

      1. 在初始化对话之前擦除客户端连接时的通知队列;
      2. 运行一个低优先级的线程来清除所有早于X的客户端的所有通知,以清除永远不会回来的客户端通知。
      3. 原作者评论后的更新

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

        1. 服务器启动一个线程(让我们称之为“代理”)来为客户端提供服务,每个客户端都有一个线程。
        2. 当客户端正常关闭会话或关闭时,代理会退出。
        3. 每个客户端都有一个私有(代理/客户端之间没有共享)记录集
        4. 有一个当前客户端的共享列表,由另一个组件(不是普通代理,我们称之为“调度程序”)使用,以便为客户端分发记录。
        5. 溶液: 1.服务器启动代理并注册刚连接到客户端列表的客户端。调度员收到新客户到达的通知。 2.代理会消耗记录,直到客户端连接为止。在客户端关闭和/或失败时,代理会注销客户端并清除记录集。

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