NATS.Net订阅消息的3种姿势:async枚举、回调与队列组如何选
NATS.Net订阅消息的3种姿势async枚举、回调与队列组如何选【免费下载链接】nats.netThe official C# Client for NATS项目地址: https://gitcode.com/gh_mirrors/na/nats.netNATS.Net 是 NATS 消息系统的官方 C# 客户端以高性能、低延迟和简洁 API 著称。本文将带你快速掌握 NATS.Net 订阅消息的 3 种主流姿势——async 枚举、回调式订阅与队列组并通过对比帮你选出最适合业务场景的方案新手也能一次上手。为什么订阅是 NATS.Net 的核心体验NATS 采用发布/订阅Pub/Sub模型发布者把消息发到某个主题Subject所有订阅了该主题的客户端都能收到一份副本。NATS.Net 围绕这一模型提供了多套订阅 API覆盖从写起来最爽到控制力最强的不同需求。好消息是无论选哪种姿势底层都共享同一套高性能订阅管理器你在 SubscriptionManager.cs 中可以看到统一的路由与重连逻辑。姿势一async 枚举——最自然的 NATS 消息订阅方式这是 NATS.Net 最推荐、也最符合 .NET 异步习惯的写法。调用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等熟悉的语法控制循环✅ 订阅结束时自动清理资源无需手动退订。对应实现位于 NatsConnection.Subscribe.cs 的SubscribeAsyncT方法官方文档示例可参考 pub-sub.md。姿势二回调式订阅——用 INatsSub 精细控制消息流如果你的架构更偏向事件驱动由某个后台循环持续拉取消息并派发给处理器回调那么SubscribeCoreAsyncT会更合适。它返回INatsSubT对象内部暴露一个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); // 你的回调处理 } } // 需要停止时 await sub.UnsubscribeAsync();✅ 订阅句柄可保存、可跨方法传递方便在事件总线或依赖注入容器中管理✅ 可随时检查EndReason结束原因、PendingMsgs积压数量等状态✅ 支持手动UnsubscribeAsync()精确控制生命周期。接口定义见 INatsSub.cs通道实现在 NatsSub.cs。适合需要慢消费保护、积压监控或动态退订的场景。姿势三队列组——让 NATS 消息消费水平扩展队列组Queue Group是 NATS 实现负载均衡的杀手锏多个订阅者使用相同的队列组名订阅同一主题时每条消息只会被组内随机一个成员消费消息不会重复处理。对微服务做水平扩容时这是必选项// 每个 Worker 进程都订阅同一个队列组 order-workers await foreach (var msg in nc.SubscribeAsyncstring(orders.created, queueGroup: order-workers)) { await ProcessOrderAsync(msg.Data); // 只会有一个 Worker 处理到 }✅ 天然支持多实例水平扩展加机器即加吞吐✅ 消息自动在组内均衡分发无需额外协调✅ 组内成员掉线后消息自动转给其他成员保证可用性。完整的双 Worker 演示可参考 Example.Core.SubscribeQueueGroup/Program.cs一个进程订阅、另一个进程消费对比非常直观。三种订阅姿势怎么选一张表看懂对比维度async 枚举回调式订阅队列组核心 APISubscribeAsyncSubscribeCoreAsyncINatsSub任意订阅 queueGroup参数上手难度⭐ 最低⭐⭐ 中等⭐ 低控制力度中高可手动退订、查状态中适用场景常规消息处理、快速原型事件总线、慢消费保护、DI 管理多实例负载均衡、微服务扩容能否组合使用✅ 可与队列组叠加✅ 可与队列组叠加本身是修饰能力可叠加前两者可以看到队列组并不是独立的第三种 API而是一种可叠加的能力。前两种姿势解决怎么读队列组解决谁来读。实际项目中最常见组合就是async 枚举 队列组兼顾简洁与扩展性。快速跑通从官方示例开始想动手验证仓库examples目录里提供了按场景拆分的可运行示例配合本机 NATS Server 即可直接体验Example.Core.SubscribeModel订阅并反序列化为自定义模型JSONExample.Core.SubscribeRaw订阅原始byte[]数据Example.Core.SubscribeQueueGroup双 Worker 队列组负载均衡演示Example.Core.SubscribeHeaders读取消息 Headers。总结一句话记住 NATS.Net 订阅消息的选择逻辑新手或常规场景直接用 async 枚举await foreach一把梭需要精细控制改用SubscribeCoreAsync的回调式通道读取掌握订阅全生命周期要水平扩展给任意订阅加上queueGroup参数立刻获得负载均衡能力。三者相互补充、可以自由组合。掌握这 3 种姿势你就已经拿下了 NATS.Net 消息订阅的 90% 使用场景剩下的交给业务去发挥吧【免费下载链接】nats.netThe official C# Client for NATS项目地址: https://gitcode.com/gh_mirrors/na/nats.net创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考