更新 Kafka 事件日志

Updating Kafka Event Log

我使用 Kafka 作为管道来存储分析数据,然后再将其刷新到 S3 并最终刷新到 Redshift。我正在考虑在 Kafka 中存储数据的最佳架构,以便它可以轻松地刷新到数据仓库。

问题是我从三个单独的页面事件中获取数据:

  1. 请求页面时。
  2. 页面加载时
  3. 页面卸载时

这些事件在不同的时间触发(通常都在几秒内发生,但彼此相距最多 minutes/hours)。

我想最终在我的数据仓库中存储关于网页浏览的单个事件。例如单个日志条目如下:

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(后续 load/unload 事件)。

假设:

  • 您有多个交错会话
  • 您有某种 sessionid 来识别和关联单独的事件
  • 您可以自由实施消费者逻辑
  • 合并事件的绝对顺序并不重要

那么是否可以为三种事件使用具有相同分区数的单独主题,并让消费者在刷新到 S3 期间将它们合并为一个事件?

只要你有一个以上的总分区,你就必须确保对不同的事件类型(例如 modhash sessionid)使用相同的分区键,并且它们最终会在相同的(每个主题对应) 分区。然后可以使用一个简单的消费者合并它们,该消费者一次从一个分区读取三个主题。 Kafka 保证分区内的排序,但不保证分区之间的排序。

对于代理在页面请求和页面重新加载之间发生故障的边缘情况的大警告。