Apache Kafka 中的术语

Terms in Apache Kafka

我阅读了 Apache Kafka documentation 和其他几篇文章,开始了解 Kafka 是什么以及如何在我的应用程序中使用它。但是,此时我非常困惑。

我无法理解分区和代理之间的区别。

Kafka 提供了可靠性的复制因子。那些复制的数据 出现在同一台机器上?

{高级,低级} + {生产者,消费者}之间的差异

如果 Kafka 不存储消费者位置,最好的存储方法是什么?人们使用数据库还是将其存储为客户端的本地信息。

使用 Kafka 和 NodeJS 构建发布-订阅系统(为数据提供休息 API)是个好主意吗?

谁能指导我这个方向?如果您希望我添加任何其他有助于更好地提供解决方案的相关信息,请发表评论。

提前致谢。

这是温习我的 Kafka 知识的好机会,如果时间有点长,我很抱歉。

这里的大多数答案都来自您链接的文档,或者通过谷歌搜索相关文档。

既然你表示想与 Node.js、I will include some references to the arguably best (to my knowledge) Kafka 0.9.0 client no-kafka 一起工作,那么也在最后一节中讨论它。

问题一

I am unable to understand the difference between partition and brokers

问题二

Kafka provides a replication factor for reliability. Are those replicated data present on the same machine?

如果你的意思是在同一台机器上复制,那么不,这充其量是可疑的,因为它无法承受简单的服务器崩溃。复制因子决定了主题的每个分区将被复制到多少个代理(服务器)上。所以 --replication-factor 3 意味着每个分区在 3 个代理上,其中一个作为领导者(接受 reads/writes),其余两个复制领导者,准备在当前领导者失败时自动接受领导者状态.创建主题时,复制因子必须小于集群上的代理数。

来自介绍:

For a topic with replication factor N, we will tolerate up to N-1 server failures without losing any messages committed to the log.

您可以通过 运行 多个代理在一台机器上获得许多副本(无论出于何种原因,可能在不同的磁盘或其他东西上)。

问题3

Difference between a {High level, Low level} + {Producer, Consumer}

实际上只有一个生产者API(存在一个遗留的 Scala 客户端)。共有三个 Consumer API。旧的高低级别APIs和新的统一API。如果你是 运行 Kafka 0.9.0 或更新版本(如果你刚开始,你可能会是),你很可能想要使用新的统一 API。它包括旧 Consumer APIs 不可用的新功能(例如 0.9.0 中引入的安全功能),并且不需要旧的(除非您选择的库不支持新的 API,这很可能意味着你应该切换)。

no-kafka supports a SimpleConsumer API, which iirc models the old low level API. It can be good for simple testing, but I strongly recommend the GroupConsumer API, which uses the new unified API。它的优势之一(提交抵消)将在下一个问题中讨论。

问题4

If Kafka doesn't store the consumer position, what are the best methods of storing it? Do people use databases or they may store it as local information to the client.

您真的可以随心所欲地存储它们(在磁盘上等)。新的统一消费者 API 会自动保存消费者的偏移量(发送的消息)。您的消费者还应在成功处理消息后提交其最新处理的偏移量 (consumer.commitOffset in no-kafka GroupConsumer),因此如果您在重启或其他任何方式后重新连接消费者,您将获得您自己标记为未成功消费的最新消息。

这也是使用新的统一消费者 API 的众多重要原因之一。

偏移量存储在高度可用(复制)的分区主题中,并由 Kafka 缓存。 You can also configure the options for offset saving (search for options with offset. or offsets. behind this link.

一个用于向 ZooKeeper 提交消费者偏移量,这是 Kafka 依赖于分布式服务(例如配置)的服务,但 ZooKeeper 不能很好地扩展许多写入并且已从 Kafka 中抽象出来 API.这也是 SimpleConsumer in no-kafka 保存其偏移量的方式。

问题5

Is is a good idea to build a pub-sub system with Kafka and Node.js (to provide rest API for the data)?

这样做没有错。我自己最近用 Node.js + Kafka 做了一些演示,并且非常喜欢它。如上所述,我建议 no-kafka library for Kafka >0.9, but the older (for >0.8) kafka-node 也能正常工作,因为 0.9 是向后兼容的。即使没有别的原因,我也会选择no-kafka,因为它支持统一的Consumer API.

除了使用 Node.js 制作面向客户端的界面外,您还可以使用它轻松完成光流处理(例如丰富和重新格式化收集的事件)。例如,也许将 Kafka 日志格式化为数据库。

繁重的流处理可能无法用 Node.js 最好地完成,因为实现资源管理、容错等将是一项艰巨的任务,并且有很好的流处理框架(Samza、Spark 等)对于这样的任务。是的,它们使用不同的语言,但您可能会找到适合您的框架。如果您熟悉开发和部署高性能、优化的 Node 应用程序,您甚至可以使用 Node.js 原型化繁重的任务。