目录
nats 的消息传递模型
What is NATS
主题式消息(Subject-Based Messaging)
发布订阅(Publish-Subscribe)
请求应答(Request-Reply)
队列组
Acknowledgements
nats 的消息传递模型
@
What is NATS
nats 是一个 go 语言开发的开源的, 轻量, 高性能的原生消息系统. nats 消息由主题处理, 不依赖于网络位置. 它提供了应用程序或服务与底层物理网络之间的抽象层. 数据被编码并作为消息, 由发布者发送. 消息由一个或多个订阅者接收, 解码和处理.
NATS 使程序可以很容易地跨不同的环境, 语言, 云提供商和内部系统进行通信. 客户机通常通过单个 URL 连接到 NATS 系统, 然后向主题订阅或发布消息. 通过这种简单的设计, NATS 允许程序共享通用的消息处理代码, 隔离资源和相互依赖.
本文主要介绍介绍 nats 有哪些消息传递模型
主题式消息(Subject-Based Messaging)
从根本上说, NATS 是关于发布和监听消息的. 这两者在很大程度上都依赖于消息的主题. 简单地说, subject 就是一串字符, 它们是发布者和订阅者可以用来查找彼此的名称.
主题的层次结构
. 字符用于创建主题层次结构. 例如, 一个世界时钟应用程序可能定义以下内容来逻辑地分组相关的主题:
- time.us
- time.us.east
- time.us.east.atlanta
- time.eu.east
- time.eu.warsaw
通配符
NATS 提供了两个通配符, 可以代替点分隔的主题中的一个或多个元素. 订阅者可以使用这些通配符侦听多个主题, 但发布者将始终使用完全指定的主题, 而不使用通配符.
匹配单个 token *
例如, 如果一个应用程序想要监听东部时区, 他们可以订阅 time.*.east 来匹配 time.us.east 和 time.eu.east.
[外链图片转存失败, 源站可能有防盗链机制, 建议将图片保存下来直接上传(img-WSM6vGXO-1575368779753)(./1574919076868.PNG)]
匹配多个 tokens>
>将匹配一个或多个 tokens, 并且只能出现在主题的末尾. 例如, time.us.>将匹配 time.us.east 和
time.us.east.atlanta
. 而 time.us.* 只会匹配 time.us.east, 因为它不能匹配一个以上的 token.
发布订阅(Publish-Subscribe)
NATS 实现了一对多通信的发布 - 订阅消息分发模型. 发布者发送关于主题的消息, 而监听该主题的任何活动订阅者将接收该消息. 订阅者还可以注册对通配符主题感兴趣的内容, 通配符的工作原理有点像正则表达式(但只有一点点). 这种一对多的模式有时被称为扇出(fan-out).
- example
- pub
- nc, _ := nats.Connect(nats.DefaultURL)
- defer nc.Close()
- nc.Publish("foo", []byte("Hello World!"))
- sub
- nc, _ := nats.Connect(nats.DefaultURL)
- defer nc.Close()
- nc.Subscribe("foo", func(m *nats.Msg) {
- fmt.Printf("Received a message: %s\n", string(m.Data))
- })
请求应答(Request-Reply)
请求 - 应答是现代分布式系统中的一种常见模式. 发送请求时, 应用程序要么使用特定超时等待响应, 要么异步接收响应. 现代系统日益增加的复杂性需求, 许多技术需要额外的组件来完成完整的特性集.
NATS 通过其核心通信机制 (发布和订阅) 支持这种模式. 请求在给定的主题上与应答主题一起发布, 应答者侦听该主题并将响应发送到应答主题. 应答主题通常是一个称为_INBOX 的主题, 它将被动态地定向回请求者, 而不考虑任何一方的位置.
NATS 的能力甚至允许多个响应, 其中第一个响应被利用, 而系统有效地丢弃了附加的响应. 这允许一个复杂的模式有多个响应器减少响应延迟和抖动.
- example
- nc, _ := nats.Connect(nats.DefaultURL)
- defer nc.Close()
- nc.Subscribe("foo", func(m *nats.Msg) {
- nc.Publish(m.Reply, []byte("I will help you"))
- })
- reply, _ := nc.Request("foo", []byte("help"), 50*time.Millisecond)
- fmt.Println(string(reply.Data))
队列组
NATS 提供了一个称为分布式队列的内置负载平衡特性. 使用队列订阅者将在一组订阅者之间平衡消息传递, 这些订阅者可用于提供应用程序容错和大规模工作负载处理.
要创建队列订阅, 只需要订阅者注册队列名称. 具有相同队列名称的所有订阅者组成队列组. 不需要任何配置. 当注册主题上的消息发布时, 将随机选择组中的一个成员来接收消息. 尽管队列组有多个订阅者, 但每个消息仅被一个订阅者使用.
NATS 的一个重要特性是队列组是由应用程序及其队列订阅者定义的, 而不是在服务器配置上定义的.
队列订阅者是扩展服务的理想对象. 向上扩展与运行另一个应用程序一样简单, 向下扩展是使用一个信号终止应用程序, 该信号将耗尽正在运行的请求. 这种灵活性和缺少任何配置更改使 NATS 成为一种优秀的服务通信技术, 可以与所有平台技术一起工作.
- example
- nc, _ := nats.Connect(nats.DefaultURL)
- defer nc.Close()
- received := 0
- nc.QueueSubscribe("foo", "worker_group", func(_ *nats.Msg) {
- received++
- })
- Acknowledgements
在具有最多一次语义的系统中, 有时会丢失消息. 如果您的应用程序正在执行请求 - 应答, 那么它应该使用超时来处理任何网络或应用程序故障. 在请求上设置超时并使用处理超时的代码总是一个好主意. 在发布事件或数据流时, 确保消息传递的一种方法是将其转换为带有确认消息 (ACKs) 概念的请求 - 应答. 在 NATS 中, ACK 可以是一个空消息, 一个没有有效负载的消息.
- example
- nc, _ := nats.Connect(nats.DefaultURL)
- defer nc.Close()
- nc.Subscribe("foo", func(m *nats.Msg) {
- //nc.Publish(m.Reply, []byte("I will help you"))
- m.Respond([]byte(""))
- })
- reply, _ := nc.Request("foo", []byte("help"), 50*time.Millisecond)
- fmt.Println("ack:", string(reply.Data))
[golang] nats 的消息传递模型介绍
来源: http://www.bubuko.com/infodetail-3333608.html