# NATS 详解 TODO: ## 1.基本概念 ### 1.1.What is NATS ### 1.2.Subject-Based Messaging ### 1.3.发布(Publish)-订阅(Subscribe) NATS 实现了一对多发布订阅消息模型。当 publisher 往 subject 上发布一条消息后,此 subject 上所有 subscriber 都能收到 此消息,属于一种广播。 ### 1.4.请求(Request)-响应(Reply) 一般来说,消息系统是以异步的形式工作,也就是说,publisher 往 subject 上发布一条消息后,并不在意 subscriber 的 reply 是什么。如果 publisher 在意 subscriber 的 reply 是什么的话,那么消息系统就应该以同步的形式工作,在具体实现中,是通过两次发布订阅来完成的:当 publisher 发布消息后,它会订阅一个特定的 subject,当 subscriber 处理完消息后,它会把 reply 发布到这个特定的 subject。当然,整个过程对使用者是透明的。 ### 1.5.Queue Groups 如果我们把 subscriber 分组,那么当 publisher 往 subject 上发布一条消息后,同一组里只有一个 subscriber 会收到此消息(每个成员都有相同的机会接收该消息),从而实现了负载均衡。 ### 1.6.Acknowledgements ### 1.7.Sequence Numbers ## 2.NATS 的安装和运行 安装服务程序: ```bash # Ubuntu aria2c -c -x16 -s16 https://github.com/nats-io/nats-server/releases/download/v2.3.0/nats-server-v2.3.0-amd64.deb apt install ./nats-server-v2.3.0-amd64.deb ``` 安装客户端支持库: ```bash # Golang go get github.com/nats-io/nats.go/ ``` 启动 NATS 服务: ```bash nats-server ``` ## 3.Golang Client API ### 3.1.同步订阅 ### 3.2.异步订阅 ### 3.3.取消订阅 ### 3.4.在 N 个消息后取消订阅 ### 3.5.回复消息 ### 3.6.通配符订阅 ### 3.7.队列订阅 如果我们把 subscriber 分组,那么当 publisher 往 subject 上发布一条消息后,同一组里只有一个 subscriber 会收到此消息(每个成员都有相同的机会接收该消息),从而实现了负载均衡: ```go nc, err := nats.Connect("demo.nats.io") if err != nil { log.Fatal(err) } defer nc.Close() // Use a WaitGroup to wait for 10 messages to arrive wg := sync.WaitGroup{} wg.Add(10) // Create a queue subscription on "updates" with queue name "workers" if _, err := nc.QueueSubscribe("updates", "workers", func(m *nats.Msg) { wg.Done() }); err != nil { log.Fatal(err) } // Wait for messages to come in wg.Wait() ``` ### 3.8..断开连接前排空(drain)消息 ### 3.9..结构化数据 ## 4.NATS Tools ### 4.1.Introduction ### 4.2.nats ### 4.3.nk ### 4.4.nsc ### 4.5.nats-account-server ### 4.6.nats-top ### 4.7.nats-bench ### 4.8.natsboard 说到监控,除了前面提到的 nats-top 之外,还有诸如 natsboard 之类的 UI 可供选择: ![natsboard](./img/NATS_详解/001.png)