开发客户端

NATS 客户端开发指南

本指南为您提供开发 NATS 客户端时需要考虑的事项,包括:

  • 连接处理

  • 授权

  • 详细模式(确认)

  • 严格模式

  • 心跳间隔

  • 协议解析

  • 决定解析策略

  • 存储和分发订阅回调

  • 实现请求/响应

  • 错误处理、断开连接与重连

  • 集群支持

学习实现客户端的最佳方式可能是查看由 Synadia 团队维护的客户端之一。这些客户端通常功能齐全,如果您可以使用它们,那更好;但如果您必须编写一个客户端,这些客户端可能超出了您的需求,同时仍涵盖了此处讨论的许多设计考量。

有关更多链接和社区支持的语言,请参阅使用 NATS 开发

客户端连接选项

客户端可以以认证或未认证模式连接,也可以启用详细模式以启用 ACK 机制。有关详细信息,请参阅协议文档

客户端授权

默认情况下,客户端可以以未认证模式连接到服务器。您可以配置 NATS 服务器要求密码认证才能连接。

例如,使用命令行:

然后客户端必须进行身份验证才能连接到服务器。例如:

详细模式

当启用 “详细”(verbose) 模式(通过 CONNECT 消息)时,NATS 服务器将返回 +OK 以确认收到了有效的协议消息。NATS 服务器会自动运行在详细模式下。出于性能原因,大多数客户端实现禁用了详细模式(在 CONNECT 消息中将其设置为 false)。

严格模式

客户端还可以支持“严格”(pedantic)模式。严格模式向表示服务器表明需要严格执行协议。

心跳间隔

NATS 实现了自动修剪。当客户端连接到服务器时,服务器期望该客户端保持活跃状态。NATS 服务器会定期向每个订阅者发送心跳,期望收到回复。如果在可配置的时间限制内没有收到回复,服务器将断开与客户端的连接。

解析协议

NATS 提供基于文本的消息格式。基于文本的协议使得实现 NATS 客户端变得容易。关键问题是决定解析策略。

NATS 服务器实现了零分配字节解析器arrow-up-right,它快速且高效。在传输线上,NATS 消息只是一个字节切片。在传输线上,消息通过 TCP 连接作为不可变字符串传输。解析消息的逻辑由客户端实现。

NATS 消息结构包括主题字符串、可选回复字符串和可选数据字段(字节数组)。类型 Msg 是订阅者和 PublishMsg() 使用的结构。

NATS 发布者将 Data 参数发布到给定的主题。Data 参数保持不变,需要接收方亲自正确解析。客户端如何解析 NATS 消息取决于编程语言。

决定解析策略

一般来说,NATS 客户端的协议解析是字符串操作。例如,在 Python 中,字符串操作比正则表达式更快。Go 和 Java 客户端也使用字符串操作来解析消息。但是,如果您查看 Ruby 客户端,会发现使用正则表达式来解析协议,因为在 Ruby 中正则表达式比字符串操作更快。

总之,没有万能的解析方案——这取决于编程语言。但是,您在编写客户端时需要考虑如何解析消息。

存储和分发订阅回调

当您向服务器订阅时,需要存储和分发回调处理程序(handlers)。

在客户端方面,您需要一个哈希映射来存储此数据结构。哈希映射将存储回调,将订阅 ID 映射到订阅。

哈希映射的键是订阅 ID。键用于在哈希映射中查找回调。当您离线处理 NATS 消息时,会将参数主题、回复主题和有效负载传递给回调处理程序,该处理程序会执行其工作。

因此,您必须存储 订阅 ID -> handlers 的映射。回调位于订阅内部。

实现请求/响应

何时使用 发布/订阅 vs. 请求/响应 取决于您的使用场景。运行每个教程以了解每种实现风格之间的差异。

错误处理、断开连接与重连

错误处理的注意事项主要包括处理客户端断开连接和实现重试逻辑。

集群支持

NATS 客户端具有重连逻辑。因此,如果您正在实现集群,需要预先实现重连回调,这意味着您无法在运行时修改它。启动时,您需要已经具备该信息。

最后更新于