我正在评估Google PUB/SUB vs Kafka?

Nar*_*esh 52 apache-kafka google-cloud-pubsub

我没有在kafka上工作过多,但想在GCE中构建数据管道.所以我们想知道Kafka vs PUB/Sub.基本上我想知道如何在Kafka和Pub/sub中维护消息一致性,消息可用性,消息可靠性

谢谢

gun*_*nit 66

除了由Google管理的Google Pub/Sub和Kafka是开源之外,另一个区别是Google Pub/Sub是一个消息队列(例如Rabbit MQ),而Kafka更像是一个流日志.您无法使用Pubsub"重新读取"​​或"重播"消息.(编辑 - 截至2019年2月,您可以重播消息并及时向后查找某个时间戳,每条评论如下)

使用Google Pub/Sub,一旦从订阅中读出消息并确认消息,它就消失了.为了让不同的读者能够阅读更多的消息副本,您可以通过为该主题创建"订阅"来"扇出"该主题,其中每个订阅将包含进入该主题的所有内容的完整副本.但这也增加了成本,因为Google根据从中读取的数据量来收取Pub/Sub使用费.

使用Kafka,您可以设置保留期(我认为默认情况下为7天),无论有多少消费者阅读,都会留在Kafka中.您可以添加新的消费者(也称为订阅者),并随时从主题的前面开始消费.您还可以将保留期设置为无限期,然后您基本上可以将Kafka用作不可变数据存储区,如下所述:http://stackoverflow.com/a/22597637/304262

亚马逊AWS Kinesis是Kafka的托管版本,而我认为Google Pubsub是Rabbit MQ的托管版本.带有SQS的Amazon SNS也类似于Google Pubsub(SNS提供了扇出和SQS提供的排队).

  • 使用诸如PubSub之类的消息队列系统完成“重播”的方法是将主题散布到更多订阅(即制作更多消息副本),并且每个消费者以自己的节奏消费自己的订阅。我想您可以拥有只在需要时重播的订阅。要对Kafka做同样的事情,您将创建一个新的使用者并从头开始使用(因为Kafka不会复制消息,它只是为每个使用者提供了自己的“指针”偏移量以跟踪发生了什么已经阅读) (4认同)
  • Cloud Pub/Sub最近添加了对重播以前确认的消息的支持.[快速入门指南](https://cloud.google.com/pubsub/docs/replay-qs)和[博文](https://cloud.google.com/blog/products/data-analytics/reliable- streaming-pipeline-development-with-cloud-pubsub-replay)解释了如何使用该功能. (4认同)
  • 重放是大多数面向事件的体系结构中的关键特性.此外,Kafka在消息中添加了序列号,因此成为序列的权威来源. (3认同)
  • Kinesis可以被认为是一种在语义上类似于Kafka的托管服务,但是说它是"Kafka的托管版本"是不准确的.对于实际的"托管Kafka",请参阅Confluent Cloud https://www.confluent.io/confluent-cloud/ (2认同)
  • 假设你有一个听众。它在收到消息后醒来,做一些工作,然后崩溃。它正在处理的事件发生了什么?通过重播+序列号,您始终可以存储最后已知的良好状态+序列号,并从上次停下的地方继续。 (2认同)

dbu*_*osp 24

我一直在阅读上面的答案,我想补充它们,因为我认为还有一些细节待定:

完全托管的系统两个系统都可以在云中拥有完全托管的版本。Google 提供了 Pubsub 并且有一些完全托管的 Kafka 版本,您可以在云端和本地配置。

Cloud vs On-prem我认为这是它们之间真正的区别,因为 Pubsub 仅作为 GCP 生态系统的一部分提供,而 Apache Kafka 您可以用作云服务和本地服务(自己进行集群配置)

消息复制 - 使用 Kafka,您需要自己管理消息的偏移量,使用外部存储,例如 Apache Zookeeper。通过这种方式,您可以跟踪到目前为止消费者读取的消息。Pubsub 使用确认消息来工作,如果您的代码在截止日期之前没有确认消息,则会再次发送消息,这样您就可以避免重复消息,或者另一种避免的方法是使用 Cloud Dataflow PubsubIO。

保留策略Kafka 和 Pubsub 都有配置最长保留时间的选项,默认情况下,我认为是 7 天。

消费者组 vs 订阅请注意在两个系统中阅读消息的方式。Pubsub 使用订阅,您创建一个订阅,然后您开始阅读来自该订阅的消息。一旦消息被读取并确认,该订阅的消息就消失了。Kafka使用“消费者组”和“分区”的概念,每个消费者进程都属于一个组,当从特定分区读取消息时,属于同一个“消费者组”的任何其他消费者进程将无法读取该消息(这是因为偏移量最终会增加)。您可以将偏移量视为一个指针,它告诉进程必须读取哪些消息。

我认为您的问题没有正确答案,这实际上取决于您的需求和限制(以下是一些场景示例):

  • 如果解决方案必须在 GCP 中,显然使用 Google Cloud Pubsub。您将避免所有设置工作或为 Kafka 所需的全自动系统支付额外费用。

  • 如果解决方案需要以 Streaming 方式处理数据,但还需要支持 Batch 处理(最终),那么使用 Cloud Dataflow + Pubsub 是个好主意。

  • 如果解决方案需要使用一些 Spark 处理,您可以探索 Spark Streaming(您可以为流处理配置 Kafka)

一般来说,两者都是非常可靠的流处理系统。产生巨大差异的一点是 Pubsub 是附加到 GCP 的云服务,而 Apache Kafka 可以在云和本地使用。

更新(2021 年 4 月 6 日)

  • 我认为这可能会产生误导;除非您想在 Kafka 有线协议上编写自己的库,否则现有客户端已经提供了可配置的机制来处理提交偏移量。此外,提交的偏移量不会保存在 Zookeeper 中,而是保存在一个特殊主题“__consumer_offsets”中,该主题在代理之间复制。这是一本很好的书:https://www.confluence.io/blog/apache-kafka-data-access-semantics-consumers-and-membership/ (5认同)
  • 事实上,我真的不明白你关于手动存储偏移量的说法:“使用 Kafka,你需要使用外部存储来自己管理消息的偏移量,例如 Apache Zookeeper”=> Downvoting (2认同)

Met*_*mel 6

Kafka与Cloud Pub/Sub之间的一个重要区别是Cloud Pub/Sub完全由您管理.您不必担心机器,设置群集,微调参数等等,这意味着您需要处理大量DevOps工作,这一点很重要,尤其是当您需要扩展时.

  • @JerylCook我认为他只是意味着你无法安装google的pub/sub (8认同)
  • 这并不是真正的区别,因为有多家供应商也将Kafka作为完全托管服务提供.不同之处可能是Google PubSub仅作为Googles Cloud中的服务提供,因此没有内部版本,也没有在AWS或Azure等其他云提供商中运行托管服务. (6认同)
  • “Google PubSub 仅作为 Googles Cloud 中的一项服务可用”这是不正确的...您的应用程序与部署在 Google App Engine 中无关...您可以从任何客户端连接并发布到 GooglePub/Sub”,只要您通过“服务帐户”安全地连接到它。 (2认同)