请求-回复
请求-回复(Request-Reply)是现代分布式系统中一种常见的消息传递模式。发送一个请求后,应用程序要么等待响应并设置一定的超时时间,要么以异步方式接收响应。
随着现代系统的复杂性增加,需要实现诸如 位置透明性、扩容与缩容、可观测性(基于系统生成的数据来衡量其状态)等功能。为了实现这些功能,各种其他技术需要引入额外的组件、边车(sidecar,即支持主应用的进程或服务)以及代理。相比之下,NATS 实现请求-回复模式要简单得多。
NATS 使 请求-回复 变得简单而强大
- NATS 使用其核心通信机制——发布与订阅,来支持请求-回复模式。请求 被发布到指定的主题,并附带一个回复主题,表明要回复到哪里。Responder(响应方)监听该主题,并将响应发送到请求中附带的回复主题。回复主题被称为“inbox”,这是一种动态生成的唯一主题,无论请求方和响应方的位置如何,它都会自动将消息定向回请求方。
- 多个 NATS Responder 可以组成动态队列组。因此,无需手动添加或移除订阅者,系统会自动分配消息。这使得响应方可以根据需求进行扩容或缩容。
- NATS 应用程序在退出前会“清空缓冲”(在关闭连接前处理完所有缓冲的消息)。这使得应用程序可以在不丢失请求的情况下进行缩容。
- 由于 NATS 基于发布-订阅模式,可观测性非常简单:只需运行另一个应用程序,即可查看请求和响应,从而测量延迟、检测异常、监控可扩容性等。
- NATS 的强大功能甚至允许多个响应,其中第一个响应会被使用,而其他多余响应会被系统高效地丢弃。这使得复杂的模式能够拥有多个响应方,同时降低响应延迟和抖动。
模式图示

您可以使用实时服务器自行体验 NATS 的请求-回复功能,请参阅 请求-回复操作指南。
没有响应方的情况
当向一个没有订阅者的主题发送请求时,及时知道这一点可能会很方便。在这种情况下,NATS 客户端可以选择启用 no_responder 消息。这需要服务器和客户端都支持消息头。如果启用此功能,向没有订阅者的主题发送的请求将立即收到一个无正文的回复,且状态码为 503。
大多数客户端会通过抛出错误或返回错误代码来表示这种情况。例如:
m, err := nc.Request("foo", nil, time.Second);
# err == nats.ErrNoResponders