最近团队有一些小的变动,项目比较忙比较来这溜达。 今天休息抽空在原汽车动画的基础上做了个实时监控的功能DEMO分享给大家。先来个图有图有真相:
演示地址: http://xingjunli.webs.com/SilverlightCar.html
需求提出:假定要从服务器获取当前汽车运行参数信息返回给客户端显示,实现一个汽车实时数据监控的功能;
方案一:
在页面实现一个定时器,定时向服务器发出请求,将返回数据更新致页面显示(当然Silverlight的双向通讯功能也可实现同样的功能,不过代码其逻辑相对复杂,调试及保持其稳定性稍有挑战),这种方式对服务器而言压力比较大,客户端服务重用性也打了折扣;
方案二:
通过客户端事件监控器,从客户端主动发送请求,实时访问服务;通过事件预定的方式向客户端发送数据;同时根据服务器负载能力定义一个可配置的(Interval)参数;并通过一个客户端缓存来判断数据是否更新、并通知客户程序更新;静态图如下:
客户端实现:
1、 IObserver:实现观察者监控器,根据用户注册的事件,响应客户端事件更新;
2、 EventMonitor:实现具体的业务,同服务器交互;
3、 ClientSnapShot:客户端缓存,用于保存判断数据是否有修改更新
服务空器端实现:
1、 CarInfoServer:服务器业务信息,获取汽车运行实时参数(对外实现数据查询服务,本身并不主动提交)
2、 CarInfoRegistry:服务器缓存,模拟定时更新汽车运行实时数据
方案二优点:
1、 为客户端应用带来更大自由度,借助事件监听器控制自己想要访问的内容,一个服务可监控一系列注册的事件,或者向多个服务发起数据请求,实现动态的插拔;
2、 有一些服务是外部开发的,要实现主动提交信息、集成比较困难,借助一个中间件来整合更方便、可行性更高,中间件也能更好的监控相关服务的运行和使用情况;
3、 如果客户端响应相同事件的客户程序较多时,能有效的减轻服务器负担;
实现代码:
服务器端:
数据实体:
客户端(客户需添加CarInfoServer的web引用):
Silverlight实时仪表实现:
仪表XAML:
仪表后台代码:
主页面事件注册:
结束语:事件监控器通过对访问WCF的事件进行包装,通过轮循的方式定时请求数据,并不是真正的实时监控,而数据请求的频率、客户端数量、服务器负载能力,都要求我们必须可控,如果过于频繁可能会压垮服务器。