作者:闻数起舞 2021-02-01 07:20:51
开发
架构
开发工具
Kafka 最近,我一直在研究 Pulsar 及其与 Kafka 的比较。通过快速搜索,你会看到这两个最著名的开源消息传递系统之间正在进行的"战争"。
最近,我一直在研究 Pulsar 及其与 Kafka 的比较。通过快速搜索,你会看到这两个最著名的开源消息传递系统之间正在进行的"战争"。
图片来自 Pexels
作为 Kafka 的用户,我着实对 Kafka 的某些问题感到困惑,但 Pulsar 却让人眼前一亮、令我非常兴奋。所以最后,我设法花了一些时间了解背景资料,并且做了很多研究。
在本文中,我将重点介绍 Pulsar 的优势,并说明 Pulsar 胜于 Kafka 的理由。让我们开始!
Kafka 基础知识
Kafka 是消息传递系统之王。它由 LinkedIn 于 2011 年创建,并在 Confluent 的支持下得到了广泛的传播。
Confluent 已向开源社区发布了许多新功能和附加组件,例如用于模式演化的 Schema Registry,用于从其他数据源轻松流式传输的 Kafka Connect 等。
数据库到 Kafka,Kafka Streams 进行分布式流处理,最近使用 KSQL 对 Kafka topic 执行类似 SQL 的查询等等。
Kafka 快速,易于安装,非常受欢迎,可用于广泛的范围或用例。从开发人员的角度来看,尽管 Apache Kafka 一直很友好,但在操作运维方面却是一团糟。
因此,让我们回顾一下 Kafka 的一些痛点:
Kafka 演示[2]
Kakfa的诸多痛点如下:
如您所见,大多数问题与操作运维方面有关。尽管安装起来相对容易,但 Kafka 难以管理和调优。而且,它也缺乏应有的灵活和弹性。
Pulsar 基础知识
Pulsar 由 Yahoo!在 2013 年创建,并于 2016 年捐赠给 Apache 基金会。Pulsar 现在是 Apache 软件基金会的顶级项目。
Yahoo!、Verizon、Twitter 等公司已在生产中使用它来处理成千上万消息。它具有运行成本低、灵活等特性。Pulsar 旨在解决 Kafka 的大部分难题,使其更易于扩展。
Pulsar 非常灵活:它既可以应用于像 Kafka 这样的分布式日志应用场景,也可以应用于像 RabbitMQ 这样的纯消息传递系统场景。
它支持多种类型的订阅、多种交付保证、保留策略以及处理模式演变的方法,以及其他诸多特性。
Pulsar 架构图[4]
Pulsar 的特性如下:
存储和消息传递的分离解决了扩展、重新平衡和维护集群的许多问题。它还提高了可靠性,几乎不可能丢失数据。
Pulsar 特性列表[5]
Pulsar 入门
Pulsar 入门非常容易,使用前提是安装 JDK。
①下载 Pulsar 并解压缩(备注:目前 Apache Pulsar 最新版本为 2.7.0):
- $ wget https://archive.apache.org/dist/pulsar/pulsar-2.6.1/apache-pulsar-2.6.1-bin.tar.gz
②下载连接器(可选):
- $ wget https://archive.apache.org/dist/pulsar/pulsar-2.6.1/connectors/{connector}-2.6.1.nar
③下载 nar 文件后,将文件复制到 Pulsar 目录中的 Connectors 目录。
④启动 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[6]:
- object Example {
- import com.sksamuel.pulsar4s.{ConsumerConfig, MessageId, ProducerConfig, PulsarClient, Subscription, Topic}
- import org.apache.pulsar.client.api.Schema
- implicit val system: ActorSystem = ActorSystem()
- implicit val materializer: ActorMaterializer = ActorMaterializer()
- implicit val schema: Schema[Array[Byte]]= Schema.BYTES
- val client = PulsarClient("pulsar://localhost:6650")
- val intopic = Topic("persistent://sample/standalone/ns1/in")
- val outtopic = Topic("persistent://sample/standalone/ns1/out")
- val consumerFn = () => client.consumer(ConsumerConfig(topics = Seq(intopic), subscriptionName = Subscription("mysub")))
- val producerFn = () => client.producer(ProducerConfig(outtopic))
- val control = source(consumerFn, Some(MessageId.earliest))
- .map { consumerMessage => ProducerMessage(consumerMessage.data) }
- .to(sink(producerFn)).run()
- Thread.sleep(10000)
- control.stop()
- }
Pulsar Function 示例
Pulsar Function 处理来自一个或多个 topic 的消息,对其进行转换并将结果输出到另一个 topic:
Pulsar Function[7]
可以在两个接口之间进行选择以编写函数:
只需编写一个简单的函数即可使用语言原生接口转换消息:
- def process(input):
- return "{}!".format(input)
用 Python 编写的这个简单函数只是向所有传入的字符串添加一个感叹号,并将结果字符串发布到 topic。
使用 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 CL;如果使用 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 Function 的一个重要功能是用户可以在发布该函数时设置交付保证:
- $ bin/pulsar-admin functions create \
- --name my-effectively-once-function \
- --processing-guarantees EFFECTIVELY_ONCE
有以下选择:
Pulsar 的优势
与 Kafka 相比,让我们回顾下 Pulsar 的主要优势:
Pulsar 的劣势
Pulsar 并不完美,Pulsar 也存在一些问题:
不过,上面的情况都在得到快速改善,目前 Pulsar 也逐渐被越来越多的公司和组织使用。
Apache Pulsar 商业支持公司 StreamNative 也推出了 StreamNative Cloud,Apache Pulsar 正在快速成长,我们都可以看到令人欣喜的变化。
Confluent 曾发布博客对比 Pulsar 和 Kafka ,但请注意,这些问题可能有偏见。
Pulsar 使用场景
Pulsar 可用于广泛的场景:
什么时候应该考虑 Pulsar?
如果在云端,请注意考虑基于云的解决方案。云提供商拥有涵盖某些场景的不同服务。
例如,对于队列消息,云提供商提供了许多服务,比如 Google pub / sub;对于分布式日志,有 Confluent 云或 AWS Kinesis;StreamNative 也提供了基于 Pulsar 的云端服务。
云提供商还提供了非常好的安全性。Pulsar 的优势在于可以在一个平台上提供许多功能。
一些团队可能将其用作微服务的消息传递系统,而另一些团队则将其用作数据处理的分布式日志。
结论
我是 Kafka 的忠实粉丝,我对 Pulsar 如此感兴趣的原因是:竞争驱动创新。
Kafka 是一种成熟,富有弹性且经过考验的产品,在世界范围内获得了巨大成功,无法想象大多数公司没有它会怎样。
但是我确实看到 Kafka 成为其自身成功的受害者,由于需要支持许多大型公司导致巨大的增长减慢了功能开发的速度、移除 ZooKeeper 依赖项等重要功能花费的时间太长,这为诸如 Pulsar 等工具蓬勃发展创造了空间。
Pulsar 虽然年轻却势头很猛,在将 Pulsar 纳入组织之前,需进行分析、基准测试、研究并进行 POC。
从小处着手,在将 Kafka 迁移到 Pulsar 之前进行概念验证,并在决定进行完全迁移之前评估影响。
引用链接:
https://itnext.io/pulsar-advantages-over-kafka-7e0c2affe2d6
https://talks.rmoff.net/pZC6Za/slides
https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27846330
https://pulsar.apache.org/docs/en/concepts-architecture-overview/
https://pulsar.apache.org/
https://github.com/sksamuel/pulsar4s/blob/master/pulsar4s-akka-streams/src/test/scala/com/sksamuel/pulsar4s/akka/streams/Example.scala
https://pulsar.apache.org/docs/en/functions-overview/
https://medium.com/swlh/performance-comparison-between-apache-pulsar-and-kafka-latency-79fb0367f407
作者:闻数起舞
编辑:陶家龙
出处:转载自 Java 高级架构,原中文版本由闻数起舞翻译自 Lewis Fairweather 的文章《Pulsar Advantages Over Kafka》[1],文章转载时有改动。
网页名称:我为什么放弃Kafka,选择Pulsar?
本文链接:http://www.mswzjz.cn/qtweb/news27/314027.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能