多事件引擎实现

初级实现的事件引擎是单实例的,存在应用限制.

1.背景

在主站上ipe_b,data_sync_i都是事件处理器,共用一个t_Sys_EventQueue。
一个事件处理者只有一个CEventHandleMap,其中每个事件只有一个对应的处理函数.
ehong扫描t_Sys_EventQueue,扫描未处理的事件.调用每个注册的事件处理器。
若一个事件2个插件都要响应,第1个事件处理器成功或者按可忽略的错误(如没有对应规则处理)设置事件记录的处理状态.
如果此时进程意外终止,则第2个事件处理器将没有机会对该事件响应。

目前iep_b和data_sync_i都处理的事件有:
    event_controller_->register_handler(EVENT_NEW_GOODS,this,1);
    event_controller_->register_handler(EVENT_GOODSINFO_CHANGED,this,1);

iep_b用于主站业务单据在企业之间的自动转换.也包含上述事件的处理.
响应EVENT_NEW_GOODS,把对于平台的新商品立即写入到主站t_bas_goods表及图片
响应EVENT_GOODSINFO_CHANGED,执行的是把(eid,goodsid)的记录从缓存中删除.

这是在单主站模式下的实现手段:单主站模式下,平台数据库和企业数据库是同一数据库. 

在多主站结构下,如此是错误的.
1.违背了t_bas_goods为只读副本的设计
2.EVENT_GOODSINFO_CHANGED的含义是t_bas_goods的信息改变了,根本不应该存在eid概念.其行为不合逻辑.

因此,从iep_b中删除EVENT_NEW_GOODS,EVENT_GOODSINFO_CHANGED事件的相应代码.

对于iep_b的任何事件,如EVENT_NEW_ORDER.
如果是data_sync_i先处理,顺序取决于iep_b,data_sync_i的加载次序.先加载先处理.

由于data_sync_i没有处理EVENT_NEW_ORDER的规则,将会返回ERROR_NOFOUND_RULE错误.
为避免阻塞,这类错误的记录将被忽略,data_sync_i向ehong登记了可忽略错误:
ehong_->add_ignored_error(ERROR_NOFOUND_RULE);

如果此时进程终止(如由于异常),则iep_b将不会在有机会处理此事件。导致单据没有被转换.

2.方案

事件引擎的3种实现模式:
。单引擎,多处理者:通过HandlerID区分
。单引擎,多存储实例(t_Sys_EventQueue)
。多引擎,每引擎一个存储实例

多引擎可提高并发。
通常事件处理者负责记录和处理感兴趣的事件。
由事件处理者指定所使用的事件引擎,引擎采用唯一名字区分,需要统一规划。
如iep_b使用ee_iep_b,data_sync_i使用ee_data_sync_i。

ehong定义全部事件引擎,各个处理者按名字使用.

3.改造实现

4.使用

如data_sync_i插件中使用.
	string ehong_name_; ///< 事件引擎名称
实现代码:
///< 读事件引擎名称配置
int CDataSynci::ReadPrivateConfig() {
	///...
	
	READ_STRING(root,"event_engine_name",this->ehong_name_);
        return 0;
}
///< 获取指定的事件引擎	
int CDataSynci::CheckValid() {
	parent::CheckValid();
	
	IEhongCluster *eec = reinterpret_cast<IEhongCluster*>(container_->GetResource(EHONG_CLUSTER));
  ehong_ = eec->get_ee(this->ehong_name_.c_str());
	ehong_->add_ignored_error(ERROR_NOFOUND_RULE);
	///...
	
	return 0;
}

data_sync_i.conf相关配置:
<?xml version="1.0" encoding="gb2312" standalone="yes"?>
<config>
	<!-- 事件引擎名称 -->
	<event_engine_name>ee_data_sync_i</event_engine_name>		
</config>

5.配置

ehong.conf配置如下:
<?xml version="1.0" encoding="gb2312" standalone="yes"?>
<config>
	<dbc>yoopa</dbc>
	
	<units>
		<unit>
		<!-- 引擎名称 -->
		<name>default</name>
		<!-- 事件队列表处理间隔时间,单位:秒.默认:10 -->
		<event_queue_scan_interval>60</event_queue_scan_interval> 
	</unit>
	
	
		<unit>
		<!-- 引擎名称 -->
		<name>ee_data_sync_i</name>
		<!-- 数据库连接 -->
		<dbc>yoopa</dbc>
		<!--  数据库表名 -->
		<table_name>t_sys_eventqueue_ds</table_name>
		<!-- 事件队列镜像连接名 -->
		<mirror_dbc></mirror_dbc>
		<!-- 事件队列镜像表名 -->
		<mirror_table_name></mirror_table_name>
		
		<!-- 事件队列表处理间隔时间,单位:秒.默认:10 -->
		<event_queue_scan_interval>60</event_queue_scan_interval> 
	</unit>	
</units>
</config>
default:作为默认引擎的名字.
默认引擎的数据库表名:t_Sys_EventQueue,镜像表名:t_Sys_EventMirror.数据库采用<dbc>设置.

如果未配置<units>则创建一个默认引擎.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值