用于在服务器和客户端之间实现心跳的模式

时间:2009-04-15 13:10:54

标签: c# .net design-patterns

我想在服务器中实现心跳功能,该功能会定期提醒窗口客户端其活跃度。我正在考虑的想法很少,但会很感激建议和示例/参考

  • 有一个单独的线程可以将心跳发送到已连接的客户端

  • 具有不同类型的心跳以指示服务器的不同状态    (缓慢,快速,客户不堪重负,准备就绪)

  • 也许让客户订阅不同级别,默认发送心跳

我真的很想看看它在实践中是如何完成的,例子最好。

EDIT 1 客户端和服务器不是基于网络的! (服务器可能会迁移到Web,但我认为它不应该更改协议)

3 个答案:

答案 0 :(得分:2)

使用Josh提到的拉模型是最简单的方法。首先,你会遇到很多安全问题。无需担心客户端防火墙。此外,您无需担心必须在每个客户端上打开相同的端口,或打开动态端口并通知服务器有关正在使用的客户端上的端口。

此外,您不必在服务器上维护订户列表。此外,如果客户端以不太干净的方式(应用程序崩溃,电源故障等)断开连接,您将无需担心清理订户列表。

基本上,从客户端到服务器上的服务的简单轮询是最简单和最干净的方法,恕我直言。我已经好几次使用它了。如果选择,您甚至可以使用户可配置轮询间隔。

编辑:

虽然我无法提供参考或示例代码,但我将描述我过去所做的事情。

基本上,我有一个Web服务,当查询时,它将返回系统的状态。这个Web服务显然在服务器上运行。客户端在启动时将启动一个单独的线程,该线程每30秒查询一次Web服务以获取服务器系统的状态。然后,UI将被更新以指示该状态。一旦该任务完成,该线程将重新进入休眠状态30秒。更新时间可通过配置文件进行配置。只需确保捕获错误,以便如果服务请求因服务器关闭以外的原因而失败,则整个应用程序不会崩溃。

答案 1 :(得分:2)

这几乎肯定是矫枉过正,但是有一整套(并且非常生动)的学科正在研究失效探测器的类别,它们可以提供什么样的保证,以及它们如何实际实施。对于那些想要比这个提问者暗示更远的人,请看看:

Book Series - 
Book Title  - Distributed Computing
Chapter Title  - On the Impact of Fast Failure Detectors on Real-Time Fault-Tolerant Systems
First Page  - 354
Last Page  - 369
Copyright  - 2002
Author  - Marcos K. Aguilera
Author  - Gérard Le Lann
Author  - Sam Toueg
DOI  - 10.1007/3-540-36108-1_24
Link  - http://www.springerlink.com/content/e03yf4etbnle9728

Book Title  - Distributed Algorithms
Chapter Title  - Heartbeat: A timeout-free failure detector for quiescent reliable communication
First Page  - 126
Last Page  - 140
Copyright  - 1997
Author  - Marcos Kawazoe Aguilera
Author  - Wei Chen
Author  - Sam Toueg
DOI  - 10.1007/BFb0030680
Link  - http://www.springerlink.com/content/dj5n71hl17841416

此外,问题尚不清楚,但如果所讨论的语言是Java,那么这个主题的优秀资源是:Introduction to Reliable Distributed Programming,有很多优秀的示例代码。

答案 2 :(得分:1)

我们在谈论什么样的客户? Windows客户端还是asp.net?这有两种非常普遍的模式。您可以推送或拉取数据。如果您在互联网上遇到防火墙和nat,推送不起作用。因此,您最终得到了客户端启动连接的第三种变体,服务器保持连接打开以来来回发送信息。

您需要提供更多信息,我们是在谈论互联网还是内部网?您定位的.net框架是什么?你在说几个客户?可以处理十几个客户端的解决方案(特别是在推送模型或第三个模型中)可能与可扩展到数千个客户端的解决方案看起来非常不同。

最简单的解决方案是从客户端进行轮询,除非您希望服务器与客户端进行即时通信,否则就可以了。心跳不是即时沟通。

修改

好的,你指的是套接字,你真的确定要进行更低级别的网络类型编程吗?为什么不建立在现有的网络策略上,比如HTTP。您可以通过HTTP执行简单的远程服务,以便绕过防火墙。或者甚至更好,如果您的服务器是一个Web服务器,那么只需设置一个普通的旧xml服务。

我没有任何可以与之分享的例子,但应该有很多。