文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

我为什么放弃Kafka,选择Pulsar?

2024-12-03 12:17

关注

[[379649]] 

图片来自 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):

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

②下载连接器(可选):

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

③下载 nar 文件后,将文件复制到 Pulsar 目录中的 Connectors 目录。

④启动 Pulsar!

  1. $ bin/pulsar standalone 

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

生产消息:

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

消费消息:

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

Akka 流示例

举一个客户端示例,我们在 Akka 上使用 Pulsar4s。

首先,我们需要创建一个 Source 来消费数据流,所需要的只是一个函数,该函数将按需创建消费者并查找消息 ID:

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

然后,我们传递 ConsumerFn 函数来创建源:

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

Akka 源的物化值是 Control 的一个实例,该对象提供了一种"关闭"方法,可用于停止消费消息。现在,我们可以像往常一样使用 Akka Streams 处理数据。

要创建一个接收器:

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

完整示例摘自 Pulsar4s[6]:

  1. object Example { 
  2.   import com.sksamuel.pulsar4s.{ConsumerConfig, MessageId, ProducerConfig, PulsarClient, Subscription, Topic} 
  3.   import org.apache.pulsar.client.api.Schema 
  4.   implicit val system: ActorSystem = ActorSystem() 
  5.   implicit val materializer: ActorMaterializer = ActorMaterializer() 
  6.   implicit val schemaSchema[Array[Byte]] = Schema.BYTES 
  7.   val client = PulsarClient("pulsar://localhost:6650"
  8.   val intopic = Topic("persistent://sample/standalone/ns1/in"
  9.   val outtopic = Topic("persistent://sample/standalone/ns1/out"
  10.   val consumerFn = () => client.consumer(ConsumerConfig(topics = Seq(intopic), subscriptionName = Subscription("mysub"))) 
  11.   val producerFn = () => client.producer(ProducerConfig(outtopic)) 
  12.   val control = source(consumerFn, Some(MessageId.earliest)) 
  13.     .map { consumerMessage => ProducerMessage(consumerMessage.data) } 
  14.     .to(sink(producerFn)).run() 
  15.   Thread.sleep(10000) 
  16.   control.stop() 

Pulsar Function 示例

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

 

Pulsar Function[7]

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

只需编写一个简单的函数即可使用语言原生接口转换消息:

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

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

使用 SDK 需要导入依赖项,例如在 Go 中,我们可以编写:

  1. package main 
  2. import ( 
  3. "context" 
  4. "fmt" 
  5. "github.com/apache/pulsar/pulsar-function-go/pf" 
  6. func HandleRequest(ctx context.Context, in []byte) error { 
  7. fmt.Println(string(in) + "!"
  8. return nil 
  9. func main() { 
  10. pf.Start(HandleRequest) 

如果要发布无服务器功能并将其部署到集群,可以使用 Pulsar-Admin CL;如果使用 Python,我们可以编写:

  1. $ bin/pulsar-admin functions create \ 
  2. --py ~/router.py \ 
  3. --classname router.RoutingFunction \ 
  4. --tenant public \ 
  5. --namespace default \ 
  6. --name route-fruit-veg \ 
  7. --inputs persistent://public/default/basket-items 
  8. Pulsar Function 的一个重要功能是用户可以在发布该函数时设置交付保证: 
  9. $ bin/pulsar-admin functions create \ 
  10. --name my-effectively-once-function \ 
  11. --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],文章转载时有改动。

 

来源:Java 高级架构内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯