我没有做过很多关于kafka的工作,但是想在GCE中建立数据管道。所以我们想知道Kafka vs PUB / Sub。基本上我想知道在Kafka和Pub / sub中如何保持消息一致性,消息可用性,消息可靠性
谢谢
Answers:
除了由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提供排队)。
我一直在阅读以上答案,并希望对它们进行补充,因为我认为有一些细节有待解决:
完全托管的系统这两个系统都可以在云中具有完全托管的版本。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中使用。
Kafka与Cloud Pub / Sub之间的一大区别是Cloud Pub / Sub完全由您管理。您不必担心机器,设置集群,微调参数等,这意味着可以为您处理很多DevOps工作,这很重要,尤其是在需要扩展时。