现在的位置: 首页 > 综合 > 正文

一个延迟处理事例

2013年07月28日 ⁄ 综合 ⁄ 共 950字 ⁄ 字号 评论关闭

项目中需要增加配置告警功能,配置告警流程简要如下:
主线程注册配置告警处理能力,读取配置,如果配置项无效,向主线程发送一个告警消息,主线程处理告警消息

编码,测试,发现有部分告警信息发送了,但主线程未处理,追踪后,发现部分配置告警发生于主线程注册能力集之前

尝试修改:

1. 让主线程的注册配置告警代码提前:
    1. 发现会影响到所有的其他模块,因为要修改对外接口,
    2. 更严峻的问题是,这种办法根本不可行:
        1. 假设将能力集注册的代码提到最前,此时如果能力集注册发生任何错误,都不会有日志生成,
            因为日志的配置还未读取,日志子模块还未初始化(新问题)
        2. 假设先初始化日志,就要先读取日志配置,期间无效配置引发的告警信息,
            因主线程还未注册能力集,故都不会被接收到(当前问题)
    由上知,简单提前注册能力集,会引发新的问题,比如:注册能力集时出现问题时,不会再产生日志输出

2. 想到缓存告警信息,再延迟处理:
    1. 在能力集注册模块增加一个标识:指明能力集是否已经注册完成,初始化为否:
        1. 如果告警时,能力集未注册完成,缓存告警信息
        2. 正常时间注册能力集,注册完成后,修改标识,处理缓存中的告警信息
        3. 如果告警时,能力集已经注册完成,直接将告警信息发送到主线程,让主线程处理
        但是,这样也还是有一个问题:
            1. 告警模块需要调用能力集模块的方法,去获知能力集是否已经注册完成
            2. 能力集模块需要调用告警模块的方法,去获取缓存的告警信息
        两个模块(动态库)相互依赖,编译会有问题,不行

    2. 改在告警模块增加一个标识:指明是否需要缓存告警信息,初始化为是:
       1. 如果告警时,需要缓存告警信息,缓存之 (使用双重判断优化锁的处理)
       2. 正常时间注册能力集,注册完成后,调用告警模块函数将缓存标识置为否,
           调用告警模块函数获取缓存的告警信息
       3. 如果告警时,不需要缓存告警信息,直接将告警信息发送到主线程,让主线程处理
       现在,没有有动态库的相互依赖问题。

利用缓存延迟处理技术,解决问题。
  

抱歉!评论已关闭.