none
请教下版主:如何在最短的时间里得到由ChannelFactory<T>创建的通道对应的服务不可用? RRS feed

  • 常规讨论

  • Hi,

         我有比较多的服务节点,有时候有些服务节点出现问题时客户端去调用就不能马上得知,从而把节点从可用服务中移除。

        比如服务节点是如下的一个数组:

        var serverList = {"net.tcp://192.168.1.100/services1","net.tcp://192.168.1.101/services1","net.tcp://192.168.1.102/services2" ....}

       我是在客户端去创建 ChannelFactory进行通信,客户端内部是根据自己的需要或最近的条件选择服务节点的,我希望当上面的节点任意的成员出现故障不可访问时,客户端可以

    比较快速地知道,这时程序好做出自动切换的处理。目前我是通用try{} catchL{} 并设置 binging的opentimeout超时去判定某节点出现不可访问的问题的,除此之外,还有更快的方式得知吗?(更好的性能)

    心跳包?或是其他?

    麻烦指教下,谢谢!



    自省,谦虚

    2012年7月18日 8:36

全部回复

  • 心跳包是比较靠谱的实现,但是基于你提到的Timeout,我猜想你是想在服务器出现故障的时候“实时”的知道,而不是等一个Timeout的时间段再知道,

    那么,我可以告诉你,这是“不可能的”。

    比如15秒的Timeout连接不上,并不代表 16秒的Timeout连接不上,因此你应该根据你应用的需求,规定一个最大的Timeout值,超过此值的连接不管是否建立成功,都丢弃。

    连接建立成功后,不要关闭,由一个线程定时调用所有连接上的心跳服务去检测连接是否可用;

    使用TCP,并同时在局域网中的话,请考虑采用回调,由服务器主动发送心跳包,客户端在收到某个连接由服务器发送回来的心跳包后去更新对应的Timeout字段,如果在指定时间段内

    此连接没有收到服务器发送来的心跳包,则不论该连接式是否可用都主动关闭,并建立新连接。

    2012年7月19日 2:36
  • 谢谢DroidXgnaW~~正在试验下呃,看下实际的情况是怎么回事先哈

    自省,谦虚

    2012年7月20日 8:36