2016-09-30 97 views
0

比方说,我们有几个事件流。其中一些将参考数据加载到hazelcast事件表中,而另一些则是实际的事件处理器。如何在wso2cep中设置事件流的优先级?

我的目标是,当wso2cep服务器启动时,它首先将运行哪个加载参考数据hazelcast事件表那么它会启动其他流的那些事件流。

这将帮助我们保持在所有的事件流处理器参照数据的一致性。

+0

换句话说,我们可以手动启动和停止每个单独的事件流吗? – Obaid

回答

0

我已经检查hazelcast外部集群,好像它是一个额外的开销,需要为每种类型的表创建DataSerializable类。

所以,我存储维度/参考数据CEP如下决定:

  1. 对于完全开源的项目,我会去,因为我在发表我的另一个答案已经提到的和请阅读评论那里,专业第2(Obaid)&第3(Grainier)。

  2. 对于商业,项目,我会去voltdb。

感谢所有人,特别是格雷耶尔。

0

我可以看到比在个别执行计划内装载其他没有其他选择。 有两种选择:

  1. 使用触发器将参考数据定期从RDBMS加载到Hazelcast。实际过程中会从Hazelcast表上使用(这执行计划已经下面提供)从RDBMS
  2. 加载和缓存它。

所以,在这一刻,我的问题是:

  1. 哪一个是在内存利用方面更好?
  2. 在事件处理速度方面哪一个更好?
  3. 请建议是否有其他更好的方法。

执行计划

@Plan:name('ExecutionPlan') 

/* define streams/tables and write queries here ... */ 
/* Facts/Events streams definition */ 
@Import('actions:1.0.0') 
define stream actions (meta_name string, correlation_id int); 

@Export('userActions:1.0.0') 
define stream userACtions (meta_username string, meta_actionname string); 

/* Dimension tables(Event Tables) definition */ 
-- table from RDBMS 
@from(eventtable = 'rdbms' , datasource.name = 'PG' , table.name = 'users') 
@IndexBy('id') 
define table DBUsers (id int, name string); 

-- table from Hazelcast 
@from(eventtable = 'hazelcast', collection.name='hzUsers') 
@IndexBy('id') 
define table hzUsers (id int, name string); 

/* Load dimension tables, from RDBMS to Hazelcast, periodically using trigger */ 
define trigger periodicTrigger at every 30 sec; 

from periodicTrigger join DBUsers 
select DBUsers.id as id, DBUsers.name as name 
insert into hzUsers; 

/* Actual execution plan */ 

from actions as A 
join hzUsers as H 
on A.correlation_id == H.id 
select H.name as meta_username, A.meta_name as meta_actionname 
insert into userACtions; 
+0

“从RDBMS加载并缓存它”是什么意思?你的意思是直接访问RDBMS表?或者从每个执行计划中访问RDBMS表并定期将其缓存到内存表中?我们正在考虑多少个执行计划?什么是缓存间隔? – Grainier

+0

“从RDBMS加载并缓存它”:我的意思是“从每个执行计划中访问RDBMS表并将其定期缓存到内存表中”。 我们在看多少个执行计划? :可能是30-50。 ,什么是缓存间隔?:根据使用情况,但大多数情况下,它可能是每天一次和几个它可能会低至10秒。 – Obaid

+0

如果我们考虑每个事件表的读取时间,它有点类似于内存中(相同的VM) Grainier