我正在评估 Google Pub/Sub 和 Kafka,它们有什么不同?

我没有在卡夫卡工作了很多,但想建立在 GCE 的数据管道。所以我们想知道卡夫卡 VS PUB/Sub。基本上,我想知道如何在卡夫卡和 Pub/sub 中维护消息一致性、消息可用性和消息可靠性

谢谢

89638 次浏览

卡夫卡和 Cloud Pub/Sub 的一个最大区别是 Cloud Pub/Sub 是完全为您管理的。您不必担心机器、设置集群、微调参数等等,这意味着许多 DevOps 工作都是为您处理的,这一点非常重要,特别是当您需要扩展时。

除了 Google Pub/Sub 是由 Google 管理的,而 Kafka 是开源的,Google Pub/Sub 的另一个不同之处在于,它是一个消息队列(例如 Rabbit MQ) ,而 Kafka 更像是一个流媒体日志。你不能用 Pubsub“重读”或“重播”消息。(编辑-截至2019年2月,您可以重播消息,并寻找回到某一时间戳的时间,每评论如下)

使用 Google Pub/Sub,一旦从订阅中读出消息并进行 ACK,它就消失了。为了有更多的信息副本供不同的读者阅读,你可以通过为该主题创建“订阅”来“分散”该主题,每个订阅都将有一个该主题的所有内容的完整副本。但这也增加了成本,因为谷歌根据读取的数据量对 Pub/Sub 的使用量收取费用。

对于卡夫卡,你设置了一个保留期(我认为默认是7天) ,无论有多少消费者阅读,信息都会保留在卡夫卡中。您可以添加一个新的使用者(也就是订阅者) ,并让它随时从主题的前端开始使用。您还可以将保持期设置为无限,然后基本上可以使用卡夫卡作为一个不可变的数据存储,如下所述: http://stackoverflow.com/a/22597637/304262

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

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

完全管理系统 两个系统都可以在云中拥有完全管理的版本。谷歌提供了 Pubsub,市面上有一些完全管理的卡夫卡版本,你可以在 “云”和“主持人”上进行配置。

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

信息复制 - With Kafka you will need to manage the offsets of the messages by yourself, using an external storage, such as, Apache Zookeeper. In that way you can track the messages read so far by the Consumers. Pubsub works using acknowledging the message, if your code doesn't acknowledge the message before the deadline, the message is sent again, that way you can avoid duplicated messages or another way to avoid is using Cloud Dataflow PubsubIO.

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

消费者群体 vs 订阅 小心阅读两个系统中的消息。发布服务器使用订阅,则创建订阅,然后开始从该订阅读取消息。一旦读取并确认消息,该订阅的消息就消失了。卡夫卡使用了“消费者组”和“分区”的概念,每个消费者进程都属于一个组,当从一个特定的分区读取消息时,属于同一个“消费者组”的任何其他消费者进程都不能读取该消息(这是因为偏移量最终会增加)。您可以将偏移量看作一个指针,它告诉进程必须读取哪些消息。

我认为你的问题没有一个正确的答案,这将取决于你需要什么和你有什么限制(下面是一些场景的例子) :

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

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

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

一般来说,两者都是非常可靠的 Stream 处理系统。最大的区别在于 Pubsub 是一个附属于 GCP 的云服务,而 Apache Kafka 可以在 Cloud 和 On-prem 中使用。

更新(2021年4月6日) :