我使用kafka作为一个管道来存储分析数据,然后再将其刷新到s3并最终刷新到redshift。我正在考虑在kafka中存储数据的最佳体系结构,以便可以轻松地将其刷新到数据仓库中。
问题是我从三个独立的页面事件中获取数据:
请求页面时。
加载页面时
卸载页面时
这些事件在不同的时间触发(通常都在几秒钟之内,但彼此之间的距离最多为分钟/小时)。
我希望最终在数据仓库中存储一个关于网页视图的事件。例如,单个日志条目如下所示:
pageid=abcd-123456-abcde, site='yahoo.com' created='2015-03-09 15:15:15' loaded='2015-03-09 15:15:17' unloaded='2015-03-09 15:23:09'
我应该如何划分Kafka,这样才能发生这种情况?我正在努力在kafka中找到一个分区方案,它不需要使用redis这样的数据存储来临时存储数据,同时合并create(初始页面视图)和update(随后的加载/卸载事件)。
1条答案
按热度按时间np8igboo1#
假设:
您有多个交叉会话
你有一个sessionid来识别和关联不同的事件
你可以自由地实现消费逻辑
合并事件的绝对顺序并不重要
那么,对于这三种类型的事件,是否可以使用具有相同分区数的独立主题,并让使用者在刷新到s3的过程中将它们合并到单个事件中呢?
只要有多个总分区,就必须确保对不同的事件类型(例如modhash sessionid)使用相同的分区键,并且它们最终将位于相同的(每个主题对应的)分区中。然后,可以使用一个简单的使用者合并它们,这个使用者一次从一个分区读取三个主题。Kafka保证在分区内而不是分区之间排序。
对于代理在页面请求和页面重新加载之间失败的边缘情况,这是一个很大的警告。