本功能对比是对当今几种流行消息技术中一些主要组件的总结。这绝不是一个详尽的列表,每种技术都应经过深入调查,以确定哪种技术最适合您的实施。
在本次对比中,我们将介绍NATS、Apache Kafka、RabbitMQ、Apache Pulsar和gRPC。
| 项目 | 客户端语言与平台 |
|---|---|
| NATS | Core NATS:已知48种客户端类型,其中11种由维护者支持,18种由社区贡献。NATS Streaming:7种客户端类型由维护者支持,4种由社区贡献。NATS服务器可在Golang支持的架构上编译,提供二进制分发版本。 |
| gRPC | 13种客户端语言。 |
| Kafka | 社区和Confluent支持18种客户端类型。Kafka服务器可在支持Java的平台上运行,支持范围非常广泛。 |
| Pulsar | 7种客户端语言,5种第三方客户端——在macOS和Linux上测试通过。 |
| RabbitMQ | 至少10种维护者支持的客户端平台,超过50种社区支持的客户端类型。服务器支持以下平台:Linux、Windows NT。 |
| 项目 | 支持的模式 |
|---|---|
| NATS | 通过内置的发布/订阅、请求-回复和负载均衡队列订阅者模式实现流和服务。支持动态请求权限设置和请求主题混淆。 |
| gRPC | 每个通道可支持一个服务,该服务可能具有流语义。服务的负载均衡可以通过客户端或代理实现。 |
| Kafka | 通过发布/订阅实现流。负载均衡可通过消费者组实现。应用程序代码必须通过多个主题将请求与回复相关联,以实现服务(请求-回复)模式。 |
| Pulsar | 通过发布/订阅实现流。多种竞争消费者模式支持负载均衡。应用程序代码必须通过多个主题将请求与回复相关联,以实现服务(请求-回复)模式。 |
| RabbitMQ | 通过发布/订阅实现流,以及通过 直接回复到... 功能实现服务。负载均衡可通过工作队列实现。应用程序必须通过多个主题将请求与回复相关联,以实现服务(请求-回复)模式。 |
| 项目 | 服务质量/保障 |
|---|---|
| NATS | JetStream支持最多一次、至少一次和恰好一次三种保障级别。 |
| gRPC | 最多一次。 |
| Kafka | 至少一次、恰好一次。 |
| Pulsar | 最多一次、至少一次和恰好一次。 |
| RabbitMQ | 最多一次、至少一次。 |
| 项目 | 多租户支持 |
|---|---|
| NATS | NATS通过账户和支持共享流和服务,真正实现了多租户和去中心化安全。 |
| gRPC | N/A |
| Kafka | 不支持多租户。 |
| Pulsar | 通过租户实现多租户;不支持跨租户的内置数据共享。每个租户可以拥有自己的身份验证和授权方案。 |
| RabbitMQ | 通过虚拟主机(vhosts)支持多租户;不支持数据共享。 |
| 项目 | 身份认证 |
|---|---|
| NATS | NATS支持TLS、NATS凭据、NKEYS(NATS ED25519密钥)、用户名和密码,或简单令牌。 |
| gRPC | TLS、ALT、令牌、通道和调用凭据,以及插件机制。 |
| Kafka | 支持Kerberos和TLS。支持JAAS和一个开箱即用的授权器实现,该实现使用ZooKeeper存储连接和主题信息。 |
| Pulsar | TLS身份验证、Athenz、Kerberos、JSON Web Token身份验证。 |
| RabbitMQ | TLS、SASL、用户名和密码,以及可插拔授权。 |
| 项目 | 授权 |
|---|---|
| NATS | 账户限制包括连接数、消息大小、导入和导出数量。用户级别的发布和订阅权限、连接限制、CIDR地址限制和一天中的时间限制。 |
| gRPC | 用户可以配置调用凭据,以对服务上的单个调用进行精细粒度的授权。 |
| Kafka | 支持JAAS、ACLs,用于丰富的Kafka资源,包括主题、集群、组等。 |
| Pulsar | 可以为特定角色授予生产与消费等操作的列表权限。 |
| RabbitMQ | ACL规定了对交换、队列、事务等资源的配置、写入和读取操作的权限。身份验证是可插拔的。 |
| 项目 | 消息保留与持久化支持 |
|---|---|
| NATS | 支持基于内存和文件的持久化。消息可以通过时间、计数或序列号回放,支持持久订阅。在NATS Streaming中,脚本可以将旧的日志段归档到冷存储。 |
| gRPC | 不适用 |
| Kafka | 支持基于文件的持久化。消息可以通过指定偏移量回放,支持持久订阅。日志压缩和KSQL也受支持。 |
| Pulsar | 支持分层存储,包括文件、Amazon S3或Google Cloud Storage(GCS)。Pulsar可以按特定位置回放消息,支持持久订阅。Pulsar SQL和主题压缩也受支持,以及Pulsar函数。 |
| RabbitMQ | 支持基于文件的持久化。Rabbit支持基于队列的语义(而非日志),因此无法进行消息回放。 |
| 项目 | 高可用性 (HA) 和容错 (FT) 支持 |
|---|---|
| NATS | Core NATS支持具备自愈功能的全网状集群,为客户端提供高可用性。NATS Streaming具有热备故障转移备份服务器,有两种模式(FT和完全集群)。JetStream支持水平扩展,内置镜像复制。 |
| gRPC | 不适用。gRPC依赖于外部资源来实现HA/FT。 |
| Kafka | 通过Zookeeper协调完全复制的集群成员。 |
| Pulsar | Pulsar支持集群代理,具备地理复制。 |
| RabbitMQ | 通过联邦插件提供完整的数据复制集群支持。集群要求低延迟网络,且网络分区很少发生。 |
| 项目 | 支持的部署模型 |
|---|---|
| NATS | NATS 网络元件(服务器)是一个小巧的静态二进制文件,可部署于任何环境,从云端的大型实例到资源受限的设备(如树莓派)。NATS 支持自适应边缘架构,允许进行大规模、灵活的部署。单服务器、叶节点、集群和超级集群(集群的集群)可以任意组合,形成极其灵活的部署方式,适用于云、本地、边缘和 IoT 场景。客户端无需感知拓扑结构,可以连接到部署中的任意 NATS 服务器。 |
| gRPC | gRPC 是点对点的,没有需要部署或管理的服务器或代理,但在生产部署中总是需要额外的组件。 |
| Kafka | Kafka 支持集群化,并支持镜像到松散耦合的远程集群。客户端与集群内定义的分区绑定。Kafka 服务器需要 JVM、8 核 CPU、64 GB 至 128 GB 内存、两个或多个 8-TB SAS/SSD 磁盘以及一个 10-Gig 网卡。(1) |
| Pulsar | Pulsar 支持集群化和集群间内置的地理复制。客户端可以连接到任何配置了适当租户和命名空间的集群。Pulsar 需要 JVM,并且至少需要 6 台 Linux 机器或虚拟机:3 台运行 ZooKeeper,3 台运行 Pulsar broker 和 BookKeeper bookie。(2) |
| RabbitMQ | RabbitMQ 支持集群,并通过联邦插件支持跨集群消息传播。客户端无需感知拓扑结构,可以连接到任何集群。服务器需要 Erlang VM 及相关依赖。 |
| 项目 | 监控工具 |
|---|---|
| NATS | NATS 支持将监控数据导出到 Prometheus,并提供 Grafana 仪表板来监控和配置警报。此外还有如 nats-top 等开发监控工具。支持强大的边车(side car)部署模式,或通过 NATS surveyor 实现简单的连接查看模式。 |
| gRPC | 监控 gRPC 需要外部组件,例如服务网格(service mesh)。 |
| Kafka | Kafka 拥有许多管理工具和控制台,包括 Confluent Control Center、Kafka、Kafka Web Console、Kafka Offset Monitor。 |
| Pulsar | 命令行工具(CLI)、按主题的仪表板以及第三方工具。 |
| RabbitMQ | 命令行工具(CLI)、一个基于插件的管理系统(包含仪表板)以及第三方工具。 |
| 项目 | 管理工具 |
|---|---|
| NATS | NATS 将运维与安全分离。部署中的用户和账户管理可以是去中心化的,并通过 CLI 进行管理。服务器(网络元件)的配置与安全分离,使用命令行和配置文件,并可在运行时重新加载更改。 |
| gRPC | 管理 gRPC 需要外部组件,例如服务网格(service mesh)。 |
| Kafka | Kafka 拥有许多管理工具和控制台,包括 Confluent Control Center、Kafka、Kafka Web Console、Kafka Offset Monitor。 |
| Pulsar | 命令行工具(CLI)、按主题的仪表板以及第三方工具。 |
| RabbitMQ | 命令行工具(CLI)、一个基于插件的管理系统(包含仪表板)以及第三方工具。 |
| 项目 | 内置及第三方集成 |
|---|---|
| NATS | NATS 支持 WebSockets、Kafka 网桥、IBM MQ 网桥、Redis 连接器、Apache Spark、Apache Flink、CoreOS、Elastic、Elasticsearch、Prometheus、Telegraf、Logrus、Fluent Bit、Fluentd、OpenFAAS、HTTP、MQTT 以及更多。 |
| gRPC | 有许多第三方集成,包括 HTTP、JSON、Prometheus、Grift 等。(3) |
| Kafka | Kafka 生态系统中有大量集成,包括流处理(Storm, Samza, Flink)、Hadoop、数据库(JDBC, Oracle Golden Gate)、搜索和查询(ElasticSearch, Hive)以及各种日志和其他集成。 |
| Pulsar | Pulsar 拥有许多集成,包括 ActiveMQ、Cassandra、Debezium、Flume、Elasticsearch、Kafka、Redis 等。 |
| RabbitMQ | RabbitMQ 拥有许多插件,包括协议(MQTT, STOMP)、WebSockets 以及各种授权和认证插件。 |