不忘初心,砥砺前行
作者 | 陌无崖
转载请联系授权
NATS
NATS是一个开源、轻量级、高性能的分布式消息中间件,实现了高可伸缩性和优雅的Publish/Subscribe模型,使用Golang语言开发。
NATS消息传递支持在计算机应用程序和服务之间交换分段为消息的数据。这些消息由主题解决,不依赖于网络位置。这在应用程序或服务与底层物理网络之间提供了一个抽象层。数据被编码并构成消息并由发布者发送。该消息由一个或多个订户接收,解码和处理。
NATS使程序可以轻松地跨不同环境,语言,云提供商和内部部署系统进行通信。客户端通常通过单个URL连接到NATS系统,然后订阅或发布消息给主题。通过这种简单的设计,NATS允许程序共享公共消息处理代码,隔离资源和相互依赖性,并通过轻松处理消息量的增加进行扩展,无论是服务请求还是流数据。
NATS核心提供最多一次的服务质量。如果订户没有收听主题(没有主题匹配),或者在发送消息时未激活,则不会收到消息。这与TCP / IP提供的保证级别相同。默认情况下,NATS是一种即发即弃的消息传递系统。如果您需要更高级别的服务,您可以使用NATS Streaming或通过经过验证的可扩展参考设计为客户端应用程序构建额外的可靠性。
NATS基于主题的消息传递
从根本上说,NATS是关于发布和收听消息的。这两者都严重依赖于将消息范围限定为流或主题的主题。最简单的是,主题只是一串字符,形成了发布者和订阅者可以用来互相查找的名称。
NATS服务器保留一些特殊的字符,规范说只有“字母数字”字符加上“.” 应该在主题名称中使用。主题区分大小写,不能包含空格。为了跨客户端安全,应使用ASCII字符,尽管将来可能会有所变化。
主题层次结构
字符.
用于创建主题层次结构。例如,世界时钟应用程序可能会定义以下内容以对相关主题进行逻辑分组:
time.us
time.us.east
time.us.east.atlanta
time.eu.east
time.eu.warsaw
通配符
NATS提供了两个通配符,可以取代点分隔主题中的一个或多个元素。订阅者可以使用这些通配符通过单个订阅来收听多个主题,但是发布者将始终使用完全指定的主题,而不使用通配符
匹配单个令牌
第一个通配符是*,它将匹配单个标记 。例如,如果应用程序想要侦听东部时区,则可以订阅time.*.east
,这将匹配time.us.east和time.eu.east。
匹配多个令牌
第二个通配符是>
将匹配一个或多个令牌,并且只能出现在主题的末尾。例如,time.us.>
将匹配time.us.east
和time.us.east.atlanta
,而time.us. *
只匹配time.us.east
,因为它不能匹配多个令牌。
监控和线控
根据您的安全配置,可以通过创建有时称为有线点击的内容来使用通配符进行监控。在最简单的情况下,您可以为>
创建订户。此应用程序将接收所有消息 -- 再次,根据安全设置 -- 在NATS群集上发送。
发布与的订阅
NATS为一对多通信实现发布 - 订阅消息分发模型。发布者在主题上发送消息,并且监听该主题的任何活动订阅者都会收到该消息。订阅者还可以注册对通配符主题的兴趣,这些主题有点像正则表达式(但只是一点点)。这种一对多模式有时被称为扇出。
通过浏览pub-sub教程,使用实时服务器自己尝试NATS发布订阅。
请求-回复
Request-Reply是现代分布式系统中的常见模式。发送一个请求,应用程序要么在响应时等待一定的超时,要么异步接收响应。现代系统复杂性的增加需要诸如位置透明度,放大和缩小,可观察性等功能。许多技术需要额外的组件,侧面卡和代理才能完成完整的功能集。
NATS通过其核心通信机制,发布和订阅支持这种模式。对具有回复主题的给定主题发布请求,并且响应者听取该主题并将回复发送给回复主题。回复主题通常是一个名为_INBOX的主题,它将被动态地定向回请求者,而不管任何一方的位置如何。
NATS允许多个响应者运行并形成动态队列组以进行透明扩展。NATS应用程序在退出之前消耗的能力允许缩小而不会丢弃请求。由于NATS基于发布 - 订阅,因此可观察性就像运行另一个可以查看请求和响应以测量延迟,注意异常,直接可伸缩性等的应用程序一样简单。
NATS的强大功能甚至允许在使用第一个响应的情况下进行多次响应,系统会有效地丢弃其他响应。这允许复杂的模式使多个响应者减少响应延迟和抖动。
队列订阅和可扩展性
NATS提供称为分布式队列的内置负载平衡功能。使用队列订户将平衡一组订户的消息传递,这可以用于提供应用程序容错和扩展工作负载处理。
要创建队列订阅,订户会注册队列名称。具有相同队列名称的所有订户构成队列组。这不需要配置。当发布已注册主题上的消息时,随机选择该组中的一个成员来接收该消息。尽管队列组具有多个订户,但每个消息仅由一个消息使用。
NATS的一个重要特性是队列组由应用程序及其队列订户定义,而不是在服务器配置上定义。
队列订户是扩展服务的理想选择。向上扩展就像运行另一个应用程序一样简单,向下扩展是使用一个消耗飞行中请求的信号来终止应用程序。这种灵活性和缺乏任何配置变化使NATS成为一种优秀的服务通信技术,可以与所有平台技术协同工作
应答
在具有最多一次语义的系统中,有时可能会丢失消息。如果您的应用程序正在执行请求 - 回复,则应使用超时来处理任何网络或应用程序故障。在请求上设置超时并拥有处理超时的代码总是一个好主意。当您发布事件或数据流时,确保消息传递的一种方法是将其转换为具有确认消息或ACK的概念的请求 - 答复。在NATS中,ACK可以简单地是空消息,即没有有效载荷的消息。
序列
一对多消息的常见问题是消息可能由于网络故障而丢失或丢失。解决这种情况的一个简单模式是在消息中包含序列id。接收方可以检查序列ID以查看它们是否遗漏了任何内容。在没有新数据的情况下,序列号与心跳相结合形成了一种强大而有弹性的模式来检测损失。存储和保留消息的系统也可以解决这个问题,但有时对于手头的问题来说是过度的,通常会导致额外的管理和运营成本。
为了真正利用序列ID,需要记住以下几点:
- 每个发件人都必须使用自己的序列
- 如果可能,接收者应该能够通过id询问丢失的消息
使用NATS,您可以在消息中嵌入序列ID,或将它们作为令牌包含在主题中。例如,发件人可以将消息发送到updates.1
,updates.2
等……订阅者可以监听更新.*
并解析主题以确定序列ID。如果有效载荷未知或者在有效载荷中嵌入诸如序列号之类的附加数据是不可能的,则可能需要将序列令牌放入主题中。
以上文章参考翻译自NATS官方文档 https://nats-io.github.io/docs/