1、客户端启动时nats server连不上

代码段:

   func setupConnOptions() []nats.Option {opts := make([]nats.Option,0)opts = append(opts, nats.ReconnectWait(2*time.Second))opts = append(opts, nats.DisconnectErrHandler(func(nc *nats.Conn, err error) {if !nc.IsClosed() {log.Errorf("Disconnected due to: %s", err)}}))opts = append(opts, nats.ReconnectHandler(func(nc *nats.Conn) {log.Warnf("Reconnected [%s]", nc.ConnectedUrl())pubDataInStr(js, "lz.002", "version2.0")}))opts = append(opts, nats.ClosedHandler(func(nc *nats.Conn) {if !nc.IsClosed() {log.Fatal("Exiting: no servers available")} else {log.Fatal("Exiting")}}))return opts
}

IP地址存在,没有开对应端口:

connect error: dial tcp 10.17.1.10:30099: connectex: No connection could be made because the target machine actively refused it.

IP 地址不存在:

 connect error: dial tcp 10.1.1.1:30099: i/o timeout

结论:
即使设置了nats.ReconnectWaitnats.ReconnectHandler,仍然会返回失败,nats客户端不会自动重连

需要设置nats.RetryOnFailedConnect(true),才会在第一次失败后主动重试,但会返回,返回数据中status为连接失败:

  $ go run main.go
connect ok:  3
DeleteStream LZ error: context deadline exceeded
AddStream error: context deadline exceeded
pub error:  nats: timeout
time="2021-09-27T16:56:35+08:00" level=warning msg="Reconnected [nats://1.1.91.10:30026]"

状态1是连接ok,状态3是RECONNECTING

不受断链影响的接口:
JetStream
jsm.New

受断链影响的接口:
AddStream
LoadOrNewConsumer
返回 context deadline exceeded

2、连上后断开

这种情况下会自动重连:
先回调nats.DisconnectErrHandler
再回调nats.ReconnectHandler

Disconnected due to: read tcp 1.1.91.11:50608->1.1.91.10:30026: wsarecv: An existing connection was forcibly closed by the remote host."Reconnected [nats://1.1.91.10:30026]"

重连后js(nc.JetStream())不用重新创建,仍然可以使用。

opts = append(opts, nats.ReconnectHandler(func(nc *nats.Conn) {log.Warnf("Reconnected [%s]", nc.ConnectedUrl())pubDataInStr(js, "lz.002", "version2.0")}))

测试结果:

$ go run main.go
connect ok:  1
pub subj ok: lz.001
time="2021-09-27T16:40:01+08:00" level=error msg="Disconnected due to: EOF"
time="2021-09-27T16:40:18+08:00" level=warning msg="Reconnected [nats://1.1.91.10:30026]"
pub subj ok: lz.002

subscribe接口:

sub, err := js.Subscribe(subj, func(m *nats.Msg) {fmt.Printf("Rcv Msg: %s-%s\r\n", m.Subject, string(m.Data))}, nats.DeliverAll())if err != nil {fmt.Println("Subscribe error: ", err)} else {fmt.Println("Subscribe ok: ", sub.Subject)}
}

server断链后重连不会再接收到新消息:

Subscribe ok:  _INBOX.46NhsRVlUW7yfgC3lphpAr
Rcv Msg: temp1011.001-version1.0time="2021-10-12T14:21:07+08:00" level=error msg="Disconnected due to: EOF"
time="2021-10-12T14:21:43+08:00" level=warning msg="Reconnected"

可以看出,因为subscribe接口是立马返回失败或成功的,所以subscribe接口本身没有办法告知连接断开导致订阅不可用。必须从connection级别感知并重新订阅。

consumer.NextMsg()接口
此接口不用关心断链重连,断链期间返回context deadline exceeded,没有数据超时也返回context deadline exceeded。
重连后仍然可以读到断链期间增加的数据。

但是NextMsg没有定义interface,不好打桩测试

nats断链情况总结相关推荐

  1. 前车之鉴:半导体厂商是如何在SARS中避免“断链危机”的?

    新型冠状病毒的出现,总会让人想起十七年前的非典战役.同样的是全民动员,满城风雨,对病毒的恐惧,乃至对一整年经济形势的担忧,都沉甸甸地压在每个人心头. 对于资本市场来说,它们的表现也的确非常相似. 20 ...

  2. (53)进程结构体EPROCESS,擦除 DebugPort 实现反调试,ActiveProcessLinks 断链实现进程隐藏

    一.进程的作用 进程最重要的作用是提供了CR3,10-10-12分页下CR3指向页目录表,2-9-9-12分页下CR3指向页目录指针表. 每个进程有一个或多个线程.本质上,没有进程切换,只有线程切换. ...

  3. 断链在平曲线计算中的处理——短链篇

    第十二篇  断链在平曲线计算中的处理--短链篇 1. 短链在平曲线编程数据库里的处理方法 断链是在一些线路设计或施工中因某种情况下而产生的,具体原因在此不做讨论,短链就是断链的其中一种常见形式,另一种 ...

  4. 应用使用Druid连接池经常性断链问题分析

    前段时间有应用使用Druid连接池经常的提示断链报错,整个问题排查分析过程很有意思.这里将Druid连接池.数据库层以及负载均衡层的配置分析下,记录整个问题的分析过程,同时梳理下Druid连接池的配置 ...

  5. 2023王道数据结构P40题二.1,关于是否会断链的问题

    链表在删除一个结点p时为保证不断链,需要在删除前将p的前驱与后继链接起来,即p的前驱的指针域指向p的后继的地址,若将p的前驱记作q,可表示为q->next = p->next,也即为q-& ...

  6. AutoCAD Civil 3D-路线-断链的处理

    因施工期内根据现场情况发生设计变更导致的线路改线,使得线路比原设计线路长短发生变化,通常是比原线路变长.对于线路断链处理,在Civil 3D里只需在线路特性里设置断链点及其前后桩号就可以了. 设置断链 ...

  7. 数据结构:关于链表直接free(p)会不会造成断链

    设计一个递归算法,删除不带头结点的单链表L中所有值为x的节点. 代码: void DEL_X(LinkList &L,ElemType x){LNode *p;if(L==NULL)retur ...

  8. WIFI连接失败以及断链问题定位分析

    大家好,我又来了~ 秀一波最近解BUG学到的东西:WIFI连接和断链.其实本文也不算问题分析,顶多算是问题定位吧?! 目录 1.密码错误导致的连接失败 2.关联被拒绝 3.热点未回复AUTH_RSP或 ...

  9. Netty ChannelInactive 断链场景分析

    本文档主要列举离会.关闭进程.断网.重连等会导致sdk与服务端断开连接的场景的设计与实现,并试图解释其原理 1.Netty断链场景分析 1. Netty对断链的处理 简单来说Netty在检测到断开连接 ...

最新文章

  1. IOS学习笔记(四)之UITextField和UITextView控件学习
  2. 盯紧那群养生的年轻人,他们的焦虑值300亿
  3. 利用HTML5 LocalStorage实现跨页面通信channel
  4. 记第十七次CCF CSP认证
  5. SoapUI测试webservice接口
  6. ntpdate 安装_SAS 9.4 安装教程
  7. 宝藏级UI组件库:FirstUI,微信小程序版+uniapp版更新至1.6.0,完美支持vue3
  8. matlab 8fsk,MFSK蒙特卡洛仿真与理论误码率的对比
  9. 变换模型——仿射变换和透射变换
  10. 房屋租赁管理系统API
  11. 自然数学-微积分的基本公式
  12. excel文档损坏打不开该如何修复呢?
  13. 建立区域经济大脑,驱动产业创新发展
  14. Android 实战项目:简单计算器
  15. 【uni-app】Hbuilder打包h5发行到web服务器
  16. 重复登录问题解决的方案汇总
  17. vSphere之VMkernel网络层
  18. MySQL 使用profile分析慢sql,group left join效率高于子查询
  19. 【SQL开发实战技巧】系列(十三):讨论一下常用聚集函数通过执行计划看sum()over()对员工工资进行累加
  20. frps 多个_frp服务器server端是否支持多个frpc客户端?

热门文章

  1. 抖音昵称html,抖音书单账号昵称_抖音网名大全
  2. 四柱笔记(一):基本阴阳理论
  3. win7 64位利用eclipse搭建android开发环境教程
  4. linux 版本号 笔记本_2019 年最佳 Linux 笔记本电脑发行版 top10
  5. canopen 报文格式_CANopen协议报文处理
  6. win10 SystemParametersInfo 设置屏保 不好使_[教程]win10 ,ubuntu双系统安装避坑指南
  7. UOS安装 MySQL5.7
  8. 第八届蓝桥杯Java A组决赛第一题
  9. Python 生成、识别社会统一信用代码
  10. 组播域GNS3与eNSP桥接以及GNS3的使用教程