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

时间:2016-07-25 15:40:14

标签: apache-kafka google-cloud-pubsub

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

由于

3 个答案:

答案 0 :(得分:54)

除了由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

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

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

完全托管的系统:两个系统都可以在云中具有完全托管的版本。 Google提供了Pubsub,您可以在cloud and On-prem上配置一些完全托管的Kafka版本。

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

邮件重复     -使用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中使用。