Node.js 阿帕奇·卡夫卡的术语

Node.js 阿帕奇·卡夫卡的术语,node.js,apache-kafka,kafka-producer-api,Node.js,Apache Kafka,Kafka Producer Api,我阅读了《卡夫卡》和其他几篇文章,开始了解卡夫卡是什么,以及如何在我的应用程序中使用它。然而,在这一点上,我非常困惑 我无法理解分区和代理之间的区别 卡夫卡为可靠性提供了复制因素。这些是复制的数据吗 是否在同一台机器上显示 {高级,低级}+{生产者,消费者}之间的差异 如果卡夫卡不存储消费者位置,那么最好的存储方法是什么?人们是否使用数据库,或者他们可能将其作为本地信息存储到客户端 使用Kafka和NodeJS(为数据提供restapi)构建发布子系统是一个好主意吗 有人能给我指点方向吗?如果您

我阅读了《卡夫卡》和其他几篇文章,开始了解卡夫卡是什么,以及如何在我的应用程序中使用它。然而,在这一点上,我非常困惑

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

卡夫卡为可靠性提供了复制因素。这些是复制的数据吗 是否在同一台机器上显示

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

如果卡夫卡不存储消费者位置,那么最好的存储方法是什么?人们是否使用数据库,或者他们可能将其作为本地信息存储到客户端

使用Kafka和NodeJS(为数据提供restapi)构建发布子系统是一个好主意吗

有人能给我指点方向吗?如果您希望我添加有助于更好地提供解决方案的任何其他相关信息,请发表意见


提前谢谢。

这是一个复习卡夫卡知识的好机会,如果时间有点长,我很抱歉

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

因为您表示希望使用Node.js,并在最后一节中讨论它

问题1

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

  • 经纪人:

    代理是运行kafka实例的服务器,如引言所述:

  • 分区:

    向主题发布和使用消息。可以对主题进行分区,并且,如果您运行的集群具有>1个代理,则分区将分布在代理(kafka服务器)上

    这使您能够平衡高吞吐量主题的负载。您可以根据需要使用一个、多个或所有分区。哪个消息传递到哪个分区取决于您选择的分区策略(例如,散列键、在发布时设置分区等)

问题2

卡夫卡为可靠性提供了复制因素。这些复制数据是否存在于同一台计算机上

如果你的意思是在同一台机器上复制,那么不,这充其量是值得怀疑的,因为它无法承受简单的服务器崩溃。复制因子确定主题的每个分区将在多少个代理(服务器)上复制。因此——复制因子3意味着每个分区位于3个代理上,其中一个作为先导(接受读/写),其余两个复制先导,准备在当前先导失败时自动接受先导状态。创建主题时,复制因子必须小于集群上的代理数

导言:

通过在一台机器上运行多个代理(可能是在不同的磁盘上或出于任何原因),可以在一台机器上获得多个副本

问题3

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

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

支持,iirc对旧的低级API进行建模。对于简单的测试来说,它是很好的,但是我强烈推荐。它的优点之一(提交补偿)将在下一个问题中讨论

问题4

如果卡夫卡不存储消费者位置,那么最好的存储方法是什么?人们是否使用数据库,或者他们可能将其作为本地信息存储到客户端

你真的可以随心所欲地存储它们(在磁盘上等)。新的统一消费者API自动保存消费者的偏移量(已发送的消息)。您的使用者还应在成功处理消息()后提交其最新处理的偏移量,因此,如果在重新启动或其他操作后重新连接使用者,您将获得您自己标记为未成功使用的最新消息

这也是使用新的统一消费者API的许多优秀原因之一

偏移量存储在高可用(复制)分区主题中,并由Kafka缓存

一个用于将使用者偏移提交给ZooKeeper,这是Kafka在分布式服务(如配置)中依赖的服务,但ZooKeeper在许多写入操作中伸缩性不好,已从Kafka的API中抽象出来。这也是保存其偏移的方式

问题5

使用Kafka和Node.js(为数据提供RESTAPI)构建发布子系统是个好主意吗

那样做没有什么错。我自己最近也用Node.js+Kafka做了一些演示,并且非常喜欢。如上所述,我推荐Kafka>0.9的库,但是旧的(对于>0.8的)也可以,因为0.9是向后兼容的。即使没有其他原因,我也不会选择kafka来支持统一的消费者API

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

重流处理可能不是Node.js最好的实现方式,因为实现资源管理、容错等将是一项艰巨的任务,并且有很好的流处理框架(Samza、Spark等)用于su