观察者模式在地震预警系统中的应用
2021-03-13周跃勇李水龙于伟恒周施文
周跃勇 李水龙 于伟恒 周施文
摘 要:观察者模式定义对象间一对多的依赖关系,通过松耦合设计使对象间的依赖最小化。从地震预警系统研发的角度来看,波形数据的实时接收与高效处理是一个关键难点。通过应用观察者模式,实现了波形接收与数据处理的功能解耦,允许系统动态灵活地加入新的波形数据,提升了系统的可扩展性,使得系统具备较好的演化能力,能够较好地适应新的业务需求。
关键词:地震预警;观察者模式;发布-订阅模式;功能解耦
中图分类号:TP311;P315 文献标识码:A文章编号:2096-4706(2021)15-0128-03
Abstract: The observer pattern defines one-to-many dependencies among objects, and minimizes the dependencies among objects through loose coupling design. From the perspective of the research and development of earthquake early warning system, the real-time receiving and efficient processing of waveform data is a key difficulty. Through the application of observer pattern, the function decoupling of waveform receiving and data processing is realized, which allows the system to dynamically and flexibly add new waveform data, improves the scalability of the system, and makes the system have better evolution ability, and can better adapt to new business requirements.
Keywords: earthquake early warning; observer pattern; publish-subscribe mode; function decoupling
0 引 言
地震预警,是在地震发生后,基于地震发生地附近地震台站实时观测到的地震波初期信息,快速估计地震参数并预测地震对周围地区的影响程度,抢在破坏性地震波到达震中周围的预警目标区之前,发出主要震动的强度和到达时间的预警信息。预警目标区内民众和企业可以根据预警信息启动地震应急处置措施,以达到减少地震人员伤亡以及降低地震次生灾害损失的目的。
我国自2001年起开启地震预警技术研究,并在汶川地震后,开始加速地震预警系统的研究和建设,相继建成福建、首都圈和甘肃等地震预警示范系统。2010年,“国家地震烈度速报与预警工程”获得立项,2015年6月项目获得国家发展改革委批准,项目完成后我国五大重点预警区地震台网平均台间距达到12公里。对地震预警系统的研发来说,波形数据的实时接收与高效处理是一个难点问题,尤其是随着国家工程的落地实施,全国地震台网台站规模不断增加,对地震预警系统的处理能力提出了更高的要求。为了实现地震事件的定位、震级量算以及震动场预测等功能,需要对波形数据进行多种形式的在线处理,以适应海量多源异构數据的高效处理。为了更好地支持地震预警的高效处理和功能扩展,需要在波形数据的实时接收与高效处理之间建立灵活的动态关联,允许根据实际情况在需要时引入新的波形数据处理能力。
这需要我们在研发地震预警系统时,寻找支持在波形数据源与后续处理之间提供灵活可扩展关联的技术手段,观察者模式能够较好地解决地震预警系统的灵活扩展问题,本文以福建省地震局研发的地震预警系统为例,介绍观察者模式在地震预警系统中的应用。
1 观察者模式
观察者模式是一种行为模式,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并被自动更新,也被称为发布—订阅模式,该模式中的关键对象是主题和观察者。
2 应用场景分析
从上文可知,观察者模式能够在紧密协作的对象间建立起灵活的关联,达到功能解耦的目的,很适合应用于地震预警系统,搭建一套灵活可扩展的动态关联机制,解决波形数据接收与高效处理之间的难点问题。
通常,对波形数据进行接收和处理的典型做法为:在接收到新的波形数据后,依次调用仿真变换、震相捡拾、卓越周期计算、幅值量测等处理过程。这是一个串行的调用处理流程,只有在整个处理过程完成后,才能接收下一批新的波形数据。对于7×24小时无间断、每个通道每秒采样上百次的地震监测来说,处理过程中很容易形成堵塞导致数据滞后,从而影响对地震事件的实时监测处理。图1是常规处理流程示意图。
应用观察者模式后,以波形数据接收为主题,以仿真变换、震相捡拾、卓越周期计算、幅值量测等处理作为观察者,与主题之间建立起动态的关联。当有新的波形数据到达时,这些观察者及时得到通知,从而取得刚到的波形数据,独立进行各自的计算操作,同时可以继续接收下一批新的波形数据,形成不间断的循环处理流程。通过观察者模式的应用,有效提升了整个环节的处理效率,保证了地震预警的时间效能。图2是应用观察者模式的处理流程示意图。
3 方案设计与实现
在观察者模式中,主题与观察者的互动协作包含两部分内容:
(1)主题提供的注册、注销功能,供观察者调用从而完成两者之间的动态关联,以及当主题的状态发生变化时用于告诉观察者的通知功能。
(2)主题的状态发生变化触发观察者对应的处置操作的功能。第一部分的功能较为通用,第二部分的功能与具体的应用情景有关。在设计解决方案时,可以根据通用程度的不同而分层实现两部分的功能。
为了提高解决方案的复用能力,在系统里首先设计一套通用的观察者模式框架,实现观察者模式的注册、注销、通知等基础功能。在解决具体应用问题时,根据实际业务的要求,在继承通用框架资源的基础上,实现具体的主题和处理接口,从而保持资源复用和灵活扩展之间的平衡。
图3是通用观察者框架的示意类图,利用了Java语言的模板机制,较好地实现了观察者模式通用处理逻辑与业务处理逻辑的分离。
以下是通用观察者框架实现的部分核心代码。类AbstractObservable<E>是利用模版机制实现的抽象主题,解耦了注册、注销、通知等通用逻辑与具体的业务处理逻辑(由观察者E实现)的分离。
public abstract class AbstractObservable<E> {//E:观察者实现的接口
protected List<E> observers = new CopyOnWrite ArrayList<E>();
//添加新的观察者
public void register(E observer) {
if (!observers.contains(observer)) {
observers.add(observer);
}
}
//注销指定观察者
public void unregister(E observer) {
if (observers.contains(observer)) { observers.remove(observer);
}
}
//依次通知观察者
protected final void invoke(Object[] obs) {
ArrayList<E> errors = new ArrayList<E>();
for (E observer: observers) {
try {
invokeObserver(observer, obs);
}catch(Exception e) {
logger.error(“”+observer, e);
errors.add(observer);
}
}
}
//子类必须覆盖本函数
protected abstract void invokeObserver(E observer, Object[] obs);
}
具体到波形数据接收与处理,仿真变换、震相捡拾、震级量测等处理的算法逻辑的差异性是比较大的,需要对这些处理进行抽象提炼,形成统一标准的操作接口。
由此设计了IDataArrive接口,用于定义波形数据处理的标准函数规格。以下是关于波形数据接收处理的观察者模式具体实现的核心代码。类DataArriveObservable是波形数据到达的具体主题,继承了抽象主题AbstractObservable <IDataArrive>,此处用接口IDataArrive代表了模版E的实现。
public class DataArriveObservable extends Abstract Observable<IDataArrive> {
//供外部调用通知观察者
public void notifyObservers(byte[] data) {
Object[] obs = new Object[]{data};
super.invoke(obs);
}
//通知具体观察者
protected void invokeObserver(IDataArrive observer, Object[] obs) {
byte[] data = (byte[])obs[0];
observer.dataArrive(data);
}
}
public interface IDataArrive {
public void dataArrive(byte[] data);
}
圖4是波形数据接收处理的观察者实现的调用序列图。
地震预警系统需要7×24小时实时不间断地高效处理海量台站的地震波形数据,图5为系统运行后台界面。
4 结 论
通过在地震预警系统中应用观察者模式,结合配置信息,允许系统动态灵活地加入新的波形数据,提升了系统的可扩展性,随着对地震预警技术研究的不断深入,基于观察者模式的地震预警系统能够实现模块化扩展和升级完善,使得系统具备较好的演化能力,能够较好地适应新的业务需求。随着国家地震烈度速报与预警工程的实施,我国地震台网规模快速增加,地震台站数量由千台级迈向万台级,观察者模式实现了波形接收与数据处理的功能解耦,为地震预警系统由单台处理向集群化处理的转变奠定了技术基础。
参考文献:
[1] 埃里克·伽玛.设计模式——可复用面向对象软件的基础 [M].李英军,等译.北京:机械工业出版社,2019.
[2] 马强.地震预警技术研究及应用 [D].哈尔滨:中国地震局工程力学研究所,2008.
[3] 张红才.地震预警系统关键技术研究 [D].哈尔滨:中国地震局工程力学研究所,2014.
[4] 李山有,金星,马强,等.地震预警系统与智能应急控制系统研究 [J].世界地震工程,2004(4):21-26.
[5] 马强.强震观测数据实时处理方法的研究 [D].哈尔滨:中国地震局工程力学研究所,2002.
[6] 赵鹤,洪玫,杨秋辉,等.基于观察者模式的实时系统验证方法 [J].计算机科学,2017,44(12):156-162+174.
作者简介:周跃勇(1975—),男,汉族,福建连城人,工程师,硕士研究生,研究方向:地震预警与烈度速报技术研究与系统研发。
3618500338290