在使用新服务(例如非RDBMS数据存储或消息队列)时,我首先考虑的事情之一是:“我应该如何构造我的数据?”
我已经阅读并观看了一些介绍性材料。特别是,以Kafka: a Distributed Messaging System for Log Processing为例,它写道:
了解了这一点,什么是一个很好的例子来说明如何使用主题和分区?什么时候应该成为一个主题?什么时候应该是分区?
例如,假设我的(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
?那么分区呢?
我该如何决定?
发布于 2013-06-20 21:57:03
在为Kafka构建数据结构时,这真的取决于数据的使用方式。
在我看来,主题是一组相似类型的消息,将被相同类型的消费者消费,所以在上面的例子中,我只有一个主题,如果你决定通过Kafka推送一些其他类型的数据,你可以稍后添加一个新的主题。
主题在ZooKeeper中注册,这意味着如果尝试添加太多主题,您可能会遇到问题,例如,如果您有一百万用户,并决定为每个用户创建一个主题。
另一方面,分区是并行化消息消耗的一种方式。 broker集群中的分区总数需要至少与消费者组中的消费者数量相同,才能理解分区功能。消费者组中的消费者会根据分区将处理主题的负担分摊给自己,从而使一个消费者只关注被分配到的分区本身中的消息。
分区可以使用生产者端的分区键显式设置,如果没有提供,将为每条消息选择一个随机分区。
发布于 2015-02-25 01:11:39
一旦您知道如何对事件流进行分区,主题名称就很容易了,所以让我们先回答这个问题。
@Ludd是正确的-您选择的分区结构在很大程度上取决于您希望如何处理事件流。理想情况下,您需要一个分区键,这意味着您的事件处理是partition-local.
例如:
:user-id
分区。这样,与单个用户的站点活动相关的所有事件都将在同一分区中可用。这意味着像Apache Samza这样的流处理引擎可以通过查看单个分区中的事件来计算给定用户的平均现场时间。这避免了必须执行任何类型的昂贵的partition-global处理:viewed
页面分区。同样,通过查看单个分区中的事件,Samza将能够对给定页面的视图进行计数
通常,我们试图避免依赖全局状态(例如将计数保存在DynamoDB或Cassandra等远程数据库中),而是能够使用分区本地状态工作。这是因为local state is a fundamental primitive in stream processing。
如果您需要上述两种用例,那么Kafka的常见模式是首先使用:user-id
进行分区,然后使用:viewed
进行re-partition,为下一阶段的处理做好准备。
在主题名称上-这里一个明显的名称是events
或user-events
。更具体地说,你可以使用events-by-user-id
和/或events-by-viewed
。
发布于 2018-03-05 16:07:21
这与问题并不完全相关,但是如果你已经决定了基于主题的记录的逻辑分离,并且想要优化Kafka中的主题/分区计数,this博客帖子可能会派上用场。
主要内容概括如下:
too many files are open
,而我们有大约3600个主题分区。https://stackoverflow.com/questions/17205561
复制相似问题