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 ...
随机推荐
- 数据库周刊57丨Oracle 2021年度安全警报;MySQL 8.0.23发布;MySQL索引优化导致的死锁案例;巨杉数据库跨引擎事务实践;MongoDB企业级能力解析;OceanBase OBCP 实验指导手册……
摘要:墨天轮数据库周刊第57期发布啦,每周1次推送本周数据库相关热门资讯.精选文章.干货文档. 热门资讯 1.Oracle 2021年度安全警报: Critical Patch Update 发布8个 ...
- 2021年8月国产数据库排行榜:TiDB稳榜首,达梦返前三,Kingbase进十强,各厂商加速布局云生态
8月份的国产数据库流行度排行榜新鲜出炉.本月共有139个数据库参与了排名. 先来看看排行榜前五名.PingCAP的TiDB分数连续第二个月上涨,总分达到630.21,以136.48的分数差拉开了与第二 ...
- 墨天轮访谈 | Pika数据库陈磊:云时代下,键值数据库是否会被替代?
分享嘉宾:陈磊 开源数据库Pika项目PMC核心人员 整理:墨天轮社区 导读 大家好,今天我分享的主题是:KV数据库,云时代的文件存储. 随着AI和机器学习等技术的发展,数据演变为了十分宝贵的资源,数 ...
- C# efcode 新建表格数据 增删改查
using TestDbContext ctx = new TestDbContext(); var b1 = new Book { AuthorName = "杨中科", Tit ...
- 12. $nextTick 的作用
使用场景:我们改变 dom 结构所依赖的数据的时候,不能直接操作 dom ,因为 dom 还没有更新完成 : 作用 : nextTick 用来感知 dom 的更新完成,类似于 updated 函数 : ...
- 【小 w 的代数】(提供一种 n^2 log 的解法)
前言: 卖点 记录 CTH 的发言 CTH:你这真是 n^3 的 CTH:我也不知道你线段树优化个啥,\(n^3 \log n\) CTH:你优化到哪了啊 CTH:······你从赛时打这个题到现在 ...
- python调用imgkit将html转图片pdf问题实例wkhtmltox
wkhtmltox的下载地址:https://wkhtmltopdf.org/downloads.html 或者:https://github.com/wkhtmltopdf/wkhtmltopdf ...
- Flink on Yarn和k8s
Yarn 架构 下图为作业提交到yarn的交互流程: 组件列表 ResourceManager (RM):ResourceManager (RM) 负责处理客户端请求.启动 / 监控 Applicat ...
- 强化学习:gym下atari游戏环境的官方文档地址
2024年10月16日 共建议查看两个历史上的官方地址: https://ale.farama.org/ https://www.gymlibrary.dev/ 最新官方地址: https://ale ...
- Nginx 配置 浏览器显示真实接口地址
server { listen 9780; server_name localhost; #charset koi8-r; access_log /var/log/nginx/host.access. ...