與隊列組如何選)
NATS.Net訂閱消息的3種姿勢async枚舉、回調(diào)與隊列組如何選【免費下載鏈接】nats.netThe official C# Client for NATS項目地址: https://gitcode.com/gh_mirrors/na/nats.netNATS.Net 是 NATS 消息系統(tǒng)的官方 C# 客戶端以高性能、低延遲和簡潔 API 著稱。本文將帶你快速掌握 NATS.Net 訂閱消息的 3 種主流姿勢——async 枚舉、回調(diào)式訂閱與隊列組并通過對比幫你選出最適合業(yè)務(wù)場景的方案新手也能一次上手。為什么訂閱是 NATS.Net 的核心體驗NATS 采用發(fā)布/訂閱Pub/Sub模型發(fā)布者把消息發(fā)到某個主題Subject所有訂閱了該主題的客戶端都能收到一份副本。NATS.Net 圍繞這一模型提供了多套訂閱 API覆蓋從寫起來最爽到控制力最強的不同需求。好消息是無論選哪種姿勢底層都共享同一套高性能訂閱管理器你在 SubscriptionManager.cs 中可以看到統(tǒng)一的路由與重連邏輯。姿勢一async 枚舉——最自然的 NATS 消息訂閱方式這是 NATS.Net 最推薦、也最符合 .NET 異步習慣的寫法。調(diào)用SubscribeAsyncT會返回一個IAsyncEnumerable配合await foreach即可流式消費消息就像讀一個無限長度的集合await using var nc new NatsClient(); await foreach (var msg in nc.SubscribeAsyncstring(orders.created)) { Console.WriteLine($收到訂單: {msg.Subject} {msg.Data}); }? 寫法直觀天然支持CancellationToken取消訂閱? 消息自動反序列化為強類型T? 可直接用 LINQ、break等熟悉的語法控制循環(huán)? 訂閱結(jié)束時自動清理資源無需手動退訂。對應(yīng)實現(xiàn)位于 NatsConnection.Subscribe.cs 的SubscribeAsyncT方法官方文檔示例可參考 pub-sub.md。姿勢二回調(diào)式訂閱——用 INatsSub 精細控制消息流如果你的架構(gòu)更偏向事件驅(qū)動由某個后臺循環(huán)持續(xù)拉取消息并派發(fā)給處理器回調(diào)那么SubscribeCoreAsyncT會更合適。它返回INatsSubT對象內(nèi)部暴露一個ChannelReaderNatsMsgT類型的Msgs通道你可以自行決定何時讀取、何時停止var sub await nc.SubscribeCoreAsyncstring(orders.created); while (await sub.Msgs.WaitToReadAsync()) { while (sub.Msgs.TryRead(out var msg)) { await HandleOrderAsync(msg.Data); // 你的回調(diào)處理 } } // 需要停止時 await sub.UnsubscribeAsync();? 訂閱句柄可保存、可跨方法傳遞方便在事件總線或依賴注入容器中管理? 可隨時檢查EndReason結(jié)束原因、PendingMsgs積壓數(shù)量等狀態(tài)? 支持手動UnsubscribeAsync()精確控制生命周期。接口定義見 INatsSub.cs通道實現(xiàn)在 NatsSub.cs。適合需要慢消費保護、積壓監(jiān)控或動態(tài)退訂的場景。姿勢三隊列組——讓 NATS 消息消費水平擴展隊列組Queue Group是 NATS 實現(xiàn)負載均衡的殺手锏多個訂閱者使用相同的隊列組名訂閱同一主題時每條消息只會被組內(nèi)隨機一個成員消費消息不會重復處理。對微服務(wù)做水平擴容時這是必選項// 每個 Worker 進程都訂閱同一個隊列組 order-workers await foreach (var msg in nc.SubscribeAsyncstring(orders.created, queueGroup: order-workers)) { await ProcessOrderAsync(msg.Data); // 只會有一個 Worker 處理到 }? 天然支持多實例水平擴展加機器即加吞吐? 消息自動在組內(nèi)均衡分發(fā)無需額外協(xié)調(diào)? 組內(nèi)成員掉線后消息自動轉(zhuǎn)給其他成員保證可用性。完整的雙 Worker 演示可參考 Example.Core.SubscribeQueueGroup/Program.cs一個進程訂閱、另一個進程消費對比非常直觀。三種訂閱姿勢怎么選一張表看懂對比維度async 枚舉回調(diào)式訂閱隊列組核心 APISubscribeAsyncSubscribeCoreAsyncINatsSub任意訂閱 queueGroup參數(shù)上手難度? 最低?? 中等? 低控制力度中高可手動退訂、查狀態(tài)中適用場景常規(guī)消息處理、快速原型事件總線、慢消費保護、DI 管理多實例負載均衡、微服務(wù)擴容能否組合使用? 可與隊列組疊加? 可與隊列組疊加本身是修飾能力可疊加前兩者可以看到隊列組并不是獨立的第三種 API而是一種可疊加的能力。前兩種姿勢解決怎么讀隊列組解決誰來讀。實際項目中最常見組合就是async 枚舉 隊列組兼顧簡潔與擴展性??焖倥芡◤墓俜绞纠_始想動手驗證倉庫examples目錄里提供了按場景拆分的可運行示例配合本機 NATS Server 即可直接體驗Example.Core.SubscribeModel訂閱并反序列化為自定義模型JSONExample.Core.SubscribeRaw訂閱原始byte[]數(shù)據(jù)Example.Core.SubscribeQueueGroup雙 Worker 隊列組負載均衡演示Example.Core.SubscribeHeaders讀取消息 Headers??偨Y(jié)一句話記住 NATS.Net 訂閱消息的選擇邏輯新手或常規(guī)場景直接用 async 枚舉await foreach一把梭需要精細控制改用SubscribeCoreAsync的回調(diào)式通道讀取掌握訂閱全生命周期要水平擴展給任意訂閱加上queueGroup參數(shù)立刻獲得負載均衡能力。三者相互補充、可以自由組合。掌握這 3 種姿勢你就已經(jīng)拿下了 NATS.Net 消息訂閱的 90% 使用場景剩下的交給業(yè)務(wù)去發(fā)揮吧【免費下載鏈接】nats.netThe official C# Client for NATS項目地址: https://gitcode.com/gh_mirrors/na/nats.net創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考