Я не вижу другого варианта, кроме загрузки внутри отдельных планов выполнения. Возможны два варианта:
- Используйте триггер для периодической загрузки эталонных данных из РСУБД в Hazelcast. Фактический процесс будет использоваться из таблицы Hazelcast (этот план выполнения приведен ниже)
- Загрузить из СУБД и кешировать его.
Таким образом, на данный момент, мои вопросы:
- Какой из них лучше с точки зрения использования памяти?
- Какая из них лучше с точки зрения скорости обработки событий?
- Пожалуйста, предложите, есть ли другой лучший способ.
План выполнения
@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;
Другими словами, можем ли мы запустить и остановить каждый отдельный поток событий вручную? – Obaid