nats 簡介和使用
nats 有 3 個產品
? ? core-nats: 不做持久化的及時信息傳輸系統
? ? nats-streaming: 基于 nats 的持久化消息隊列(已棄用)
? ? nats-jetstream: 基于 nats 的持久化消息隊列
這里主要討論 core-nats 和 nats-jetstream
nats 快速開始
- 啟動 nats
- # 啟動 nats
docker run --network host -p 4222:4222 nats - Connect 連接
- nc, err := nats.Connect("nats://localhost:4222")
if err != nil {
? log.Fatal("NATS 連接失敗")
}
defer nc.Close() - Publish 發布/生產消息
- // 生產消息
err := nc.Publish("foo", []byte("Hello World"))
if err != nil {
? log.Fatal("NATS 發布失敗")
}
// Flush 發布緩沖區
err = nc.Flush()
if err != nil {
? log.Fatal("NATS Flush 失敗")
} -
出于性能考慮, 發布的消息先寫入到類似 Buffer 緩存的地方, 然后再一次性發送到 nats 服務器
- Subscribe 訂閱/消費消息
- // 消費消息
_, err = nc.Subscribe("foo", func(msg *nats.Msg) {
? fmt.Printf("收到消息: %s\n", msg.Data)
})
if err != nil {
? log.Fatal("NATS 訂閱失敗")
// 消費消息
// queue 是隊列組的名稱, 同一組隊列最多只有一個接收者能成功接收
_, _ = nc.QueueSubscribe("foo", "queue", func(msg *nats.Msg) {
? ? fmt.Printf("收到消息: %s\n", string(msg.Data))
}) -
信息傳遞模式
NATS支持4種主要的通信模式。它們是
? ? 基于主題
? ? 發布-訂閱
? ? 請求-回復/分散-收集
? ? 隊列組每一個都是不同的模式,都有其使用案例,有一些重疊。允許所有這四種模式給了NATS極大的靈活性和功能,以應對多個應用程序之間的各種不同情況,或一個大型單體。
基于主題的消息傳遞
A 主題在NATS中是一個簡單的字符串,代表對數據的興趣。它被分_層標記_以支持_通配符訂閱_。
? ? foo.* 匹配 _foo.bar_和 foo.baz
? ? foo.*.bar匹配 _foo.a.bar_和 foo.b.bar
? ? _foo.>_匹配上述任何一個
? ? _>_匹配NATS中的所有內容這種消息傳遞模式允許發布者使用一個_Subject_來共享數據,而消費者可以通過使用通配符來監聽這些Subject來接收這些消息。
? ? 從某種意義上說,這種模式是基于觀察者設計模式的,它通常有一個_主題_和_觀察者_。
例如,如果有人向_'audit.us.east'_發送消息,那么所有監聽該確切主題或通配符主題的訂閱者都會收到這個消息。
}
- ?
- ?
- ?