日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nats断链情况总结

發布時間:2024/1/8 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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断链情况总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。