nats断链情况总结
1、客戶端啟動(dòng)時(shí)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地址存在,沒有開對(duì)應(yīng)端口:
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結(jié)論:
即使設(shè)置了nats.ReconnectWait和nats.ReconnectHandler,仍然會(huì)返回失敗,nats客戶端不會(huì)自動(dòng)重連
需要設(shè)置nats.RetryOnFailedConnect(true),才會(huì)在第一次失敗后主動(dòng)重試,但會(huì)返回,返回?cái)?shù)據(jù)中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]"狀態(tài)1是連接ok,狀態(tài)3是RECONNECTING
不受斷鏈影響的接口:
JetStream
jsm.New
受斷鏈影響的接口:
AddStream
LoadOrNewConsumer
返回 context deadline exceeded
2、連上后斷開
這種情況下會(huì)自動(dòng)重連:
先回調(diào)nats.DisconnectErrHandler
再回調(diào)nats.ReconnectHandler
重連后js(nc.JetStream())不用重新創(chuàng)建,仍然可以使用。
opts = append(opts, nats.ReconnectHandler(func(nc *nats.Conn) {log.Warnf("Reconnected [%s]", nc.ConnectedUrl())pubDataInStr(js, "lz.002", "version2.0")}))測(cè)試結(jié)果:
$ 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.002subscribe接口:
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斷鏈后重連不會(huì)再接收到新消息:
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"可以看出,因?yàn)閟ubscribe接口是立馬返回失敗或成功的,所以subscribe接口本身沒有辦法告知連接斷開導(dǎo)致訂閱不可用。必須從connection級(jí)別感知并重新訂閱。
consumer.NextMsg()接口
此接口不用關(guān)心斷鏈重連,斷鏈期間返回context deadline exceeded,沒有數(shù)據(jù)超時(shí)也返回context deadline exceeded。
重連后仍然可以讀到斷鏈期間增加的數(shù)據(jù)。
但是NextMsg沒有定義interface,不好打樁測(cè)試
總結(jié)
以上是生活随笔為你收集整理的nats断链情况总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cent OS 7 的日常操作
- 下一篇: 等视距游戏 地图X和Y转换