在使用新服务(例如非 RDBMS 数据存储或消息队列)时,我首先想到的事情之一是:“我应该如何构建我的数据?”。
我已经阅读并观看了一些介绍性材料。特别是,以Kafka:一个用于日志处理的分布式消息传递系统为例,它写道:
知道了这一点,什么是说明如何使用主题和分区的好例子?什么时候应该成为话题?什么时候应该是一个分区?
例如,假设我的 (Clojure) 数据如下所示:
{:user-id 101 :viewed "/page1.html" :at #inst "2013-04-12T23:20:50.22Z"} {:user-id 102 :viewed "/page2.html" :at #inst "2013-04-12T23:20:55.50Z"}
主题应该基于user-id? viewed? at? 分区呢?
user-id
viewed
at
我该如何决定?
在为 Kafka 构建数据时,实际上取决于它的使用方式。
在我看来,主题是一组相似类型的消息,将被相同类型的消费者消费,所以在上面的例子中,我只有一个主题,如果你决定推送其他类型的通过 Kafka 获取数据,您可以稍后为其添加新主题。
主题在 ZooKeeper 中注册,这意味着如果尝试添加太多主题,您可能会遇到问题,例如,您拥有一百万用户并决定为每个用户创建一个主题。
另一方面,分区是一种并行处理消息的方式。 代理集群中的分区总数需要至少与消费者组中的消费者数量相同,才能理解分区功能。 消费者组中的消费者将根据分区在他们之间分担处理主题的负担,这样一个消费者将只关心分区本身“分配给”的消息。
可以使用生产者端的分区键显式设置分区,或者如果未提供,将为每条消息选择一个随机分区。