NotePublic/Software/System/NATS/NATS_详解.md

127 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# NATS 详解
TODO:
<https://docs.nats.io/nats-concepts/intro>
<https://blog.csdn.net/weixin_43465618/article/details/105173862>
<https://www.cnblogs.com/ailumiyana/p/12046578.html>
<https://cloud.tencent.com/developer/article/1500309>
<https://learnku.com/docs/go-micro/1.x/nats/8245>
<https://cloud.tencent.com/developer/article/1506392>
## 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)