Observer模式实现状态监控

来源:互联网 发布:linux ssh命令 端口 编辑:程序博客网 时间:2024/04/29 20:15
最近在一个PHP产品中需要加入对数据状态进行监控的功能集。当数据符合或不符合某种预设规则时,需要自动通知用户,通知的形式可以是email、短信、主页推送等。 这样的规则有多个,随着需求的演化,QP和老常会增加新的规则。
 
此时产品已基本成型,要增加该功能,不能对原有实现的其他功能、系统状态有影响。系统对于监控功能来说,是只读的。
 
经设计决策,监控功能采用observer模式的变种来实现。原理如下图。
 
  • DataCollector:负责收集需要监控的数据,并对所有数据遍历,执行预订规则检验。
    • targets 属性: 被监控的数据对象集合,其中每个元素均属于Target类型的对象;
    • iterate 方法:遍历targets,对每项数据调用callObserver方法;
    • callObserve 方法:对接收的数据对象,调用ObserverCenter的notify方法,后者用所有已定义规则一一检查数据对象。
  • Target:被监控的数据对象,具有统一的结构。
    • states 属性:被监控的数据的具体值。
  • ObserverCenter:维护数据检查规则集,并将这些规则应用到被监控数据上。当有通知内容生成时,将针对某一数据项的所有通知打包发送给用户。 在Observer模式中,这个observer的注册机制是包含在Target中的,但在产品中,所有的target来源于多张数据表,需要 DataCollector的在初始化时,进行数据规格化。我们将原始数据的不一致屏蔽在DataCollector中,将公共部分(对数据的监控规则) 集中在ObserverCenter中,有利于后期规则变化时,影响域更小。
    • observers 属性:监控规则对象集合,observer的类名称数组。
    • initObservers 方法:收集所有的监控规则,初始化observers属性。监控规则可存储于DB中,也可以在配置文件中。
    • addObserver 方法和 removeObserver 方法:若监控规则可由用户增减,这两个方法可作为增减接口,将用户操作落实到监控规则的存储地(DB或配置文件)。
    • notify 方法:遍历监控规则集合observers,用这些规则一一检验target数据,即生成一个observer实例,调用其checkTarget 方法。收集这些执行结果(即string类型的通知信息),一并发给用户。
  • AbstractObserver:监控规则虚基类。
    • checkTarget 方法:接收target参数,返回通知内容string,若无通知内容,则返回空串。
  • WinObserver:具体的监控规则实现类,继承AbstractObserver,实现checkTarget方法。
  • DangerObserver:同上。
 
当监控规则需求变化时,只需要改变具体的规则实现类即可。可以定义许多这样的规则实现类,定义类后在存储地(DB、配置文件)登记该类,运行时ObserverCenter将会自动加载实施该规则。
 
对上述模式还有一个可以增强的地方,就是将给用户发送通知的功能从ObserverCenter转移到DataCollector中,可以将某个用户的所有数据聚合后一次发送,避免了一条数据发送一次通知。

<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>