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
重連后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.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斷鏈后重連不會再接收到新消息:
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断链情况总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cent OS 7 的日常操作
- 下一篇: 等视距游戏 地图X和Y转换