简介最近,我一直在研究Pulsar以及它与Kafka的比较。快速搜索一下就会发现,目前这两个最著名的开源消息系统之间存在着一场“战争”。作为一名Kafka用户,我对Kafka的一些问题确实感到困惑,我对Pulsar感到非常失望。所以最后,我设法花了一些时间研究,并做了很多研究。在本文中,我将重点介绍Pulsar的优势,并为您提供一些考虑Pulsar而不是Kafka的理由。但是,请清楚产品使用、支持、社区、文档等;Kafka明显优于Pulsar,只有在本文讨论的大部分优势适用于您的用例时才考虑Pulsar。让我们开始吧!Kafka基础知识Kafka是消息系统之王。它由LinkedIn于2011年创建,并在Confluent的支持下得到广泛传播。Confluent向开源社区发布了许多新功能和附加组件,例如用于模式演变的SchemaRegistry、用于从其他数据源轻松流式传输的KafkaConnect等等。DatabasetoKafka,KafkaStreams用于分布式流处理,最近使用KSQL对Kafka主题执行类似SQL的查询,等等。它还为许多系统提供了许多连接器,请查看ConfluentPlatform了解更多详细信息。Kafka速度快,易于安装,非常受欢迎,可用于广泛的用例。从开发人员的角度来看,虽然ApacheKafka一直很友好,但操作上却一团糟。那么我们来回顾一下Kafka的一些痛点。>卡夫卡例子。来源:https://talks.rmoff.net/pZC6Za/slidesKafka的问题由于代理也存储数据的耦合架构,扩展Kafka很棘手。剥离另一个代理意味着它必须复制主题分区和副本,这很耗时。没有与租户完全隔离的本地多租户。存储可能变得非常昂贵,虽然数据可以存储很长时间,但由于成本原因很少使用。如果副本不同步,则可能会丢失消息。broker、主题、分区和副本的数量必须提前计划和计算(以适应计划的未来使用量增长)以避免扩展问题,这是非常困难的。如果您只需要一个消息系统,那么使用偏移量可能会很复杂。集群重新平衡会影响连接的生产者和消费者的性能。MirrorMakerGeo复制机制有问题。像优步这样的公司已经创建了自己的解决方案来克服这些问题。如您所见,大多数问题都与运营方面有关。尽管安装相对容易,但Kafka很难管理和调优。此外,它还没有达到应有的灵活性和弹性。Pulsar基础Pulsar于2013年由雅虎创建,并于2016年捐赠给Apache基金会。Pulsar现在是Apache的顶级项目。Yahoo、Verizon、Twitter等公司在生产中使用它来处理数百万条消息。它的功能很多,而且非常灵活。它声称比Kafka更快,因此运行成本更低。它旨在解决Kafka的大部分痛点,使其更易于扩展。Pulsar非常灵活;它可以是像Kafka这样的分布式日志,也可以是像RabbitMQ这样的纯消息系统。它有几种类型的订阅、几种交付保证、保留策略和几种处理模式演变的方法。它还有很多功能...>Pulsar架构:https://pulsar.apache.org/docs/en/concepts-architecture-overview/Pulsar的功能得益于内置的多租户,不同的团队可以使用同一个集群并将其隔离。这解决了许多管理难题。它支持隔离、认证、授权和配额。多层架构:Pulsar将所有主题数据存储在由ApacheBookKeeper提供支持的专用数据层中作为数据分类帐。存储和消息传递的分离解决了扩展、重新平衡和维护集群的许多问题。它还提高了可靠性,几乎不可能丢失数据。此外,在读取数据时,可以直接连接到Bookkeeper而不影响实时摄取。例如,Presto可用于执行针对主题的SQL查询,类似于KSQL,但请放心,这不会影响实时数据处理。虚拟主题。由于n层架构,topic的数量没有限制,topic和它们的存储是分离的。您还可以创建非持久主题。N层存储。Kafka的一个问题是存储会变得昂贵。因此,它很少用于存储“冷”数据,消息经常被删除。并且仍然向客户呈现透明的视图;客户端可以不时读取,就好像所有消息都存在于日志中一样。脉冲星函数。易于部署,计算过程轻量级,对开发者友好的API,无需运行自己的流处理引擎(如Kafka)。安全性:它具有内置代理、多租户安全性、可插入身份验证等。快速重新平衡。分区被分成易于重新平衡的段。服务器端重复数据删除和无效字段。除了在客户端执行此操作,还可以在压缩期间执行重复数据删除。内置架构注册表。支持多种策略,非常简单易用。异地复制和内置发现。将集群复制到多个区域非常容易。集成负载均衡器和Prometheus指标。多种集成:Kafka、RabbitMQ等。支持多种编程语言,如GoLang、Java、Scala、Node、Python……客户端无需了解分片和数据分区,在服务端透明完成。>功能列表:https://pulsar.apache.org/如您所见,Pulsar有许多有趣的功能。Pulsar实践Pulsar入门非常简单。确保你已经安装了JDK!下载Pulsar并解压缩:$wgethttps://archive.apache.org/dist/pulsar/pulsar-2.6.1/apache-pulsar-2.6.1-bin.tar.gz可选):$wgethttps://archive。apache.org/dist/pulsar/pulsar-2.6.1/connectors/{connector}-2.6.1.nar下载完nar文件后,将文件复制到pulsar目录下的connectors目录下启动Pulsar!$bin/pulsarstandalonePulsar提供了一个名为pulsar-client的CLI工具,我们可以使用它与集群进行交互。生成消息:$bin/pulsar-clientproducemy-topic--messages"hello-pulsar"读取消息:$bin/pulsar-clientconsumemy-topic-s"first-subscription"AkkaStreams示例作为客户端示例,让我们在Akka上使用Pulsar4s!首先我们需要创建一个Source来消费流,所需要的只是一个按需创建消费者并查找消息ID的函数:valtopic=Topic("persistent://standalone/mytopic")valconsumerFn=()=>client.consumer(ConsumerConfig(topic,subscription))然后,我们通过consumerFn函数来创建源:importcom.sksamuel.pulsar4s.akka.streams._valpulsarSource=source(consumerFn,Some(MessageId.earliest))Akka源的物化值是Control的一个实例,它提供了一个可用于停止消费消息的“关闭”方法。现在,我们可以像往常一样使用AkkaStreams处理数据。创建接收器:valtopic=Topic("persistent://standalone/mytopic")完整示例摘自Pulsar4s:PulsarFunctions示例Pulsar函数处理来自一个或多个主题的消息,转换它们并将结果输出到另一个主题:>PulsarFunctions。来源:https://pulsar.apache.org/docs/en/functions-overview/您可以在两种接口之间进行选择来编写函数:语言原生接口:不需要特定于Pulsar的库或特殊依赖项。无法访问上下文。仅支持Java和Python。PulsarFunctionSDK:适用于Java/Python/Go,并提供更多功能,包括访问上下文对象。使用语言本机接口非常简单,您只需编写一个简单的函数来转换消息:defprocess(input):return"{}!".format(input)这个用Python编写的简单函数只是向所有传入的String添加一个感叹号并将生成的字符串发布到主题。要使用SDK,您需要导入依赖项,例如在Go中我们会这样写:in[]byte)error{fmt.Println(string(in)+"!")returnnil}funcmain(){pf.Start(HandleRequest)}要发布无服务器函数并将其部署到集群,我们使用pulsar-adminCLI,如果使用Python,我们将使用:$bin/pulsar-adminfunctionscreate\--py~/router.py\--classnamerouter.RoutingFunction\--tenantpublic\--namespacedefault\--nameroute-fruit-veg\--inputspersistent://public/default/basket-itemsPulsarFunctions的一个重要特性是你可以在发布函数时设置交付保证:$bin/pulsar-adminfunctionscreate\--namemy-effectively-once-function\--processing-guaranteesEFFECTIVELY_ONCE有以下几个选项:多种使用模式和持久模式等。更大的灵活性:3种订阅类型(独占、共享和故障转移),您可以在一个订阅上收听多个主题。持久性选项:非持久性(快速)、持久性、压缩(每条消息只有最后一个键)。有一个DeliveryGuarantee选项,它具有服务器端重复数据删除和失效。许多保留策略和TTL。无需提前定义缩放要求。支持排队和流式传输。所以它可以像RabbitMQ或Kafka。因为存储与代理分离,所以扩展性更好。重新平衡更快、更可靠。易于处理:得益于解耦和n层存储。管理员RESTAPI也很棒。与Presto的SQL集成,直接查询store,不影响broker。使用n层自动存储选项以更便宜的方式存储。更快:许多基准测试在各种情况下都表现出更好的性能。Pulsar声称具有更低的延迟和更好的扩展能力。然而,这正在受到Confluent的挑战,所以对它持保留态度并自己进行基准测试。PulsarFunctions将无服务器计算引入您的消息传递平台。集成模式注册表支持简单的模式演变集成负载平衡器和普罗米修斯指标。Geo-replication效果更好并且更容易设置。Pulsar还内置了发现功能。可以创建的主题数量没有限制。与Kafka兼容,易于集成。Pulsar的问题Pulsar并不完美,Kafka流行是有原因的,它只做一件事并且做得很好。Pulsar试图解决太多领域,但不会超越其中任何一个。让我们总结一下Pulsar的一些问题:流行度:Pulsar不是那么流行。它缺乏支持、文档和实际使用。对于大型组织,这是一个主要问题。由于n层架构,它还需要一个组件:Bookkeeper。平台内没有对流式应用程序的适当支持。Pulsar函数与KafkaStreams不同,它们更简单并且不适合实时流处理。您不能进行有状态处理。比Kafka更少的插件和客户端。另外,Pulsar技能的人比较少,需要内部学习。它在云中的支持较少。Confluent有一个托管的云产品。Confluent对Pulsar和Kafka进行了比较,可以对其进行更详细的解释。该博客还回答了一些关于KafkavsPulsar的问题,但请注意,这些问题可能存在偏见。Pulsar用例Pulsar可用于广泛的用例:Pub/Sub队列消息传递分布式日志记录事件源用于持久事件存储的Ledges微服务SQLAnalytics无服务器函数何时应考虑Pulsar需要像RabbitMQ这样的队列,也需要像Kafka这样的流处理器是必须的。需要简单的异地复制。多租户是必须的,并且希望确保每个团队都能访问。需要长期保留所有消息并且不想将它们卸载到另一个存储。性能对您很重要,基准测试表明Pulsar提供了更低的延迟和更高的吞吐量。在本地运行,没有设置Kafka的经验,但有Hadoop的经验。请注意,如果在云中,请考虑基于云的解决方案。云提供商提供涵盖特定用例的不同服务。例如,对于队列消息传递,云提供商提供了许多服务,例如Google发布/订阅。对于分布式日志,有ConfluentCloud或AWSKinesis。云提供商还提供了非常好的安全性。Pulsar的优势在于它可以在一个平台上提供许多功能。一些团队可能将其用作微服务的消息系统,而另一些团队将其用作数据处理的分布式日志。结论我是Kafka的忠实粉丝,这就是我对Pulsar如此感兴趣的原因。竞争是好的,它推动创新。Kafka是一个成熟的、有弹性的、久经考验的产品,在全世界都取得了巨大的成功。我无法想象没有它的任何公司。然而,我确实看到Kafka成为其自身成功的牺牲品,大规模增长减缓了功能开发,因为它们需要支持如此多的大公司。删除ZooKeeper依赖项等重要功能花费的时间太长。这为Pulsar等工具的蓬勃发展创造了空间。修复Kafka的一些问题并添加更多功能。然而,Pulsar还很不成熟,在投入生产之前我会小心谨慎。在将Pulsar纳入您的组织之前,分析、基准测试、研究并编写概念证明。从小处着手,在从Kafka迁移之前进行概念验证,并在决定进行全面迁移之前评估影响。
