You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WSO2 SP HA集群下TCP分发Sink异常问题咨询

WSO2 SP HA集群问题排查与解决

咱们拆解你遇到的两个问题,逐一分析原因和解决办法:

问题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处理慢或者有连接延迟,被动节点会认为发送失败,直接把事件存进本地队列,而不是成功分发到主动节点。

解决办法:

  1. 先切换到failover分发策略(参考问题1的配置修改),确保被动节点的事件只会发给当前存活的主动节点。
  2. 检查ZooKeeper集群配置:WSO2 SP的HA必须依赖ZooKeeper做主备选举和状态同步,确保两个节点都连接到同一个ZooKeeper集群,并且在deployment.yaml里正确配置了ZooKeeper相关参数,以及Siddhi应用的HA模式。只有主备角色正确选举后,被动节点才会自动把接收到的事件转发到主动节点。
  3. 验证节点间的端口连通性:确保两个节点的7612端口能互相访问,防火墙没有拦截这个端口的通信——被动节点连不上主动节点的TCP Source,自然没法分发事件。
  4. 把sync改成false启用异步发送,让事件先存本地队列,再后台重试发送,避免同步发送的阻塞问题。

内容的提问来源于stack exchange,提问作者Dominik Zatloukal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:13:21