SymmetricDS路由配置:如何仅在无特定节点记录时路由ALL记录
嘿,这个需求我之前在项目里刚好碰到过,用SymmetricDS的表达式路由就能解决,核心思路就是让特定节点的配置优先,ALL配置只在目标节点没有对应特定记录时兜底生效。下面给你详细讲怎么配置:
解决方案核心思路
我们要在路由规则里动态判断:对于当前目标节点,如果存在同业务实体的特定节点配置记录,就跳过ALL的那条;如果不存在,才把ALL记录路由过去。不需要写复杂的自定义Java路由类,用router_expression结合SQL子查询就能实现。
先假设你的表结构(方便举例):
- 表名:
business_sync_table - 业务关联主键:
biz_id(用来标识"同一条记录"的业务实体,比如同一个商品ID) - 节点标识列:
target_node(值为ALL或具体节点ID,如001)
具体Router配置步骤
- 添加/更新路由规则
在SymmetricDS的sym_router表中插入或更新路由配置,重点是router_expression字段的逻辑:
INSERT INTO sym_router ( router_id, source_node_group_id, target_node_group_id, router_type, router_expression, create_time, last_update_time ) VALUES ( 'biz_sync_priority_router', 'source_group', 'target_group', 'expression', -- 核心判断逻辑 "(target_node = :TARGET_NODE_ID) OR (target_node = 'ALL' AND NOT EXISTS ( SELECT 1 FROM business_sync_table bc WHERE bc.biz_id = :SOURCE_ROW.biz_id AND bc.target_node = :TARGET_NODE_ID ))", CURRENT_TIMESTAMP, CURRENT_TIMESTAMP );
- 拆解表达式逻辑
这个表达式分两部分,完美实现你的需求:
target_node = :TARGET_NODE_ID:如果当前记录的节点标识就是目标节点ID,直接路由(优先匹配特定节点的配置)target_node = 'ALL' AND NOT EXISTS (...):如果当前记录是ALL配置,就检查目标节点有没有同业务实体的特定配置记录——只有当没有时,才路由这条ALL记录
- 关联到触发器
确保你的同步触发器关联了这个路由规则,比如:
UPDATE sym_trigger SET router_id = 'biz_sync_priority_router' WHERE trigger_id = 'business_sync_trigger';
注意事项
- 一定要保证
biz_id能准确关联"同一条业务记录"的不同配置,否则子查询会失效;如果有多个业务关联字段,子查询的WHERE条件要把所有字段都加上 - 如果表数据量较大,建议给
biz_id和target_node建立联合索引,避免子查询拖慢路由性能 - 测试时可以查看
sym_data表的路由结果,或者开启SymmetricDS的调试日志,观察路由判断的过程
内容的提问来源于stack exchange,提问作者CSL
相关产品推荐
相关产品推荐

