NATS中文开发文档:连接
NATS系統通常由一個帶有nats或tls協議的標準URL標識,例如nats://demo.nats.io。NATS系統可以是單個服務器、小型集群或全局超級集群。在這些示例中,我們將依賴nats.io提供的單個測試服務器,位于nats://demo.nats.io,使用4222作為默認端口。
NATS還支持通過TLS協議使用安全連接。大多數客戶端支持使用URL協議tls自動檢測安全連接。在tls://demo.nats.io:4443還有一個運行TLS的演示服務器。協議要求對于多個客戶端庫是可選的,因此您可以使用demo.nats.io:4222作為URL,并讓客戶端和服務器決定是否需要TLS。
NATS連接有很多選項,從超時到重新連接設置。
連接到默認服務器
一些庫還提供了一種連接到默認url的特殊方式,通常是nats://localhost:4222:
nc, err := nats.Connect(nats.DefaultURL) if err != nil {log.Fatal(err) } defer nc.Close()// Do something with the connection連接到特定服務器
NATS客戶端庫可以使用完整的URL nats://demo.nats.io:4222來指定要連接到的特定服務器主機和端口。
庫正在刪除顯式協議的要求,并可能允許demo.nats.io:4222或僅允許demo.nats.io。在后面的示例中,將使用默認端口4222。請查看特定客戶機庫的文檔,以查看支持哪些URL格式。
例如,要使用URL連接到演示服務器,可以使用:
連接到群集
當連接到集群時,有一些事情需要考慮。
- 為每個群集成員傳遞URL(半可選)
- 連接算法
- 重新連接算法(稍后討論)
- 服務器提供的URL
當客戶端庫首次嘗試連接時,它將使用由連接選項或函數提供的url列表。這些url通常是按隨機順序檢查的,這樣就不會讓每個客戶端連接到同一個服務器。使用第一個成功的連接。可以顯式禁用隨機化。
客戶端連接到服務器后,服務器可以為其提供已知服務器的URL列表。這允許客戶端連接到一臺服務器后,在重連期間仍有其他服務器可用。
為了確保初始連接,您的代碼應該包含一個合理的前端服務器或種子服務器列表。這些服務器可能知道集群的其他成員,并可能告訴客戶機這些成員。但您不必配置客戶端來傳遞集群中每個有效成員到connect方法中。
通過(在連接時)提供傳遞多個連接選項的能力,NATS可以處理機器故障或客戶端不可用的情況。通過添加服務器向客戶機提供已知服務器列表的功能,作為客戶機-服務器協議的一部分,集群創建的網格可以在客戶機運行時有機地增長和更改。
注意,失敗行為依賴于庫,請查看客戶端庫的文檔,了解如果連接失敗會發生什么情況。
servers := []string{"nats://127.0.0.1:1222", "nats://127.0.0.1:1223", "nats://127.0.0.1:1224"}nc, err := nats.Connect(strings.Join(servers, ",")) if err != nil {log.Fatal(err) } defer nc.Close()// Do something with the connection連接名
可以為連接分配一個名稱,該名稱將出現在某些服務器監視數據中。此名稱不是必需的,但強烈建議使用此名稱,因為友好的連接名稱將有助于監視、錯誤報告、調試和測試。
nc, err := nats.Connect("demo.nats.io", nats.Name("API Name Option Example")) if err != nil {log.Fatal(err) } defer nc.Close()// Do something with the connection設置連接超時時間
每個庫都有自己的語言首選方式來傳遞連接選項。最常見的選項之一是連接超時。它限制了建立到服務器的連接所需的時間。如果提供多個URL,則此超時將分別應用于每個群集成員。要將連接服務器的最長時間設置為10秒,請執行以下操作:
nc, err := nats.Connect("demo.nats.io", nats.Name("API Options Example"), nats.Timeout(10*time.Second)) if err != nil {log.Fatal(err) } defer nc.Close()// Do something with the connectionping/pong協議
客戶機和服務器使用一個簡單的PING/PONG協議來檢查它們中的任何一個仍然連接到另一個。客戶端將定期對服務器執行ping操作,服務器將以pong響應。
一旦達到未完成ping的可配置最大值(沒有單個pong回復),連接將作為陳舊連接被關閉。這兩個值一起定義了連接的超時,該超時指定了客戶機收到問題通知的速度。當遠程網絡分區存在操作系統未檢測到套接字錯誤時,這也會有幫助。連接關閉后,客戶端將嘗試重新連接。當它知道其他服務器時,下一步將嘗試連接這些服務器。
在存在擁塞(如消息或客戶端PING)時,服務器不會啟動PING/PONG交互。
對于流量很大的連接,客戶機通常會發現PING之間存在問題,因此默認PING間隔通常為幾分鐘。要將間隔設置為20秒并將未完成的ping限制為5次,從而在100秒不活動后強制關閉連接:
// Set Ping Interval to 20 seconds nc, err := nats.Connect("demo.nats.io", nats.Name("API Ping Example"), nats.PingInterval(20*time.Second), nats.MaxPingsOutstanding(5)) if err != nil {log.Fatal(err) } defer nc.Close()// Do something with the connection關閉echo消息
默認情況下,如果連接對已發布的主題也感興趣,則NATS連接將回顯消息。這意味著,如果連接上的發布者向某個主題發送消息,則同一連接上的任何訂閱服務器都將收到該消息??蛻魴C可以選擇關閉此行為,這樣無論是否感興趣,消息都不會傳遞到同一連接上的訂閱服務器。
NoEcho選項在所有應用程序訂閱并發布到同一主題的總線模式中非常有用。通常,發布表示應用程序已經知道狀態更改,因此在應用程序發布更新的情況下,不需要處理更新本身。
請記住,每個連接都必須關閉echo,并且是每個連接,而不是每個應用程序。此外,打開和關閉echo可能會導致應用程序通信協議的重大更改,因為消息將根據此設置流動或停止流動,而訂閱代碼不會顯示任何原因。
其他功能
本節包含各種連接功能和選項。
獲取最大負載大小
雖然客戶端無法控制最大負載大小,但客戶端可以為應用程序提供一種在建立連接后獲取配置的最大負載的方法。這將允許應用程序根據需要對通過服務器的數據進行分塊或限制。
nc, err := nats.Connect("demo.nats.io") if err != nil {log.Fatal(err) } defer nc.Close()mp := nc.MaxPayload() log.Printf("Maximum payload is %v bytes", mp)// Do something with the max payload打開Pedantic模式
NATS服務器提供了一種迂腐的模式,可以對協議執行額外的檢查。
這種檢查的一個例子是用于發布的主題是否包含通配符。服務器不會將其用作通配符,因此會忽略此檢查。
默認情況下,此設置處于禁用狀態,但您可以將其打開以測試應用程序:
設置最大控制線大小
客戶機和服務器之間的協議相當簡單,依賴于控制線,有時還依賴于主體??刂菩邪诎l送的操作,如PING或PONG,后跟回車和換行、CRLF或“\r\n”。服務器有一個最大控制線選項,可以限制控制線的最大大小。對于PING和PONG,這并不起作用,但是對于包含主題名和可能的隊列組名的消息,控制行長度可能很重要,因為它有效地限制了可能的組合長度。一些客戶端將嘗試在內部限制控制行大小,以防止服務器出錯。這些客戶端可能允許也可能不允許您設置正在使用的大小,但如果允許,則應將大小設置為與服務器配置匹配。
不建議將此值設置為高于其他客戶端或nats服務器的值。
例如,要將最大控制線大小設置為2k:
打開/關閉Verbose模式
客戶端可以從NATS服務器請求詳細模式。當客戶機請求時,服務器將用+OK或ERR or-ERR回復來自該客戶機的每條消息。但是,客戶端不會阻塞并等待響應。錯誤也將在沒有詳細模式的情況下發送,客戶端庫將按文檔處理這些錯誤。
此功能僅用于調試客戶端庫或nats服務器本身。默認情況下,服務器將其設置為打開,但每個客戶端都將其關閉。
要打開詳細模式:
總結
以上是生活随笔為你收集整理的NATS中文开发文档:连接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: echarts饼图默认中间显示总数
- 下一篇: 如何用纯 CSS 创作一只愤怒小鸟中的绿