NATS Streaming Server(NATS 流媒体服务器)
NATS Streaming 是一个基于 NATS 的极其高性能、轻量级可靠的流媒体平台。
NATS Streaming 提供以下高级功能集。
- 基于日志。
- 至少一次交付模式,提供可靠的消息传递。
- 每个订阅的速率匹配。
- 重播/重新启动
- 最后值语义
概念
与NATS的关系
NATS Streaming Server 默认嵌入 NATS 服务器。也就是说,Streaming 服务器本身不是服务器,而是 NATS 服务器的客户端。
这意味着 Streaming 客户端不直接连接到流服务器,而是通过 NATS Server 与流服务器通信。
当涉及到流媒体客户端到流服务器的连接时,这个细节非常重要。实际上,由于没有直接连接,服务器知道客户机是否基于心跳连接。
因此强烈建议客户端在应用程序退出时关闭其连接,否则服务器将认为这些客户端已连接(发送数据等),直到检测到心跳丢失为止。
流媒体服务器创建特定主题的内部订阅,以便与其客户机或其他服务器通信。
请注意,NATS 客户端和 NATS Streaming 客户端无法在彼此之间交换数据。也就是说,如果流式客户端在 foo 上发布,则订阅该相同主题的 NATS 客户端将不会接收消息。流式消息是由 protobuf 组成的 NATS 消息。流媒体服务器将向生产者发送 ACK,并从消费者接收 ACK。如果与 NATS 客户端自由交换消息,将会导致问题。
客户连接
如上所述,客户端不直接连接到流服务器。相反,他们发送连接请求。该请求包括客户端 ID,服务器使用该客户端 ID 来唯一地标识和限制给定客户端。也就是说,没有两个具有相同客户端 ID 的连接将能够并发运行。
此客户端 ID 将给定连接链接到其已发布的消息,订阅,尤其是持久订阅。实际上,持久订阅存储为客户端 ID 和持久名称的组合。稍后将详细介绍持久订阅。
它还用于解决没有与服务器的直接客户端连接的问题。例如,假设客户端在未关闭连接的情况下崩溃。它稍后使用相同的客户端 ID 重新启动。服务器将检测到此客户端 ID 已在使用中。它会尝试将该已知客户端与其原始私人收件箱联系。如果服务器没有收到响应 -- 如果客户端崩溃就是这种情况 -- 它将用这个新客户端替换旧客户端。
否则,服务器将拒绝连接请求,因为客户端 ID 已在使用中。
通道
频道是 NATS 流媒体服务器的核心。频道是客户端向其发送数据和使用数据的主题。
注意:NATS Streaming 服务器不支持通道的通配符,也就是说,无法在 foo.* 或 >等上订阅...
通过配置可以限制通道数(默认情况下)。生成到通道的消息存储在此通道内的消息日志中。
存储接口
每个 Store 实现都遵循 Store interface。
启动时,服务器会创建 Store 的唯一实例。Store 实现的构造函数可以执行一些初始化和配置检查,但此时不能访问或尝试恢复存储。这很重要,因为当服务器在Fault Tolerance 模式下运行时,必须在许多服务器之间共享存储,但只有一个服务器可以使用它。
实例化存储后,服务器将调用 Recover() 以恢复持久状态。对于不支持持久性的实现,例如提供的 MemoryStore,此调用将返回 nil(无错误)以指示没有恢复状态。
该 Store 用于添加/删除客户端,创建/查找渠道等...
创建/查找通道将返回 ChannelStore,它指向另外两个接口 SubStore 和 MsgStore。
于给定的通道,这些存储分别处理订阅和消息。
如果您希望为新的 Store 类型做出贡献,那么您的实现必须包含所有这些接口。对于允许恢复的存储(例如文件存储而不是内存存储),还有其他结构已定义,应由 Recover() 返回。
内存和提供的文件存储实现都使用通用存储实现来避免代码重复。在编写自己的 Store 实现时,您可以对不需要执行通用实现提供的 API 的 API 执行相同的操作。您可以查看 MemStore 和 FileStore 实现以获取更多详细信息。
存储加密
可以将服务器配置为在存储消息时加密消息的有效负载,从而提供静态加密。 这可以从命令行或配置文件中完成。 检查配置部分中的 encrypt 和 encryption_key。
建议通过环境变量 NATS_STREAMING_ENCRYPTION_KEY 而不是 encryption_key 提供加密密钥。 如果启用了加密并且找到了 NATS_STREAMING_ENCRYPTION_KEY,则这将优先于 encryption_key 值。
群集
NATS Streaming Server 支持使用 Raft 一致性算法实现的群集和数据复制,以实现高可用性。
引导群集有两种方法:使用显式群集配置或使用种子节点进行“自动”配置。首先,我们提供参与集群的节点的 ID。在本例中,参与节点将选出一个 leader。第二个,我们启动一个服务器作为种子节点,它将选择自己作为 leader,后续服务器将自动加入种子(请注意,一旦建立了 leader,这也适用于显式群集配置)。使用第二种方法,我们需要小心避免将多个服务器作为种子启动,因为这将导致裂脑。这两种配置方法都显示在下面的部分中。
建议在群集中运行奇数个服务器,并且至少有三台服务器,以避免裂脑情况。请注意,如果少于大多数服务器可用,则群集无法取得进展,例如如果两个节点在三个集群中关闭,则集群将不可用,直到至少一个节点返回。
有关通道分区和群集的注意事项。这两个功能是互斥的。尝试启动启用了分区和群集通道的服务器将导致启动错误。群集要求在群集中复制所有通道。
容错
为了最大限度地减少单点故障,NATS Streaming 服务器可以在 Fault Tolerance 模式下运行。 它的工作原理是拥有一组服务器,其中一个服务器充当活动服务器(访问存储)并处理与客户端的所有通信,以及所有其他服务器充当备用服务器。
需要注意的是,无法同时将 Nats Stream 作为 Fault Tolerance 模式和 Clustering 模式运行。
要在 Fault Tolerance(FT)模式下启动服务器,请指定 FT 组名称。
分区
请注意,此功能与群集模式不兼容。 尝试启用启用了分区和群集的服务器将导致启动错误。
可以限制服务器可以处理的通道列表。 这可以用于:
- 防止创建不需要的频道
- 在使用相同群集ID运行的多个服务器之间共享负载
为此,您需要在配置文件中启用分区参数,并在 store_limits 配置的 channels 部分中指定允许的通道列表。
通道不需要覆盖任何限制,但需要为服务器指定它们以仅为这些通道提供服务。
监控
为了监视 NATS 流系统,在专用监视端口上使用轻量级 HTTP 服务器。 监视服务器提供了几个端点,所有端点都返回一个 JSON 对象。
NATS监控端点支持 JSONP,可以轻松创建单页面监控 Web 应用程序。 只需将回调查询参数传递给任何端点。
入门
获得 NATS Streaming Server 的最佳方法是使用可用于 OSX、Linux(x86-64/ARM)、Windows 的预构建版本二进制文件。 有关使用这些二进制文件的说明,请参阅 GitHub 发行页面。
当然,您可以从主分支构建最新版本的服务器。 主分支将始终构建并通过测试,但可能无法在您的环境中正常工作。 您首先需要在您的计算机上安装 Go(需要1.5+版本)来构建 NATS 服务器。
另请参阅 NATS Streaming 快速入门 教程。