当前位置: 首页 > 科技观察

为什么我放弃了Kafka而选择了Pulsar?

时间:2023-03-12 17:25:46 科技观察

最近,我一直在研究Pulsar以及它与Kafka的比较。通过快速搜索,您会看到两个最著名的开源消息传递系统之间正在进行的“战争”。ImageviaPexels作为一个Kafka用户,我确实对Kafka的一些问题感到困惑,但是Pulsar却很抢眼,也很令人兴奋。所以最后,我设法花了一些时间了解背景信息并做了很多研究。在本文中,我将重点介绍Pulsar的优势,并解释为什么Pulsar优于Kafka。让我们开始吧!Kafka基础Kafka是消息系统之王。它由LinkedIn于2011年创建,并在Confluent的支持下得到广泛传播。Confluent向开源社区发布了许多新功能和附加组件,例如用于模式演变的SchemaRegistry、用于从其他数据源轻松流式传输的KafkaConnect等等。DatabasetoKafka,KafkaStreams用于分布式流处理,最近使用KSQL对Kafka主题执行类似SQL的查询,等等。Kafka速度快,易于安装,非常受欢迎,可用于广泛的用例。从开发人员的角度来看,虽然ApacheKafka一直很友好,但在操作上却一团糟。那么让我们回顾一下Kafka的一些痛点:KafkaDemo[2]Kakfa的许多痛点如下:由于代理和存储数据的耦合架构,扩展Kafka很棘手。剥离代理意味着它必须复制主题分区和副本,这很耗时。没有与租户完全隔离的本地多租户。存储可能会变得非常昂贵,虽然数据可以存储很长时间,但由于成本原因很少使用。如果副本不同步,则可能会丢失消息。broker、主题、分区和副本的数量必须提前计划和计算(确保计划的未来使用增长)以避免扩展问题,这是非常困难的。如果您只需要一个消息系统,那么使用偏移量可能会很复杂。集群重新平衡会影响连接的生产者和消费者的性能。MirrorMaker[3]Geo复制机制有问题。像优步这样的公司已经创建了自己的解决方案来克服这些问题。如您所见,大多数问题都与运营方面有关。尽管安装相对容易,但Kafka很难管理和调优。而且,它也缺乏应有的柔韧性和弹性。Pulsar基础Pulsar由Yahoo!创建。2013年,2016年捐赠给Apache基金会。Pulsar现在是Apache软件基金会的顶级项目。Yahoo!、Verizon、Twitter和其他公司在生产中使用它来处理数以千计的消息。具有运行成本低、灵活性强的特点。Pulsar旨在解决Kafka的大部分痛点,使其更易于扩展。Pulsar非常灵活:既可以应用于Kafka这样的分布式日志应用场景,也可以应用于RabbitMQ这样的纯消息系统场景。它支持多种类型的订阅、多种交付保证、保留策略和处理模式演变的方法,以及许多其他功能。Pulsar架构图[4]Pulsar的特点如下:内置多租户,不同的团队可以使用同一个集群并进行隔离,解决了很多管理问题。它支持隔离、认证、授权和配额。多层架构:Pulsar将所有主题数据存储在由ApacheBookKeeper支持的专用数据层中。存储和消息传递的分离解决了扩展、重新平衡和维护集群的许多问题。它还提高了可靠性,几乎不可能丢失数据。另外,读取数据时可以直接连接BookKeeper,不影响实时摄取。例如,您可以使用Presto对主题执行SQL查询,类似于KSQL,但不影响实时数据处理。虚拟主题:由于n层架构,主题数量没有限制,主题与存储分离。用户还可以创建非持久主题。N层存储:Kafka的一个问题是存储会变得昂贵。因此,它很少用于存储“冷”数据,消息经常被删除,ApachePulsar可以借助分层存储自动将旧数据卸载到AmazonS3或其他数据存储系统,并且仍然向客户端展示透明视图;Pulsar客户端可以开始不时地读取到节点,就好像所有消息都存在于日志中一样。PulsarFunction:易于部署,计算过程轻量级,对开发者友好的API,无需运行自己的流处理引擎(如Kafka)。安全性:它具有内置代理、多租户安全性、可插入身份验证等功能。快速重新平衡:分区被分成易于重新平衡的碎片。服务器端去重和无效字段:在客户端不需要做,也可以在压缩的时候去重。内置模式注册表(schemaregistry):支持多种策略,操作简单。异地复制和内置发现:轻松将集群复制到多个区域。集成负载均衡器和Prometheus指标。多种集成:Kafka、RabbitMQ等。支持多种编程语言,如GoLang、Java、Scala、Node、Python……分片和数据分区在服务端透明进行,客户端无需了解分片和分区数据。PulsarFeatureList[5]Pulsar入门Pulsar入门非常简单,使用它的前提是安装JDK。①下载Pulsar并解压(注:ApachePulsar最新版本为2.7.0):$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"AkkaStreamsExample举一个客户端的例子,我们是在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))Akkasourcematerialization该值是Control的一个实例,它提供了一个“关闭”方法,可以用来停止消费消息。现在我们可以像往常一样使用AkkaStreams处理数据了。要创建一个接口:valtopic=Topic("persistent://standalone/mytopic")valproducerFn=()=>client.producer(ProducerConfig(topic))importcom.sksamuel.pulsar4s.akka.streams._valpulsarSink=sink(producerFn)完整展示示例摘自Pulsar4s[6]:objectExample{importcom.sksamuel.pulsar4s.{ConsumerConfig,MessageId,ProducerConfig,PulsarClient,Subscription,Topic}importorg.apache.pulsar.client.api.Schemaimplicitvalsystem:ActorSystem=ActorSystem()implicitvalmaterializer:ActorMaterializer=ActorMaterializer()implicitvalschema:Schema[Array[Byte]]=Schema.BYTESvalclient=PulsarClient("pulsar://localhost:6650")valintopic=Topic("persistent://sample/standalone/ns1/in")valouttopic=Topic("persistent://sample/standalone/ns1/out")valconsumerFn=()=>client.consumer(ConsumerConfig(topics=Seq(intopic),subscriptionName=Subscription("mysub")))valproducerFn=()=>client.producer(ProducerConfig(outtopic))valcontrol=source(consumerFn,Some(MessageId.earliest)).map{consumerMessage=>ProducerMessage(consumerMessage.data)}.to(sink(producerFn)).run()Thread.sleep(10000)control.stop()}PulsarFunction示例PulsarFunction从一个或多个主题处理,将其转换并将结果输出到另一个主题:PulsarFunction[7]您可以选择两种接口来编写函数:语言原生接口:不需要特定的Pulsar库或特殊依赖项;不获取上下文,仅支持Java和PythonPulsarFunctionSDK:Java/Python/Go可用,提供更多功能,如访问上下文对象。只需编写一个简单的函数来使用该语言的本机接口转换消息:defprocess(input):return"{}!".format(input)这个用Python编写的简单函数只是为所有传入的字符串添加一个感叹号,并发布结果主题的字符串。使用SDK需要导入依赖。例如,在Go中,我们可以这样写:.Println(string(in)+"!")returnnil}funcmain(){pf.Start(HandleRequest)}如果你想发布一个无服务器函数并将其部署到一个集群,你可以使用Pulsar-AdminCL;如果使用Python,我们可以这样写:://public/default/basket-itemsPulsarFunction的重要特性是用户可以在发布函数时设置交付保证:$bin/pulsar-adminfunctionscreate\--namemy-effectively-once-function\--processing-guaranteesEFFECTIVELY_ONCE具有以下内容选择:Pulsar的优势与Kafka相比,让我们回顾一下Pulsar的主要优势:功能更多:PulsarFunction、多租户、Schemaregistry、n层存储、多种消费模式和持久化模式等更大的灵活性:3订阅类型(独占、共享和故障转移),用户可以在一个订阅上管理多个主题。持久性选项:非持久性(快速)、持久性、压缩(每条消息只有最后一个密钥),用户可以选择传递保证。Pulsar具有服务器端重复数据删除和无效词多保留策略和TTL。无需提前定义缩放要求。支持队列和流两种消息消费模型,因此Pulsar可以同时替代RabbitMQ和Kafka。存储与代理分离,因此它可以更好地扩展并且重新平衡更快、更可靠。易运维:架构解耦,n层存储。与Presto的SQL集成,直接查询存储,不影响broker。使用n层自动存储选项以更低的成本存储。更快:基准[8]在各种情况下显示出更好的性能。Pulsar具有更低的延迟和更好的扩展能力。PulsarFunction无需部署管理即可实现无服务器计算。集成模式注册表。集成负载均衡器和Prometheus指标。Geo-replication效果更好并且更容易设置。发现能力内置于Pulsar中。您可以创建的主题数量没有限制。与Kafka兼容,易于集成。Pulsar的弱点Pulsar并不完美,Pulsar也存在一些问题:相对缺乏支持、文档和示例。n层架构导致需要一个组件:BookKeeper。插件和客户端比Kafka少。云中的支持较少,Confluent提供托管云产品。不过,上述情况正在迅速改善,Pulsar正逐渐被越来越多的公司和组织所使用。ApachePulsar商业支持公司StreamNative也推出了StreamNativeCloud,ApachePulsar发展迅速,我们都可以看到激动人心的变化。Confluent曾在博客中比较过Pulsar和Kafka,但请注意这些问题可能存在偏见。Pulsar使用场景Pulsar可用于广泛的场景:发布/订阅队列消息传递。分布式日志。用于持久事件存储的事件溯源。微服务。SQL分析。无服务器功能。什么时候应该考虑Pulsar?既需要像RabbitMQ这样的队列,也需要像Kafka这样的流处理器。需要易于使用的异地复制。启用多租户并确保每个团队的访问权限。需要长时间保留消息并且不想将它们卸载到另一个商店。需要高性能,基准测试表明Pulsar提供了更低的延迟和更高的吞吐量。如果在云中,请谨慎考虑基于云的解决方案。云提供商提供涵盖特定场景的不同服务。比如队列消息,有很多云提供商提供的服务,比如Googlepub/sub;对于分布式日志,有Confluentcloud或AWSKinesis;而StreamNative也提供了基于Pulsar的云服务。云提供商还提供了非常好的安全性。Pulsar的优势在于它可以在一个平台上提供许多功能。一些团队可能将其用作微服务的消息系统,而另一些团队将其用作数据处理的分布式日志。结论我是Kafka的忠实粉丝,我对Pulsar如此感兴趣是有原因的:竞争推动创新。Kafka是一种成熟、有弹性、久经考验的产品,在全球范围内取得了巨大成功,无法想象大多数公司没有它会怎样。但我确实看到Kafka成为其自身成功的牺牲品,由于需要支持许多大公司,巨大的增长减缓了功能开发,删除ZooKeeper依赖等重要功能花费的时间太长,这使得Pulsar和其他工具蓬勃发展创造空间。Pulsar很年轻,但势头强劲,需要分析、基准测试、研究和POC,然后才能将Pulsar纳入组织。从小处着手,在将Kafka迁移到Pulsar之前进行概念验证,并在决定进行全面迁移之前评估影响。参考链接:【1】《Pulsar Advantages Over Kafka》:https://itnext.io/pulsar-advantages-over-kafka-7e0c2affe2d6【2】Kafkademo:https://talks.rmoff.net/pZC6Za/slides【3】MirrorMaker:https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27846330[4]Pulsar架构图:https://pulsar.apache.org/docs/en/concepts-architecture-overview/[5]Pulsar功能列表:https://pulsar.apache.org/[6]Pulsar4s:https://github.com/sksamuel/pulsar4s/blob/master/pulsar4s-akka-streams/src/test/scala/com/sksamuel/pulsar4s/akka/streams/Example.scala[7]Pulsar函数:https://pulsar.apache.org/docs/en/functions-overview/[8]基准测试:https://medium.com/swlh/performance-comparison-between-apache-pulsar-and-kafka-latency-79fb0367f407作者:文述其武编辑:陶佳龙来源:转载自JavaAdvancedArchitecture,中文原文由文述其武翻译自Lewis的一篇文章Fairweather《Pulsar Advantages Over Kafka》[1],文章转载时有改动。