nats的訊息傳遞模型
@目錄
- nats的訊息傳遞模型
- What is NATS
- 主題式訊息(Subject-Based Messaging)
- 主題的層次結構
- 通配符
- 發布訂閱(Publish-Subscribe)
- example
- 請求應答(Request-Reply)
- example
- 佇列組
- example
- Acknowledgements
- example
What is NATS
nats是一個go語言開發的開源的、輕量、高性能的原生訊息系統,nats訊息由主題處理,不依賴于網路位置,它提供了應用程式或服務與底層物理網路之間的抽象層,資料被編碼并作為訊息,由發布者發送,訊息由一個或多個訂閱者接收、解碼和處理,
NATS使程式可以很容易地跨不同的環境、語言、云提供商和內部系統進行通信,客戶機通常通過單個URL連接到NATS系統,然后向主題訂閱或發布訊息,通過這種簡單的設計,NATS允許程式共享通用的訊息處理代碼,隔離資源和相互依賴,
本文主要介紹介紹nats有哪些訊息傳遞模型
主題式訊息(Subject-Based Messaging)
從根本上說,NATS是關于發布和監聽訊息的,這兩者在很大程度上都依賴于訊息的主題,簡單地說,subject就是一串字符,它們是發布者和訂閱者可以用來查找彼此的名稱,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-yt2mjzAJ-1575368779752)(./1574918652719.png)]](https://img.uj5u.com/2020/09/16/74763160726471.png)
主題的層次結構
.字符用于創建主題層次結構,例如,一個世界時鐘應用程式可能定義以下內容來邏輯地分組相關的主題:
time.us
time.us.east
time.us.east.atlanta
time.eu.east
time.eu.warsaw
通配符
NATS提供了兩個通配符,可以代替點分隔的主題中的一個或多個元素,訂閱者可以使用這些通配符偵聽多個主題,但發布者將始終使用完全指定的主題,而不使用通配符,
匹配單個token *
例如,如果一個應用程式想要監聽東部時區,他們可以訂閱time.*.east來匹配time.us.east和time.eu.east,
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WSM6vGXO-1575368779753)(./1574919076868.png)]
匹配多個tokens >
>將匹配一個或多個tokens,并且只能出現在主題的末尾,例如,time.us.>將匹配time.us.east和time.us.east.atlanta,而time.us.*只會匹配time.us.east,因為它不能匹配一個以上的token,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-t8CBTghh-1575368779754)(./1574919625783.png)]](https://img.uj5u.com/2020/09/16/74763160726472.png)
發布訂閱(Publish-Subscribe)
NATS實作了一對多通信的發布-訂閱訊息分發模型,發布者發送關于主題的訊息,而監聽該主題的任何活動訂閱者將接收該訊息,訂閱者還可以注冊對通配符主題感興趣的內容,通配符的作業原理有點像正則運算式(但只有一點點),這種一對多的模式有時被稱為扇出(fan-out),

example
pub
nc, _ := nats.Connect(nats.DefaultURL)
defer nc.Close()
nc.Publish("foo", []byte("Hello World!"))
sub
nc, _ := nats.Connect(nats.DefaultURL)
defer nc.Close()
nc.Subscribe("foo", func(m *nats.Msg) {
fmt.Printf("Received a message: %s\n", string(m.Data))
})
請求應答(Request-Reply)
請求-應答是現代分布式系統中的一種常見模式,發送請求時,應用程式要么使用特定超時等待回應,要么異步接收回應,現代系統日益增加的復雜性需求,許多技術需要額外的組件來完成完整的特性集,
NATS通過其核心通信機制(發布和訂閱)支持這種模式,請求在給定的主題上與應答主題一起發布,應答者偵聽該主題并將回應發送到應答主題,應答主題通常是一個稱為_INBOX的主題,它將被動態地定向回請求者,而不考慮任何一方的位置,
NATS的能力甚至允許多個回應,其中第一個回應被利用,而系統有效地丟棄了附加的回應,這允許一個復雜的模式有多個回應器減少回應延遲和抖動,

example
nc, _ := nats.Connect(nats.DefaultURL)
defer nc.Close()
nc.Subscribe("foo", func(m *nats.Msg) {
nc.Publish(m.Reply, []byte("I will help you"))
})
reply, _ := nc.Request("foo", []byte("help"), 50*time.Millisecond)
fmt.Println(string(reply.Data))
佇列組
NATS提供了一個稱為分布式佇列的內置負載平衡特性,使用佇列訂閱者將在一組訂閱者之間平衡訊息傳遞,這些訂閱者可用于提供應用程式容錯和大規模作業負載處理,
要創建佇列訂閱,只需要訂閱者注冊佇列名稱,具有相同佇列名稱的所有訂閱者組成佇列組,不需要任何配置,當注冊主題上的訊息發布時,將隨機選擇組中的一個成員來接收訊息,盡管佇列組有多個訂閱者,但每個訊息僅被一個訂閱者使用,
NATS的一個重要特性是佇列組是由應用程式及其佇列訂閱者定義的,而不是在服務器配置上定義的,
佇列訂閱者是擴展服務的理想物件,向上擴展與運行另一個應用程式一樣簡單,向下擴展是使用一個信號終止應用程式,該信號將耗盡正在運行的請求,這種靈活性和缺少任何配置更改使NATS成為一種優秀的服務通信技術,可以與所有平臺技術一起作業,

example
nc, _ := nats.Connect(nats.DefaultURL)
defer nc.Close()
received := 0
nc.QueueSubscribe("foo", "worker_group", func(_ *nats.Msg) {
received++
})
Acknowledgements
在具有最多一次語意的系統中,有時會丟失訊息,如果您的應用程式正在執行請求-應答,那么它應該使用超時來處理任何網路或應用程式故障,在請求上設定超時并使用處理超時的代碼總是一個好主意,在發布事件或資料流時,確保訊息傳遞的一種方法是將其轉換為帶有確認訊息(ACKs)概念的請求-應答,在NATS中,ACK可以是一個空訊息,一個沒有有效負載的訊息,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FUPbpdQq-1575368779756)(./1575005488679.png)]](https://img-blog.csdnimg.cn/2019120318273111.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE3MzA4MzIx,size_16,color_FFFFFF,t_70)
example
nc, _ := nats.Connect(nats.DefaultURL)
defer nc.Close()
nc.Subscribe("foo", func(m *nats.Msg) {
//nc.Publish(m.Reply, []byte("I will help you"))
m.Respond([]byte(""))
})
reply, _ := nc.Request("foo", []byte("help"), 50*time.Millisecond)
fmt.Println("ack:", string(reply.Data))
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/55020.html
標籤:Go
上一篇:c++中為什么老是顯示說“本函式為非法定義”,大神看看代碼是出現什么情況了
下一篇:goweb-mysql連接
