用Kafka进行数据建模?主题和分区

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (22)

在使用新服务(例如非RDBMS数据存储或消息队列)时,我首先想到的事情之一是:“我应该如何构造数据?”

其中写道:

  • “主题是与消息相关联的容器”
  • “最小的并行单位是主题的分区。这意味着.属于某个主题的特定分区的所有消息都将由使用者组中的使用者使用。“

知道了这一点,说明如何使用主题和分区的好示例是什么?什么时候才是话题?什么时候应该是分区?

例如,假设我的(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-idviewedat是吗?那隔板呢?

我该怎么决定?

提问于
用户回答回答于

一个主题是一组类似类型的消息,这些消息将被同一类型的消费者使用,所以在上面的示例中,我只需要一个主题,如果决定通过Kafka推送其他类型的数据,可以在以后添加一个新的主题。

主题在动物园管理员中注册,这意味着如果尝试添加太多主题,就可能遇到问题,例如,有100万用户,并且决定为每个用户创建一个主题。

另一方面,分区是并行处理消息消耗的一种方法,为了理解分区特性,代理集群中的分区总数至少需要与使用者组中的使用者数量相同。使用者组中的使用者将根据分区来分担处理主题的负担,这样一个使用者只会关注分区本身中的消息“分配给”。

分区可以使用生产者端的分区键显式设置,如果不提供,则为每条消息选择一个随机分区。

用户回答回答于

一旦知道如何划分事件流,主题名称就会很容易,所以让我们先回答这个问题。

@Ludd是正确的选择的分区结构将在很大程度上取决于希望如何处理事件流。理想情况下需要一个分区键,这意味着您的事件处理是分区-局部

例如:

  1. 如果关心的是用户在站点上的平均时间,那应该按照:user-id。这样,与单个用户的站点活动相关的所事件都将在同一个分区中可用。
  2. 如果关心网站上最受欢迎的页面,则应按:viewed一页。同样,Samza可以通过查看单个分区中的事件来记录给定页面的视图。

通常,我们试图避免依赖全局状态(例如,将计数保存在像DynamoDB或Cassandra这样的远程数据库中),而是能够使用分区-本地状态工作。

如果需要上述两种用例,那么Kafka的一个常见模式就是首先进行分区,例如:user-id,然后重分割通过:viewed准备好下一阶段的处理。

关于主题名称,这里有一个显而易见的问题eventsuser-events。更具体地说,你可以和events-by-user-id和/或events-by-viewed

扫码关注云+社区