NATS: 请求-响应消息
请求-回复消息
https://docs.nats.io/nats-concepts/core-nats/reqreply
请求-回复
在分布式系统中,请求-回复是一种常见的模式。发送请求之后,应用程序或者基于特定的超时等待回复,或者 同步
收到响应内容
现代系统不断增长的复杂性需要诸如 位置透明性
的特性,扩展与收缩,可发现性等等。为了支持该特性,多种其他的技术需要与其他组件协作,sidecar 和代理。NATS 从使用另外一种途径,实现的请求-回复模式更加简单。
NATS 使得请求-回复更为简单和强大
- NATS 使用核心通讯机制来支持请求-回复模式 - 发布和订阅。请求使用一个回复主题发布到特定的主题上,响应者监听在该主题上,然后将回复发送回回复主题。回复主题被称为
Inbox
收件箱。这些唯一的主题被动态直接返回给请求者,而不受彼此位置的影响。 - 多个NATS 响应者可以构成动态的 queue 组。进而,不需要手动将订阅者添加进入或者从组中删除来启动或者停止分布式消息。这是自动完成的,该特性支持响应者根据需要扩展或者收缩。
- NATS 应用程序
退出前抽干
(在关闭连接之前处理缓冲的消息))。该特性支持应用程序可以收缩而不会丢失请求消息。 - 因为 NATS 基于发布订阅,可观察性如同执行其他应用一样简单,可以观察请求和响应来测量延迟,注意异常情况、直接可扩展性等。
- NATS 的强大甚至可以支持多响应,使用首个响应并高效丢弃其他的消息。该特性优美支持多个响应者,减少响应的延迟和抖动。
模式
使用 请求-回复 演练 来实验该功能
没有响应者
当请求发送到没有订阅者的主题上时,可以方便地知道这种问题。
对于该场景,NATS 客户端可以 可选没有响应者消息 。这要求服务器和客户端支持 Headers。在启用之后,发送到没有订阅者的主题后,将立即收到一个 503 的状态,没有主体的回复响应。
多数的客户端对于此种场景将抛出或者返回一个错误,例如
m, err := nc.Request("foo", nil, time.Second);
# err == nats.ErrNoResponders
https://natsbyexample.com/examples/messaging/request-reply/dotnet2
请求-响应
模式支持客户端在发送一个消息之后,期待得到某种响应返回。在实践中,请求消息或者是一个命令,期望请求的服务处理某种工作并返回状态的变化,或者是一个查询,用来请求信息。
与诸如 HTTP 的请求响应约束不同,NATS 并不严格限制在客户端和服务端的点对点的约束。请求-响应模式是构建在核心的发布订阅模型之上的。
在默认情况下,这意味着任何对请求消息的订阅者都可以作为响应者并回复客户端。这是因为 NATS 并不限制点对点的交互,客户端可以向 NATS 指示应允许多个回复。
下面的示例展示了基本的请求-响应模式,包括标准的在没有订阅者存在的情况下的 没有响应者
错误处理,以及响应请求的消息。
代码说明
首先需要安装 NATS.Net NuGet 包。
创建 NATS 连接
代码中使用常用的命名空间和创建 NATS 链接
连接到 NATS 服务器,因为连接是 Disposable 的,我们应该 flush 使用的缓冲区并关闭连接。
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using NATS.Client.Core;
var stopwatch = Stopwatch.StartNew();
var url = Environment.GetEnvironmentVariable("NATS_URL") ?? "127.0.0.1:4222";
Log($"[CON] Connecting to {url}...");
var opts = NatsOpts.Default with { Url = url };
await using var nats = new NatsConnection(opts);
创建消息处理器,订阅到目标主题上
创建消息的事件处理器,然后借助于通配符 greet.*
订阅到目标主题上。
当客户端准备请求的时候,客户端填充 reply-to
字段,然后开始将它作为主题监听 ()订阅) 它,对于响应者来说,只是简单的发布消息到 reply-to 上。
await using var sub = await nats.SubscribeCoreAsync<int>("greet.*");
var reader = sub.Msgs;
var responder = Task.Run(async () =>
{
await foreach (var msg in reader.ReadAllAsync())
{
var name = msg.Subject.Split('.')[1];
Log($"[REP] Received {msg.Subject}");
await Task.Delay(500);
await msg.ReplyAsync($"Hello {name}!");
}
});
客户端发送请求,等待响应最多 1s
var replyOpts = new NatsSubOpts { Timeout = TimeSpan.FromSeconds(2) };
Log("[REQ] From joe");
var reply = await nats.RequestAsync<int, string>("greet.joe", 0, replyOpts: replyOpts);
Log($"[REQ] {reply.Data}");
Log("[REQ] From sue");
reply = await nats.RequestAsync<int, string>("greet.sue", 0, replyOpts: replyOpts);
Log($"[REQ] {reply.Data}");
Log("[REQ] From bob");
reply = await nats.RequestAsync<int, string>("greet.bob", 0, replyOpts: replyOpts);
Log($"[REQ] {reply.Data}");
服务端取消订阅
取消订阅。
等待原有的处理队列完成
await sub.UnsubscribeAsync();
await responder;
服务端取消订阅之后,后继请求将会超时
try
{
reply = await nats.RequestAsync<int, string>("greet.joe", 0, replyOpts: replyOpts);
Log($"[REQ] {reply.Data} - This will timeout. We should not see this message.");
}
catch (NatsNoReplyException)
{
Log("[REQ] timed out!");
}
完成
Log("Bye!");
return;
void Log(string log) => Console.WriteLine($"{stopwatch.Elapsed} {log}");
NATS: 请求-响应消息的更多相关文章
- BizTalk开发系列(三十)单向端口实现请求-响应
BizTalk本质上是异步的消息处理引擎.BizTalk的请求与响应模式是基于异步之上的同步消息交换.消息引擎通过消息的扩展架构链接许 多异步消息,消息的相关集关联请求与响应消息.例如,客户端发送一个 ...
- Katalon Studio之请求响应中文乱码解决方法
最近在用Katalon做接口测试过程中发现请求响应消息中返回的中文均为乱码,这是因为我们使用的系统环境在初始安装时选择的中文简体,导致windows系统默认编码格式为GBK,但是KS的编码格式是UTF ...
- 第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装
微信服务器和第三方服务器之间究竟是通过什么方式进行对话的? 下面,我们先看下图: 其实我们可以简单的理解: (1)首先,用户向微信服务器发送消息: (2)微信服务器接收到用户的消息处理之后,通过开发者 ...
- Axis2(10):使用soapmonitor模块监视soap请求与响应消息
在Axis2中提供了一个Axis2模块(soapmonitor),该模块实现了与<WebService大讲堂之Axis2(9):编写Axis2模块(Module)>中实现的logging模 ...
- “一切都是消息”--MSF(消息服务框架)之【请求-响应】模式
在前一篇, “一切都是消息”--MSF(消息服务框架)入门简介, 我们介绍了MSF基于异步通信,支持请求-响应通信模式和发布-订阅通信模式,并且介绍了如何获取MSF.今天,我们来看看如何使用MSF来做 ...
- WCF消息交换模式之请求-响应模式
WCF的消息交换模式(MEP)有三种:请求/响应.单向模式和双工模式.WCF的默认MEP是请求/响应模式. 请求/响应模式操作签名代码如下,无需指定模式,默认就是. [OperationContrac ...
- Eclipse 查看 WebService 服务请求和响应消息
每个WebService 对入参和返参都是有自己的要求的:别人调用我的WebService,需要按照我的要求进行传参.当我返回数据时,我也得告诉别人,我的返回数据是怎样组织的,方便别人读取. 那怎样查 ...
- “一切都是消息”--iMSF(即时消息服务框架)之【请求-响应】模式(点对点)
MSF的名字是 Message Service Framework 的简称,由于目前框架主要功能在于处理即时(immediately)消息,所以iMSF就是 immediately Message S ...
- Java开发微信公众号(三)---微信服务器请求消息,响应消息,事件消息以及工具处理类的封装
在前面几篇文章我们讲了微信公众号环境的配置 和微信公众号服务的接入,接下来我们来说一下微信服务器请求消息,响应消息以及事件消息的相关内容,首先我们来分析一下消息类型和返回xml格式及实体类的封装. ( ...
- HTTP协议请求响应过程和HTTPS工作原理
HTTP协议 HTTP协议主要应用是在服务器和客户端之间,客户端接受超文本. 服务器按照一定规则,发送到客户端(一般是浏览器)的传送通信协议.与之类似的还有文件传送协议(file transfer p ...
随机推荐
- nexus 部署与设置
安装nexus df -h 先查看目录磁盘空间,我安装的版本占用了四个G 空间,目录文件空间不够导致启动失败 上传 nexus 压缩包,并解压 查询 8081 端口号是否被占用 sudo netsta ...
- U179915 关于分级火箭的一点理想化的计算
题目地址 本题是一道疯狂推式子的玄学复杂度sb题. 解题思路 1.数学部分 首先假定已经将火箭分成了 \(n+1\) 级,记使用了 \(n\) 个分级器.记各级的开始时间点为: \[0=t_0&l ...
- 批量解压zip文件到指定位置
话不多说,直接上代码. # coding:utf-8 import zipfile import utils_file n = 21 # 我事先知道我有多少个文件,所以确定为21 for i in r ...
- 银河麒麟、中标麒麟学习实操资料汇总(含V4、V7、V10)
数据库和操作系统关系十分密切,因为数据库是运行于操作系统上的一个管理数据的应用.在数据库国产化替代的浪潮之下,一批批国产操作系统也崭露头角.墨天轮社区便选取了中国操作系统排行榜上排名靠前的麒麟软件,依 ...
- 常用的linux命令 docker常用命令
mkdir 新建目录 rmdir 删除目录 rm只能删除文件,不能删除目录 cp test.txt Documents 进入容器的目录 docker exec -it <container_id ...
- 2. 王道OS-操作系统的特征,发展和分类
1. 并发:宏观上是同时发生的,微观是交替发生的 :ps:并行:宏观和微观都是同时发生的 : ps:单核CPU同一时刻只能执行一个程序,各个程序只能并发的执行 : 多核CPU同一时刻可以同时执行多个程 ...
- ajax异步请求数据还没有返回,页面时空白的如何处理
使用骨架屏,给用户一种正在解析数据的感觉 : element-ui的骨架屏 :https://element.eleme.cn/#/zh-CN/component/skeleton
- [第一章 web入门]SQL注入-1
启动靶机 很明显注入点为id值,单引号闭合影响语句,说明为单引号闭合 构造注入语句 ?id=1 ' and 1 =1 --+ 发现没报错,说明没有其他过滤 ,开始sql注入 ?id=1 ' order ...
- Python 实现Excel XLS和XLSX格式相互转换
在日常工作中,我们经常需要处理和转换不同格式的Excel文件,以适应不同的需求和软件兼容性.Excel文件的两种常见格式是XLS(Excel 97-2003)和XLSX(Excel 2007及以上版本 ...
- docker常用命令与应用
docker入门与docker file介绍 原文地址 docker常用命令 https://blog.csdn.net/leilei1366615/article/details/106267225 ...