[golang] nats的消息傳遞模型介紹

来源:https://www.cnblogs.com/ailumiyana/archive/2019/12/15/12046578.html
-Advertisement-
Play Games

nats的消息傳遞模型 @[toc] What is NATS nats是一個go語言開發的開源的、輕量、高性能的原生消息系統。nats消息由主題處理,不依賴於網路位置。它提供了應用程式或服務與底層物理網路之間的抽象層。數據被編碼並作為消息,由發佈者發送。消息由一個或多個訂閱者接收、解碼和處理。 N ...


目錄

nats的消息傳遞模型

@


What is NATS

nats是一個go語言開發的開源的、輕量、高性能的原生消息系統。nats消息由主題處理,不依賴於網路位置。它提供了應用程式或服務與底層物理網路之間的抽象層。數據被編碼並作為消息,由發佈者發送。消息由一個或多個訂閱者接收、解碼和處理。
NATS使程式可以很容易地跨不同的環境、語言、雲提供商和內部系統進行通信。客戶機通常通過單個URL連接到NATS系統,然後向主題訂閱或發佈消息。通過這種簡單的設計,NATS允許程式共用通用的消息處理代碼,隔離資源和相互依賴。

本文主要介紹介紹nats有哪些消息傳遞模型

主題式消息(Subject-Based Messaging)

從根本上說,NATS是關於發佈和監聽消息的。這兩者在很大程度上都依賴於消息的主題。簡單地說,subject就是一串字元,它們是發佈者和訂閱者可以用來查找彼此的名稱。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-yt2mjzAJ-1575368779752)(./1574918652719.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.easttime.us.east.atlanta。而time.us.*只會匹配time.us.east,因為它不能匹配一個以上的token。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-t8CBTghh-1575368779754)(./1574919625783.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)]

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))

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • @[toc] 什麼是微服務 今天簡單瞭解一下微服務,在看微服務前,先瞭解一下傳統的單機系統。 單體系統 所有的業務子模塊都集中在一個系統中,優點是便於管理,但是規模變大的時候,缺點就很明顯了。 缺點: 1、項目過於臃腫 當產品規模越來越大,各種的大大小小模塊都塞在一個項目中,必然會使整個項目變的臃腫 ...
  • Micosoft.Extension.ObjectPool 源碼架構、模式分析: 三大基本對象: 1. ObjectPool抽象類 2. ObjectPoolProvider抽象類 3. IPooledObjectPolicy介面 ObjectPool的預設實現是DefaultPool,對象池的創建 ...
  • 解釋器模式 定義 給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。 目的 如果一種特定類型的問題發生的頻率足夠高,那麼可能就值得將該問題的各個實例表述為一個簡單語言中的句子。這樣就可以構建一個解釋器,該解釋器通過解釋這些句子來解決該問題。 UML圖 好 ...
  • 享元模式 定義 運用共用技術有效的支持大量細粒度的對象。 UML圖 舉個慄子 實際開發當中,一個項目如果做得好,如果市場打通到其他地方,那麼核心代碼其實是可以通用的,只不過用著不同的數據和特性出來的模版而已,這些對用戶來說是非透明的。使用最小的開銷獲得最大的收益,這是所有公司的目的。 Talk is ...
  • 中介者模式 定義 用一個中介對象來封裝一系列的對象交互。中介使各對象之間不需要顯示的相互引用,從而使其耦合鬆散,而且可以獨立的改變它們之間的交互。 UML圖 舉個慄子 “聯合國”就是世界上各個國家的一個“中介”,許多事情都不是國家之間直接交互,而是通過“安理會”等組織進行協商、投票等過程。 Talk ...
  • Java的HashMap源碼中用到的(n-1)&hash這樣的運算,查找發現這是一種高效的求餘數的辦法,但其中的原理是什麼呢為什麼可以這麼做呢? 先上結論:假設被除數是x,對於除數是2n的取餘操作x%2n,都可以寫成x&(2n-1),位運算效率高! eg:259%8=259&7=3 259 1000 ...
  • 參考文檔https://jingyan.baidu.com/article/4e5b3e190f55c591901e24b3.html admin.py from .models import *class BookAdmin(admin.ModelAdmin): list_display = [" ...
  • Java編譯時常量和運行時常量 編譯期常量指的就是程式在編譯時就能確定這個常量的具體值。 非編譯期常量就是程式在運行時才能確定常量的值,因此也稱為運行時常量。 在Java中,編譯期常量指的是用final關鍵字修飾的基本類型或String類型並直接賦值(非複雜運算)的變數(無論是否用static修飾) ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...