WSO2 SP HA集群下TCP分发Sink异常问题咨询
咱们拆解你遇到的两个问题,逐一分析原因和解决办法:
问题1:单节点宕机时主动节点仍丢弃事件
你看到的Dropping event at Sink 'tcp' at 'DistributionStream' as its still trying to reconnect!错误,核心问题出在分发策略选错了。
你当前用的是broadcast策略,这个策略的逻辑是把事件同时发送到所有配置的目标节点——哪怕其中一个节点宕机,只要有一个目标不可达,整个发送操作就会判定失败,进而丢弃事件。而forcePublish=true的作用只是在无法建立初始连接时,把事件暂存到本地队列,但它改变不了broadcast必须所有目标都可达的核心规则。
解决办法:
把分发策略改成failover,这才是HA场景下的正确选择。failover会按顺序尝试目标节点,第一个节点不可达就自动切换到下一个存活节点,只要集群里有节点正常运行,事件就能成功投递。修改后的Distributor Siddhi配置如下:
Distributor.siddhi @sink(type='tcp' , sync='false', @map(type='json'), @distribution( forcePublish='true', strategy='failover', @destination( url='tcp://x.x.x.0:7612/ExecutorSourceStream'), @destination( url='tcp://x.x.x.1:7612/ExecutorSourceStream'))) define stream DistributionStream( test string );
另外建议把sync改成false(异步发送),这样就算目标节点暂时不可达,事件会先存在本地队列,等连接恢复后自动重试,避免同步发送时的阻塞和丢事件问题。
问题2:双节点正常时被动节点未分发事件,仅半数事件入库
这个问题的原因主要有两方面:
1. broadcast策略导致事件分流+主备角色未生效
broadcast会把事件同时发去两个节点,而如果你的HA集群没有正确配置主备选举(比如没连ZooKeeper做状态同步),两个节点可能都默认自己是被动节点,或者被动节点没有触发“把事件转发到主动节点”的逻辑。结果就是每个节点各自接收EI的一半事件,被动节点的事件存进本地队列,只有主动节点的事件入库,自然只能看到半数数据。
2. 同步发送的阻塞问题
你当前sync='true'是同步发送,需要主动节点立即响应。如果主动节点的TCP Source处理慢或者有连接延迟,被动节点会认为发送失败,直接把事件存进本地队列,而不是成功分发到主动节点。
解决办法:
- 先切换到
failover分发策略(参考问题1的配置修改),确保被动节点的事件只会发给当前存活的主动节点。 - 检查ZooKeeper集群配置:WSO2 SP的HA必须依赖ZooKeeper做主备选举和状态同步,确保两个节点都连接到同一个ZooKeeper集群,并且在
deployment.yaml里正确配置了ZooKeeper相关参数,以及Siddhi应用的HA模式。只有主备角色正确选举后,被动节点才会自动把接收到的事件转发到主动节点。 - 验证节点间的端口连通性:确保两个节点的7612端口能互相访问,防火墙没有拦截这个端口的通信——被动节点连不上主动节点的TCP Source,自然没法分发事件。
- 把
sync改成false启用异步发送,让事件先存本地队列,再后台重试发送,避免同步发送的阻塞问题。
内容的提问来源于stack exchange,提问作者Dominik Zatloukal

