3.6. Routers
目前的实现中提供的Route实现包含:
1. Default Router:这个Router发送所有的数据到Router中定义的目标节点所属的组中的所有的节点。
2. Column Match Router:这个Router可以将一个列的旧值(数据源表中此列的值)或者新值(将要在目标节点设置的值)与一个常量值或者节点的external_id和node_id的值比较。
3. Lookup Router:这个Router可以被配置,在路由数据时,基于已经存在的表或者从属表,确定是否执行路由操作。
4. Subselect Router:这个Router对数据库执行一个SQL表达式来选择要路由到的节点。这个SQL表达式可以被传入某个列的旧值(数据变化之前的值)或者新值(数据变化之后的值)。
5. Scripted Router:这个Router执行一个Bean脚本表达式以选出要路由到的节点。这个脚本可以使用某个列的旧值或者新值。
6. XML Publishing Router:这个Router直接发布数据的变化到一个消息解决方案,而不是传送这些变化给一个已经注册的节点。这个Router必须被手工配置为以XML格式作为扩展点。(可以跟kafka结合,然后数据就可以进入hadoop生态系统了)
7. Audit Table Router:这个Router将数据插入到一个自动创建的审计表中。这个Router记录捕获到的数据变化到与其关联的表中。
Trigger和Router是多对多的关系。这意味着,一个触发器可以捕获数据变化然后路由这些变化到多个位置。也意味着一个Router可以与过个不同的触发器相联系。
3.6.1. Default Router
最简单的Router,这是一个发送所有相关的触发器捕获到的数据到所有router中定义的目标节点所属的组中所有节点的Router。一个Router以ROUTER表中的一行数据代表。然后连接到TRIGGER_ROUTER表。
下面这个SQL语句定义了一个Router,这个Router将从“corp”组发送数据到“store“组。
insert into SYM_ROUTER (router_id,
source_node_group_id, target_node_group_id, create_time,
last_update_time) values ('corp-2-store','corp', 'store',
current_timestamp, current_timestamp);
下面的SQL语句建立上边的Router与item触发器的映射。
insert into SYM_TRIGGER_ROUTER
(trigger_id, router_id, initial_load_order, create_time,
last_update_time) values ('item', 'corp-2-store', 1, current_timestamp,
current_timestamp);
3.6.2. Column Match Router
有时可能会有这样的需求,数据需要根据数据的当前值(数据变化发生之后)或者某个列的先前的值(数据变化发生之前)来决定是否需要被路由。在插入ROUTER系统表时设置router_type为column可以配置一个Column Router,然后在设置router_expression列为一个等式,这个等式代表了某个列的期望值。
表达式的第一部分总是一个列名。这个列名应该总是用大写字母定义。大写的列名以OLD_作为前缀可以用来比较这个列的旧值。表达式的第二个部分可以使一个常量,一个可以代表另一个列的符号或者可以代表其他的SymmetricDS概念的符号。符号的值总是以冒号(:)开始。
当一个表的状态列被设置为“READY TO SEND”的时候,数据变化才被路由到目标节点组的所有节点。下面的SQL语句将在ROUTER表中插入一个column router来完成这个需求。
insert into SYM_ROUTER (router_id,
source_node_group_id, target_node_group_id,router_type,
router_expression,create_time, last_update_time) values
('corp-2-store-ok','corp','store', 'column', 'STATUS=READY TO SEND',
current_timestamp,current_timestamp);
当一个表的状态列的值被修改时,变化的数据才被路由到目标组的所有节点。下面的SQL语句将在ROUTER表中插入一个column router来完成这个需求。注意OLD_STATUS的使用,OLD_前缀可以访问这个列的旧值。
insert into SYM_ROUTER (router_id,
source_node_group_id,target_node_group_id, router_type,
router_expression,create_time, last_update_time) values
('corp-2-store-status','corp','store', 'column', 'STATUS!=:OLD_STATUS',
current_timestamp,current_timestamp);
一个表的数据变化发送到目标节点组中一个节点的external id与此表的STORE_ID列的值匹配的节点。下面的SQL语句将插入ROUTER表中一个column router来实现这个需求。
insert into SYM_ROUTER (router_id,
source_node_group_id,target_node_group_id, router_type,
router_expression,create_time, last_update_time) values
('corp-2-store-id','corp','store', 'column', 'STORE_ID=:EXTERNAL_ID',
current_timestamp,current_timestamp);
一个节点的下面3个属性可以被引用:
1. :NODE_ID
2. :EXTERNAL_ID
3. :NODE_GROUP_ID
在route过程中,总是可以捕获EXTERNAL_DATA的值作为一个虚拟列。
一个表的数据变化需要被路由到一个重定向节点,这个节点的external id在REGISTRATION_REDIRECT表中定义。下面的SQL语句将在ROUTER表中插入一个column router来实现这个需求。
insert into SYM_ROUTER (router_id,
source_node_group_id,target_node_group_id, router_type,
router_expression, create_time,last_update_time) values
('corp-2-store-redir