我正在评估Google Pub / Sub与Kafka?[关闭]


79

我没有做过很多关于kafka的工作,但是想在GCE中建立数据管道。所以我们想知道Kafka vs PUB / Sub。基本上我想知道在Kafka和Pub / sub中如何保持消息一致性,消息可用性,消息可靠性

谢谢


Answers:


89

除了由Google管理的Google Pub / Sub和开放源代码的Kafka之外,另一个区别是Google Pub / Sub是消息队列(例如Rabbit MQ),其中Kafka更像是流日志。您不能使用Pubsub来“重读”或“重播”消息。(编辑-从2019年2月开始,您可以按以下评论重播消息并向后追溯到特定时间戳)

使用Google Pub / Sub,从订阅中读取一条消息并进行确认后,该消息就消失了。为了使消息的更多副本可供不同的读者阅读,您可以通过为该主题创建“订阅”来“散开”该主题,其中每个订阅都将包含该主题中所有内容的完整副本。但这也会增加成本,因为Google会根据从其中读取的数据量来收取发布/订阅使用费。

使用Kafka,您可以设置保留期限(我认为默认为7天),无论有多少消费者阅读它,邮件都会保留在Kafka中。您可以添加一个新的使用者(又名订户),并在需要时从主题的开头开始使用。您还可以将保留期限设置为无限,然后基本上可以将Kafka用作不可变的数据存储,如此处所述:http : //stackoverflow.com/a/22597637/304262

Amazon AWS Kinesis是Kafka的托管版本,而我认为Google Pubsub是Rabbit MQ的托管版本。具有SQS的Amazon SNS也类似于Google Pubsub(SNS提供扇出,SQS提供排队)。


4
在大多数面向事件的体系结构中,重播是一项关键功能。此外,Kafka将序列号添加到消息中,因此成为序列的权威来源。
Buzz Moschetti

4
使用诸如PubSub之类的消息队列系统完成“重播”的方法是将主题散布到更多订阅(即制作更多消息副本),并且每个消费者以自己的节奏消费自己的订阅。我想您可以拥有一个仅在需要时重播的订阅。要对Kafka做同样的事情,您将创建一个新的使用者并从头开始使用(因为Kafka不会复制消息,它只是为每个使用者提供了自己的“指针”偏移量以跟踪发生了什么已经阅读)
gunit

2
Kinesis可以看作是一种与Kafka在语义上相似的托管服务,但不能准确地说它是“ Kafka的托管版本”。有关实际的“托管Kafka”,请参阅Confluent Cloud confluent.io/confluent-cloud
Emmett Butler,

6
Cloud Pub / Sub最近添加了对重放先前确认的消息的支持。该快速入门指南博客文章解释了如何使用该功能。
卡马尔·阿布乌尔·霍斯

1
@EmmettButler是正确的;Kinesis是其自己的产品。即使由Kafka提供支持,它也引入了完全不同的API。亚马逊确实提供了带有AWS MSK的托管Kafka 。
user0000001

13

我一直在阅读以上答案,并希望对它们进行补充,因为我认为有一些细节有待解决:

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

云计算与本地部署之间,我认为这是真正的区别,因为Pubsub仅作为GCP生态系统的一部分提供,而Apache Kafka可以同时用作云服务和本地部署服务(由您自己进行集群配置)

消息复制 -使用Kafka,您将需要使用外部存储(例如Apache Zookeeper)自己管理消息的偏移量。这样,您可以跟踪消费者迄今阅读的消息。Pubsub通过使用确认消息来工作,如果您的代码在截止日期之前未确认消息,则会再次发送消息,这样您就可以避免重复消息,或者避免使用Cloud Dataflow PubsubIO。

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

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

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

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

  • 如果该解决方案既需要流方式处理流程数据,又需要支持批处理(最终),则最好使用Cloud Dataflow + Pubsub。

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

通常,两者都是非常可靠的流处理系统。产生巨大差异的是,Pubsub是附加到GCP的云服务,而Apache Kafka可以在Cloud和On-prem中使用。


1
我认为这可能会产生误导;除非您想使用Kafka有线协议编写自己的库,否则现有客户端已经提供了可配置的机制来处理偏移量。提交的抵消也不会保留在Zookeeper中,而是保留在特殊主题“ __consumer_offsets”中,该主题在代理之间复制。这是一个很好的阅读:confluent.io/blog/...
佐尔坦

12

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


7
并没有太大的区别,因为也有多家供应商也将Kafka提供为完全托管的服务。也许不同之处在于,Google PubSub仅可作为Googles Cloud中的服务使用,因此没有正式版本,也没有在其他云提供商(如AWS或Azure)中运行托管服务。
Hans Jespersen

2
“ Google PubSub仅可作为Googles Cloud中的一项服务使用”,这是不正确的...您的应用程序不依赖于在Google App Engine中部署。通过“服务帐户”安全地连接到它。
杰里尔·库克

11
@JerylCook我认为他只是意味着您不能在prem上安装google的pub / sub
Sinaesthetic,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.