使用第三方Kucoin .Net SDK时Websocket连接无法7*24小时稳定运行问题
配置调整
优化KucoinSocketClientOptions参数如下:
Cliente_Kucoin = new KucoinSocketClient(new Objects.KucoinSocketClientOptions() { ApiCredentials = new Objects.KucoinApiCredentials("xxxxxxxxxxxx", "xxxxxxxx", "xxxxx"), AutoReconnect = true, // 无限次重连,避免达到重连次数上限后停止重试 MaxReconnectTries = null, // 重连间隔增加随机抖动,避免固定间隔触发服务端限流 ReconnectInterval = TimeSpan.FromSeconds(Random.Shared.Next(3,8)), // 15秒发送一次心跳,早于Kucoin服务端30秒无心跳踢线的规则 PingInterval = TimeSpan.FromSeconds(15), PingTimeout = TimeSpan.FromSeconds(5), LogLevel = Microsoft.Extensions.Logging.LogLevel.Trace, // 合并订阅阈值调整为10,减少多余连接数 SocketSubscriptionsCombineTarget = 10 });
代码逻辑修正
- 不要使用
async void声明订阅方法,异常无法被捕获会直接导致进程崩溃,改为async Task,同时全局包裹try-catch捕获所有异常 - 一次性提交所有交易对订阅,不要分多次调用订阅接口
- 保存订阅返回的操作结果和订阅对象,校验订阅状态,监听连接异常事件
修正后的订阅代码示例:
// 全局保存所有订阅对象,用于后续监听事件和主动退订 private List<UpdateSubscription> _allSubscriptions = new List<UpdateSubscription>(); private async Task Listener_Cryptos() { try { // 收集所有需要订阅的交易对 var allSymbols = new[] { BTC.Tickets, ETH.Tickets, BNB.Tickets, ADA.Tickets, XRP.Tickets }; // 一次性提交订阅 var subResult = await ClienteKucoin.Spot.SubscribeToTickerUpdatesAsync(allSymbols, data => { // 按交易对分发处理逻辑 if(data.Symbol == BTC.Tickets) BTC.Trade(data); else if(data.Symbol == ETH.Tickets) ETH.Trade(data); else if(data.Symbol == BNB.Tickets) BNB.Trade(data); else if(data.Symbol == ADA.Tickets) ADA.Trade(data); else if(data.Symbol == XRP.Tickets) XRP.Trade(data); }); // 校验订阅是否成功 if(!subResult.Success) { // 记录错误日志,延迟后重试订阅 _logger.LogError("订阅失败:{Error}", subResult.Error); await Task.Delay(TimeSpan.FromSeconds(10)); _ = Listener_Cryptos(); return; } // 保存订阅对象,监听连接事件 _allSubscriptions.Add(subResult.Data); subResult.Data.ConnectionLost += async (ex) => { _logger.LogWarning("订阅连接断开,等待自动重连:{Error}", ex?.Message); // 可在此处添加告警逻辑 }; subResult.Data.ConnectionRestored += (time) => { _logger.LogInformation("订阅连接恢复,断开时长:{Duration}", time); }; } catch(Exception ex) { _logger.LogError("订阅过程抛出未捕获异常:{Error}", ex); await Task.Delay(TimeSpan.FromSeconds(10)); _ = Listener_Cryptos(); } }
额外稳定性保障措施
- 定时重建客户端:Kucoin websocket鉴权token默认有效期为24小时,部分版本SDK不会自动刷新token,建议每20小时主动销毁原有
KucoinSocketClient对象,重新初始化并订阅所有交易对 - 增加健康检查:后台启动定时任务,每5分钟检查最近一次收到ticker数据的时间,若超过10分钟无数据推送,主动重建客户端重连,避免连接假活
- 日志持久化:将Trace级别的SDK日志持久化到本地文件,断开连接时优先查看断开前的报错信息,定位是网络问题、服务端限流还是SDK本身的bug
内容的提问来源于stack exchange,提问作者Jose Ernesto Maradiaga Leon
相关产品推荐
相关产品推荐

