nats断链情况总结
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.ReconnectWait和nats.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断链情况总结相关推荐
- 前车之鉴:半导体厂商是如何在SARS中避免“断链危机”的?
新型冠状病毒的出现,总会让人想起十七年前的非典战役.同样的是全民动员,满城风雨,对病毒的恐惧,乃至对一整年经济形势的担忧,都沉甸甸地压在每个人心头. 对于资本市场来说,它们的表现也的确非常相似. 20 ...
- (53)进程结构体EPROCESS,擦除 DebugPort 实现反调试,ActiveProcessLinks 断链实现进程隐藏
一.进程的作用 进程最重要的作用是提供了CR3,10-10-12分页下CR3指向页目录表,2-9-9-12分页下CR3指向页目录指针表. 每个进程有一个或多个线程.本质上,没有进程切换,只有线程切换. ...
- 断链在平曲线计算中的处理——短链篇
第十二篇 断链在平曲线计算中的处理--短链篇 1. 短链在平曲线编程数据库里的处理方法 断链是在一些线路设计或施工中因某种情况下而产生的,具体原因在此不做讨论,短链就是断链的其中一种常见形式,另一种 ...
- 应用使用Druid连接池经常性断链问题分析
前段时间有应用使用Druid连接池经常的提示断链报错,整个问题排查分析过程很有意思.这里将Druid连接池.数据库层以及负载均衡层的配置分析下,记录整个问题的分析过程,同时梳理下Druid连接池的配置 ...
- 2023王道数据结构P40题二.1,关于是否会断链的问题
链表在删除一个结点p时为保证不断链,需要在删除前将p的前驱与后继链接起来,即p的前驱的指针域指向p的后继的地址,若将p的前驱记作q,可表示为q->next = p->next,也即为q-& ...
- AutoCAD Civil 3D-路线-断链的处理
因施工期内根据现场情况发生设计变更导致的线路改线,使得线路比原设计线路长短发生变化,通常是比原线路变长.对于线路断链处理,在Civil 3D里只需在线路特性里设置断链点及其前后桩号就可以了. 设置断链 ...
- 数据结构:关于链表直接free(p)会不会造成断链
设计一个递归算法,删除不带头结点的单链表L中所有值为x的节点. 代码: void DEL_X(LinkList &L,ElemType x){LNode *p;if(L==NULL)retur ...
- WIFI连接失败以及断链问题定位分析
大家好,我又来了~ 秀一波最近解BUG学到的东西:WIFI连接和断链.其实本文也不算问题分析,顶多算是问题定位吧?! 目录 1.密码错误导致的连接失败 2.关联被拒绝 3.热点未回复AUTH_RSP或 ...
- Netty ChannelInactive 断链场景分析
本文档主要列举离会.关闭进程.断网.重连等会导致sdk与服务端断开连接的场景的设计与实现,并试图解释其原理 1.Netty断链场景分析 1. Netty对断链的处理 简单来说Netty在检测到断开连接 ...
最新文章
- IOS学习笔记(四)之UITextField和UITextView控件学习
- 盯紧那群养生的年轻人,他们的焦虑值300亿
- 利用HTML5 LocalStorage实现跨页面通信channel
- 记第十七次CCF CSP认证
- SoapUI测试webservice接口
- ntpdate 安装_SAS 9.4 安装教程
- 宝藏级UI组件库:FirstUI,微信小程序版+uniapp版更新至1.6.0,完美支持vue3
- matlab 8fsk,MFSK蒙特卡洛仿真与理论误码率的对比
- 变换模型——仿射变换和透射变换
- 房屋租赁管理系统API
- 自然数学-微积分的基本公式
- excel文档损坏打不开该如何修复呢?
- 建立区域经济大脑,驱动产业创新发展
- Android 实战项目:简单计算器
- 【uni-app】Hbuilder打包h5发行到web服务器
- 重复登录问题解决的方案汇总
- vSphere之VMkernel网络层
- MySQL 使用profile分析慢sql,group left join效率高于子查询
- 【SQL开发实战技巧】系列(十三):讨论一下常用聚集函数通过执行计划看sum()over()对员工工资进行累加
- frps 多个_frp服务器server端是否支持多个frpc客户端?
热门文章
- 抖音昵称html,抖音书单账号昵称_抖音网名大全
- 四柱笔记(一):基本阴阳理论
- win7 64位利用eclipse搭建android开发环境教程
- linux 版本号 笔记本_2019 年最佳 Linux 笔记本电脑发行版 top10
- canopen 报文格式_CANopen协议报文处理
- win10 SystemParametersInfo 设置屏保 不好使_[教程]win10 ,ubuntu双系统安装避坑指南
- UOS安装 MySQL5.7
- 第八届蓝桥杯Java A组决赛第一题
- Python 生成、识别社会统一信用代码
- 组播域GNS3与eNSP桥接以及GNS3的使用教程