nats 简介和使用
nats 有 3 个产品
core-nats: 不做持久化的及时信息传输系统
nats-streaming: 基于 nats 的持久化消息队列(已弃用)
nats-jetstream: 基于 nats 的持久化消息队列
这里主要讨论 core-nats 和 nats-jetstream
nats 快速开始
- 启动 nats
- # 启动 nats
docker run --network host -p 4222:4222 nats - Connect 连接
- nc, err := nats.Connect("nats://localhost:4222")
if err != nil {
log.Fatal("NATS 连接失败")
}
defer nc.Close() - Publish 发布/生产消息
- // 生产消息
err := nc.Publish("foo", []byte("Hello World"))
if err != nil {
log.Fatal("NATS 发布失败")
}
// Flush 发布缓冲区
err = nc.Flush()
if err != nil {
log.Fatal("NATS Flush 失败")
} -
出于性能考虑, 发布的消息先写入到类似 Buffer 缓存的地方, 然后再一次性发送到 nats 服务器
- Subscribe 订阅/消费消息
- // 消费消息
_, err = nc.Subscribe("foo", func(msg *nats.Msg) {
fmt.Printf("收到消息: %s\n", msg.Data)
})
if err != nil {
log.Fatal("NATS 订阅失败")
// 消费消息
// queue 是队列组的名称, 同一组队列最多只有一个接收者能成功接收
_, _ = nc.QueueSubscribe("foo", "queue", func(msg *nats.Msg) {
fmt.Printf("收到消息: %s\n", string(msg.Data))
}) -
信息传递模式
NATS支持4种主要的通信模式。它们是
基于主题
发布-订阅
请求-回复/分散-收集
队列组每一个都是不同的模式,都有其使用案例,有一些重叠。允许所有这四种模式给了NATS极大的灵活性和功能,以应对多个应用程序之间的各种不同情况,或一个大型单体。
基于主题的消息传递
A 主题在NATS中是一个简单的字符串,代表对数据的兴趣。它被分_层标记_以支持_通配符订阅_。
foo.* 匹配 _foo.bar_和 foo.baz
foo.*.bar匹配 _foo.a.bar_和 foo.b.bar
_foo.>_匹配上述任何一个
_>_匹配NATS中的所有内容这种消息传递模式允许发布者使用一个_Subject_来共享数据,而消费者可以通过使用通配符来监听这些Subject来接收这些消息。
从某种意义上说,这种模式是基于观察者设计模式的,它通常有一个_主题_和_观察者_。
例如,如果有人向_'audit.us.east'_发送消息,那么所有监听该确切主题或通配符主题的订阅者都会收到这个消息。
}