NATS Streaming Server

NATS 流媒体系统服务器。(NATS Streaming System Server.)

Github stars Tracking Chart

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 快速入门 教程

Main metrics

Overview
Name With Ownernats-io/nats-streaming-server
Primary LanguageGo
Program languageGo (Language Count: 2)
PlatformLinux, Mac, Windows
License:Apache License 2.0
所有者活动
Created At2016-03-24 17:42:39
Pushed At2024-04-01 16:59:27
Last Commit At
Release Count55
Last Release Namev0.25.6 (Posted on 2023-11-17 15:11:44)
First Release Namev0.1.0 (Posted on )
用户参与
Stargazers Count2.5k
Watchers Count79
Fork Count290
Commits Count1.7k
Has Issues Enabled
Issues Count639
Issue Open Count56
Pull Requests Count611
Pull Requests Open Count3
Pull Requests Close Count47
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private

NATS Streaming Server

NATS Streaming is an extremely performant, lightweight reliable streaming platform built on NATS.

License ReportCard Build Release Coverage

Documentation

Clients

You can find here the list of NATS Streaming clients supported by Synadia. There are also links to community-contributed clients.

Contact

  • Twitter: Follow us on Twitter!
  • Google Groups: Where you can ask questions
  • Slack: To join go here. You can ask questions to our maintainers and to the rich and active community.

Contributing

If you are interested in contributing to NATS, read about our...

Security

If you've found a vulnerability or a potential vulnerability in the NATS server, please let us know at
nats-security.

License

Unless otherwise noted, the NATS source files are distributed
under the Apache Version 2.0 license found in the LICENSE file.