架构师的选择,Pulsar仍是Kafka?

介绍

最近,我一直在研究Pulsar及其与Kafka的比较。快速搜索将显示两个最著名的开源消息传递系统之间存在当前的"战争"。javascript

做为Kafka的用户,我确实对Kafka的某些问题感到困惑,而且我对Pulsar感到很是失望。因此最后,我设法花了一些时间进行研究,而且作了不少研究。在本文中,我将重点介绍Pulsar的优点,并为您提供一些理由,使您对比Kafka来考虑它。可是,请在产品使用,支持,社区,文档等方面明确一点;Kafka显然超过了Pulsar,而且只有在本文中讨论的大多数优势都适合您的用例的状况下,才考虑使用Pulsar。让咱们开始!java

Kafka基础知识

Kafka是消息传递系统之王。它由LinkedIn于2011年建立,并在Confluent的支持下获得了普遍的传播。Confluent已向开源社区发布了许多新功能和附加组件,例如用于模式演化的Schema Registry,用于从其余数据源轻松流式传输的Kafka Connect等。数据库到Kafka,Kafka Streams进行分布式流处理,最近使用KSQL对Kafka主题执行相似SQL的查询等等。它还具备用于许多系统的许多链接器,有关更多详细信息,请查看Confluent Platform。python

Kafka快速,易于安装,很是受欢迎,可用于普遍的范围或用例。从开发人员的角度来看,尽管Apache Kafka一直很友好,但在操做上倒是一团糟。所以,让咱们回顾一下Kafka的一些痛点。git

> Kafka example. Source: https://talks.rmoff.net/pZC6Za/slidesgithub

Kafka的问题

· 扩展Kafka十分棘手,这是因为代理还存储数据的耦合体系结构所致。剥离另外一个代理意味着它必须复制主题分区和副本,这很是耗时。sql

· 没有与租户彻底隔离的本地多租户。数据库

· 存储可能会变得很是昂贵,尽管能够长时间存储数据,可是因为成本问题,不多使用它。apache

· 万一副本不一样步,有可能丢失消息。编程

· 必须提早计划和计算代理,主题,分区和副本的数量(以适应计划的将来使用量增加),以免扩展问题,这很是困难。swift

· 若是仅须要消息传递系统,则使用偏移量可能会很复杂。

· 集群从新平衡会影响相连的生产者和消费者的性能。

· MirrorMaker Geo复制机制存在问题。像Uber这样的公司已经建立了本身的解决方案来克服这些问题。

如您所见,大多数问题与操做方面有关。尽管安装起来相对容易,但Kafka难以管理和调整。并且,它尚未像它可能的那样灵活和有弹性。

Pulsar基础知识

Pulsar由Yahoo在2013年建立,并于2016年捐赠给Apache基金会。Pulsar如今是Apache的顶级项目。Yahoo,Verizon,Twitter等公司在生产中使用它来处理数百万条消息。它具备许多功能,而且很是灵活。它声称比Kafka更快,所以运行成本更低。它旨在解决Kafka的大部分难题,使其更易于扩展。

Pulsar很是灵活;它能够像Kafka这样的分布式日志,也能够像RabbitMQ这样的纯消息传递系统。它具备多种类型的订阅,几种交付保证,保留策略以及几种处理模式演变的方法。它还有不少功能……

> Pulsar architecture: https://pulsar.apache.org/docs/en/concepts-architecture-overview/

Pulsar的特性

· 因为内置了多租户,所以不一样的团队可使用相同的集群并将其隔离。这解决了许多管理难题。它支持隔离,身份验证,受权和配额。

· 多层体系结构:Pulsar将全部主题数据存储在由Apache BookKeeper支持的专业数据层中,做为数据分类账。存储和消息传递的分离解决了扩展,从新平衡和维护集群的许多问题。它还提升了可靠性,几乎不可能丢失数据。另外,在读取数据时,能够直接链接到Bookeeper,而不会影响实时摄取。例如,可使用Presto对主题执行SQL查询,相似于KSQL,但请放心,这不会影响实时数据处理。

· 虚拟主题。因为采用n层体系结构,所以对主题的数量没有限制,主题及其存储是分离的。还能够建立非持久性主题。

· N层存储。Kafka的一个问题是,存储可能变得昂贵。所以,它不多用于存储"冷"数据,而且消息常常被删除。而且仍然向客户展现透明视图;客户端能够从时间开始读取,就像全部消息都存在于日志中同样。

·Pulsar函数。易于部署,轻量级计算过程,对开发人员友好的API,无需运行本身的流处理引擎(如Kafka)。

· 安全性:它具备内置的代理,多租户安全性,可插入身份验证等等。

· 快速从新平衡。分区分为易于从新平衡的段。

· 服务器端重复数据删除和无效字段。无需在客户端中执行此操做,也能够在压缩期间执行重复数据删除。

· 内置架构注册表。支持多种策略,很是易于使用。

· 地理复制和内置发现。将群集复制到多个区域很是容易。

· 集成的负载均衡器和Prometheus指标。

· 多重集成:Kafka,RabbitMQ等。

· 支持许多编程语言,例如GoLang,Java,Scala,Node,Python…

· 客户端不须要知道分片和数据分区,这是在服务器端透明进行的。

> List of features: https://pulsar.apache.org/

如您所见,Pulsar具备许多有趣的功能。

Pulsar 动手

开始使用Pulsar很是容易。确保已安装JDK!

· 下载Pulsar并解压缩:

$ wget https://archive.apache.org/dist/pulsar/pulsar-2.6.1/apache-pulsar-2.6.1-bin.tar.gz

2.下载链接器(可选):

$ wget https://archive.apache.org/dist/pulsar/pulsar-2.6.1/connectors/{connector}-2.6.1.nar

3.下载nar文件后,将文件复制到pulsar目录中的connectors目录

4.启动Pulsar!

$ bin/pulsar standalone

Pulsar提供了一个称为pulsar-client的CLI工具,咱们可使用它与集群进行交互。

产生消息:

$ bin/pulsar-client produce my-topic --messages "hello-pulsar"

阅读消息:

$ bin/pulsar-client consume my-topic -s "first-subscription"

Akka流示例

做为一个客户示例,让咱们在Akka上使用Pulsar4s!

首先,咱们须要建立一个Source来使用数据流,所须要的只是一个函数,该函数将按需建立使用者并查找消息ID:

val topic = Topic("persistent://standalone/mytopic")
val consumerFn = () => client.consumer(ConsumerConfig(topic, subscription))

而后,咱们传递consumerFn函数来建立源:

import com.sksamuel.pulsar4s.akka.streams._
val pulsarSource = source(consumerFn, Some(MessageId.earliest))

Akka源的物化值是Control的一个实例,该对象提供了一种"关闭"方法,可用于中止使用消息。如今,咱们能够像往常同样使用Akka Streams处理数据。

要建立一个接收器:

val topic = Topic("persistent://standalone/mytopic")
val producerFn = () => client.producer(ProducerConfig(topic))
import com.sksamuel.pulsar4s.akka.streams._
val pulsarSink = sink(producerFn)

完整示例摘自Pulsar4s:

Pulsar函数示例

Pulsar函数处理来自一个或多个主题的消息,对其进行转换并将结果输出到另外一个主题:

> Pulsar Functions. Source: https://pulsar.apache.org/docs/en/functions-overview/

能够在两个接口之间进行选择以编写函数:

· 语言本机界面:不须要特定于Pulsar的库或特殊的依赖项。没法访问上下文。仅支持Java和Python。

· Pulsar Function SDK:可用于Java / Python / Go,并提供更多功能,包括访问上下文对象。

使用语言本机接口很是容易,您只需编写一个简单的函数便可转换消息:

def process(input):
return "{}!".format(input)


用Python编写的这个简单函数只是向全部传入的字符串添加一个感叹号,并将结果字符串发布到主题。

要使用SDK,您须要导入依赖项,例如在Go中,咱们将编写:

package main
import (
"context"
"fmt"
"github.com/apache/pulsar/pulsar-function-go/pf"
)


func HandleRequest(ctx context.Context, in []byte) error {
fmt.Println(string(in) + "!")
return nil
}


func main() {
pf.Start(HandleRequest)
}


要发布无服务器功能并将其部署到集群,咱们使用pulsar-admin CLI,若是使用Python,咱们将使用:

$ bin/pulsar-admin functions create \
--py ~/router.py \
--classname router.RoutingFunction \
--tenant public \
--namespace default \
--name route-fruit-veg \
--inputs persistent://public/default/basket-items
Pulsar Functions的一个重要功能是您能够在发布该函数时设置交付保证:
$ bin/pulsar-admin functions create \
--name my-effectively-once-function \
--processing-guarantees EFFECTIVELY_ONCE


有如下选择:


Pulsar的优点

让咱们回顾一下与Kafka相比的主要优点:

· 更多功能:Pulsar函数,多租户,架构注册表,n层存储,多种使用模式和持久性模式等。

· 更大的灵活性:3种订阅类型(独占,共享和故障转移),您能够在一个订阅上收听多个主题。持久性选项:非持久(快速),持久,压缩(每一个消息仅最后一个键)。能够选择交付保证,它具备服务器端重复数据删除和无效字样。许多保留政策和TTL。

· 无需提早定义扩展需求。

· 支持排队和流媒体。所以它能够像RabbitMQ或Kafka。

· 因为存储与代理分离,所以扩展性更好。从新平衡更快,更可靠。

· 易于操做:得益于去耦和n层存储。管理员REST API也很棒。

· 与Presto的SQL集成,可直接查询存储而不会影响代理。

· 借助n层自动存储选项,能够更便宜地存储。

· 更快:许多基准测试在各类状况下都表现出更好的性能。Pulsar声称具备较低的延迟和更好的扩展功能。可是,这正受到Confluent的挑战,所以,请带着盐味作,并本身制定基准。

· Pulsar Functions将无服务器计算带到您的消息传递平台。

· 集成架构注册表支持轻松的架构演变

· 集成的负载平衡器和Prometheus指标。

· 地理复制效果更好,更易于设置。Pulsar还内置了发现能力。

· 能够建立的主题数量没有限制。

· 与Kafka兼容,易于集成。

Pulsar的问题

Pulsar并不完美,Kafka之因此流行是有缘由的,它作一件事而且作得很好。Pulsar试图解决太多领域,但没有超越任何一个领域。让咱们总结一下Pulsar的一些问题:

· 受欢迎程度:Pulsar不那么受欢迎。它缺少支持,文档和实际使用状况。对于大型组织而言,这是一个主要问题。

· 因为n层体系结构,它须要更多组件:Bookkeeper。

· 在平台内没有对流应用程序的适当支持。Pulsar函数与Kafka Streams不一样,它们更简单,而且不用于实时流处理。您没法进行有状态处理。

· 与Kafka相比,插件和客户端更少。此外,掌握Pulsar技能的人较少,所以须要在内部学习。

· 它在云中的支持较少。Confluent具备托管云产品。

Confluent在Pulsar和Kafka之间进行了比较,能够在其中进行更多的详细说明。该博客还回答了有关Kafka与Pulsar的一些问题,但请注意,这些问题可能有偏见。

Pulsar使用案例

Pulsar可用于普遍的用例:

· 发布/订阅队列消息传递

· 分布式日志

· 事件源壁架,用于永久性事件存储

· 微服务

· SQL分析

· 无服务器功能

何时应该考虑Pulsar

· 须要像RabbitMQ这样的队列,也须要像Kafka这样的流处理程序。

· 须要简单的地理复制。

· 多租户是必须具有的,而且想确保每一个团队的访问权限。

· 须要将全部消息保留很长时间,而且不想将其卸载到另外一个存储中。

· 性能对你相当重要,基准测试代表Pulsar提供了更低的延迟和更高的吞吐量。

· 在本地运行,没有设置Kafka的经验,但具备Hadoop经验。

请注意,若是在云中,请考虑基于云的解决方案。云提供商拥有涵盖某些用例的不一样服务。例如,对于队列消息传递,云提供商提供了许多服务,例如Google pub / sub。对于分布式日志,有Confluent云或AWS Kinesis。云提供商还提供了很是好的安全性。Pulsar的优点在于能够在一个平台上提供许多功能。一些团队可能将其用做微服务的消息传递系统,而另外一些团队则将其用做数据处理的分布式日志。

结论

我是Kafka的忠实粉丝,这就是为何我对Pulsar如此感兴趣。竞争是好的,它驱动创新。

Kafka是一种成熟,富有弹性且通过战斗考验的产品,在世界范围内得到了巨大成功。没有它,我没法想象任何公司。可是,我确实看到Kafka成为其自身成功的受害者,巨大的增加减慢了功能开发的速度,由于它们须要支持这么多大型公司。删除ZooKeeper依赖项等重要功能花费的时间太长。这为诸如Pulsar等工具蓬勃发展创造了空间。解决Kafka的一些问题并添加更多功能。

可是,Pulsar仍然很不成熟,在投入生产以前,我会格外当心。在将Pulsar归入你的组织以前,进行分析,进行基准测试,研究并编写概念证实。从小处着手,在从Kafka迁移以前进行概念验证,并在决定进行彻底迁移以前先评估影响。

做者:闻数起舞
连接:https://0x9.me/cYZFN

本文分享自微信公众号 - JAVA高级架构(gaojijiagou)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。