背景:NATS 官方性能測試吞吐高於Kafka、NSQ、RabbitMQ、Redis等其他消息服務,而且是Go語言,值得關注。
NATS是一個分佈式的消息隊列系統,支持Pub,Sub/Req,Rsp 模型。
NATS實現了三種模式
Publish Subscribe 發佈訂閱模式
Request Reply 請求響應模式
Queueing 消息隊列模式
安裝:
go get github.com/nats-io/gnatsd
./sub -s nats://localhost:4222 -t abc
./pub -s nats://localhost:4222 abc msg_abc
NATS的消息通信模型是應用程序的數據被編碼為一條消息,並通過發佈者發送出去;訂閱者接收到消息,進行解碼,再處理。訂閱者處理NATS消息可以是同步的或異步的。
NATS的協議是一個簡單的、基於文本的發佈/訂閱風格的協議。客戶端連接到 gnatsd(NATS服務器),並與 gnatsd 進行通信,通信基於普通的 TCP/IP 套接字,並定義了很小的操作集,換行表示終止。
NATS支持每一個服務按照集群模式方式運行。可以將這些服務組織在一起形成一個集群來提高服務器的容量的消息傳遞系統,並可以提升整個系統的彈性話和高可用性。NATS集群服務器轉發是通過一個跳躍來完成的。這意味著每個gnatsd當從一個客戶端接收到消息之後通過路由信息會立即轉發給對應註冊的gnatsd實例。接收到的消息通過一個路由才會分發給本地的客戶。
官方示例:
nc, _ := nats.Connect(nats.DefaultURL)
// Simple Publisher
nc.Publish("foo", []byte("Hello World"))
// Simple Async Subscriber
nc.Subscribe("foo", func(m *nats.Msg) {
fmt.Printf("Received a message: %s\n", string(m.Data))
})
// Simple Sync Subscriber
sub, err := nc.SubscribeSync("foo")
m, err := sub.NextMsg(timeout)
// Channel Subscriber
ch := make(chan *nats.Msg, 64)
sub, err := nc.ChanSubscribe("foo", ch)
msg :=
// Unsubscribe
sub.Unsubscribe()
// Requests
msg, err := nc.Request("help", []byte("help me"), 10*time.Millisecond)
// Replies
nc.Subscribe("help", func(m *Msg) {
nc.Publish(m.Reply, []byte("I can help!"))
})
// Close connection
nc, _ := nats.Connect("nats://localhost:4222")
nc.Close();
參考文獻:https://www.nats.io/documentation/
小結:NATS 是Go語言寫的,性能還可以,但是要用到企業級還有很多的不足,持久化,ACK,重試,failover等都需要進一步的完善。
更多內容請關注每日編程,每天進步一點。
閱讀更多 每日編程 的文章