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.easttime.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的消息传递模型介绍的更多相关文章

  1. 深入理解 Java 内存模型(一)- 内存模型介绍

    深入理解 Java 内存模型(一)- 内存模型介绍 深入理解 Java 内存模型(二)- happens-before 规则 深入理解 Java 内存模型(三)- volatile 语义 深入理解 J ...

  2. 基于gin的golang web开发:模型绑定

    在前两篇文章介绍路由的时候,我们了解到gin可用通过类似DefaultQuery或DefaultPostForm等方法获取到前端提交过来的参数.参数不多的情况下也很好用,但是想想看,如果接口有很多个参 ...

  3. Queue 消息的发送与接收(PTP 消息传递模型)

    上篇博客写到了JMS两种消息模型(P2P.pub/sub)<JMS两种消息模型>.本篇博客通过一个实例来进一步了解P2P模型. Queue消息的发送与接收--PTP消息传递模型,样例: Q ...

  4. IO模型介绍

    先理解几个问题: (1)为什么读取文件的时候,需要用户进程通过系统调用内核完成(系统不能自己调用内核)什么是用户态和内核态?为什么要区分内核态和用户态呢? 在 CPU 的所有指令中,有些指令是非常危险 ...

  5. 模型介绍之FastText

    模型介绍一: 1. FastText原理及实践 前言----来源&特点 fastText是Facebook于2016年开源的一个词向量计算和文本分类工具,在学术上并没有太大创新.但是它的优点也 ...

  6. python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)

    昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...

  7. {python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) IO模型比较分析 selectors模块

    python之IO多路复用 阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 ...

  8. (zhuan) 深度学习全网最全学习资料汇总之模型介绍篇

    This blog from : http://weibo.com/ttarticle/p/show?id=2309351000224077630868614681&u=5070353058& ...

  9. OSI七层网络模型与TCP/IP四层模型介绍

    目录 OSI七层网络模型与TCP/IP四层模型介绍 1.OSI七层网络模型介绍 2.TCP/IP四层网络模型介绍 3.各层对应的协议 4.OSI七层和TCP/IP四层的区别 5.交换机工作在OSI的哪 ...

随机推荐

  1. T-SQL Part XII: Access Remote SQL Server

    要链接远程的SQL Server,需要一下几个步骤(以下的步骤都是在远程系统上进行): 确认远程SQL Server所监听的端口号 官方的文档是使用SQL Server Configuration M ...

  2. 关于laravel框架Model返回的值为stdClass对象转换两种方法

    一般情况下laravel模型层查询出来的数据是stdClass对象,无法直接当做数组进行视图展示,所以需要转换为数组格式. Model中查到的数据为  $data  ,对它进行转化,转化为数组. 第一 ...

  3. suseoj 1212: 推箱子问题(bfs)

    1212: 推箱子问题 时间限制: 1 Sec  内存限制: 128 MB提交: 60  解决: 13[提交][状态][讨论版][命题人:liyuansong] 题目描述 码头仓库是划分为n×m个格子 ...

  4. 你必须知道的容器日志 (2) 开源日志管理方案 ELK

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章.上一篇<你必须知道的容器日志(1)>中介绍了Docker自带的log ...

  5. 读写分离很难吗?springboot结合aop简单就实现了

    目录 前言 环境部署 开始项目 注意 參考: 前言 入职新公司到现在也有一个月了,完成了手头的工作,前几天终于有时间研究下公司旧项目的代码.在研究代码的过程中,发现项目里用到了Spring Aop来实 ...

  6. 什么是PHP Socket?

    什么是 Socket? Socket 的中文翻译过来就是“套接字”.套接字是什么,我们先来看看它的英文含义:插座. Socket 就像一个电话插座,负责连通两端的电话,进行点对点通信,让电话可以进行通 ...

  7. JavaScript笔记十

    1.正则表达式 - 语法: - 量词 {n} 正好n次 {m,n} m-n次 {m,} 至少m次 + 至少1次 {1,} ? 0次或1次 {0,1} * 0次或多次 {0,} - 转义字符 \ 在正则 ...

  8. Java并发之synchronized关键字和Lock接口

    欢迎点赞阅读,一同学习交流,有疑问请留言 . GitHub上也有开源 JavaHouse,欢迎star 引用 当开发过程中,我们遇到并发问题.怎么解决? 一种解决方式,简单粗暴:上锁.将千军万马都给拦 ...

  9. SpringBoot源码学习系列之异常处理自动配置

    SpringBoot源码学习系列之异常处理自动配置 1.源码学习 先给个SpringBoot中的异常例子,假如访问一个错误链接,让其返回404页面 在浏览器访问: 而在其它的客户端软件,比如postm ...

  10. 什么鬼,面试官竟然让我用Redis实现一个消息队列!!?

    GitHub 9.4k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 9.4k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 9.4k Star 的 ...