【问题标题】:Kafka streams to build materialised viewsKafka 流构建物化视图
【发布时间】:2017-03-22 14:56:14
【问题描述】:

我正在尝试从数据库更新流中生成某种具体化视图(由例如 DBMS 的事务日志提供,在例如 maxwell-daemon 的帮助下)。该视图被具体化为一个 Kafka 压缩主题。

视图是一个简单的连接,可以表示为这样的查询:

SELECT u.email user_email, t.title todo_title, t.state todo_state
FROM   User u
JOIN   Todo t
ON     t.user_id = u.id

我希望每次 User 或 Todo 更改时更新视图(要在视图的 kafka 主题上发布消息)。

使用 Kafka Streams 似乎可以通过这样做来实现:

  • 制作用户更改的 KTable
  • 制作 Todo 更改的 KTable
  • 同时加入

但是,我不确定一些事情:

  • 这可能吗?
  • 这会保持事件的原始顺序吗?例如如果 User 改变了,Todo 也改变了,我能保证在 join 的结果中看到这些改变吗?
  • 如何处理交易?例如多个数据库更改可能是同一事务的一部分。如何确保两个 KTable 都是原子更新的,并且所有连接结果都只显示完全应用的事务?

【问题讨论】:

    标签: apache-kafka-streams


    【解决方案1】:
    • 这可能吗?

    是的。您描述的模式将计算出您想要的开箱即用的内容。

    • 这会保持事件的原始顺序吗?例如如果 User 改变了,Todo 也改变了,我能保证在 join 的结果中看到这些改变吗?

    Streams 将根据时间戳处理数据(即首先具有较小时间戳的记录)。因此,通常这将按预期工作。但是,没有严格的保证,因为在流处理中,始终取得进展(并且不要阻塞)更为重要。因此,Streams 仅在按时间戳顺序处理记录方面应用“尽力而为的方法”。例如,如果一个变更日志不提供任何数据,Streams 将继续只处理来自另一个变更日志的数据(而不是阻塞)。这可能会导致对来自不同分区/主题的时间戳进行“乱序”处理。

    • 如何处理交易?例如多个数据库更改可能是同一事务的一部分。如何确保两个 KTable 都是原子更新的,并且所有连接结果都只显示完全应用的事务?

    目前这是不可能的。每个更新都将单独处理,您将看到每个中间(即未提交)结果。但是,Kafka 将在未来引入“事务处理”,从而能够处理事务。 (见https://cwiki.apache.org/confluence/display/KAFKA/KIP-98+-+Exactly+Once+Delivery+and+Transactional+Messaginghttps://cwiki.apache.org/confluence/display/KAFKA/KIP-129%3A+Streams+Exactly-Once+Semantics

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-04
      • 2017-03-26
      • 2022-06-16
      • 2019-11-30
      • 1970-01-01
      • 2019-01-28
      • 2021-05-04
      • 2021-10-11
      相关资源
      最近更新 更多