【问题标题】:Kafka/Connect/Streams for DB field update用于数据库字段更新的 Kafka/Connect/Streams
【发布时间】:2018-11-06 22:07:17
【问题描述】:

我的问题如下:

我有 2 个 kafka 主题:

  • customer-purchase:包含有关客户购买的信息,其中表示状态的字段等于NEW
  • purchase-status:包含更新最新购买状态的事件,例如IN TRANSIT, DELIVERED...

使用 kafka、kafka connect 和/或 kafka 流,我想最终得到一个 SQL 数据库,其中包含包含最新状态信息的购买。

在数据库世界中,这将导致一个简单的UPDATE 查询。

理论上,我可以为customer-purchase 编写 1 个使用者(或 1 个连接接收器),其中所有内容都简单地转储到数据库,为purchase-status 编写 1 个使用者,这将触发数据库 UPDATE 查询,但我想知道是否有更类似于 kafka 的方式来做到这一点。

注意:使用 kafka-streams 并加入 2 个主题对我来说似乎有点矫枉过正,因为我实际上不需要加入,而是简单地更新一个字段。但我的这个假设可能完全错了!

【问题讨论】:

    标签: apache-kafka kafka-consumer-api apache-kafka-streams apache-kafka-connect


    【解决方案1】:

    理论上,我可以为客户购买编写 1 个消费者(或 1 个连接接收器),其中所有内容都简单地转储到数据库和 1 个消费者用于触发数据库更新查询的购买状态,但我想知道是否有更类似于 kafka 的方式来做到这一点。

    这几乎就是 Kafka Streams 中的表-表连接实际所做的。

    在您的示例中,您是从“一次处理一个事件”的角度来看待它。表-表连接发送此类“更新”与您所描述的非常相似。请参阅https://kafka.apache.org/documentation/streams/developer-guide/dsl-api.html#ktable-ktable-join 的连接语义。

    注意:使用 kafka-streams 并加入 2 个主题对我来说似乎有点矫枉过正,因为我实际上不需要加入,而是简单地更新一个字段。但我的这个假设可能完全错了!

    您提到您考虑加入这两个主题,但最终决定反对。为什么这样?这似乎是一个好主意,对我来说也是惯用的。这与 DB 世界的示例也没有太大区别:您将如何执行“包含最新状态信息的购买的 SQL 数据库”中的丰富步骤?这实际上是一个连接操作(见上文)。

    【讨论】:

    • 嗨迈克尔,谢谢你的回答!事实上,我相信你说的对,我会通过使用 Streams 的表-表连接来实现我所期望的。我担心的是,如果我理解正确,这样做会有效地复制我的数据库,因为信息将同时存在于 kafka 和 SQL db 中。在这一点上,我在技术上什至可以完全删除 sql 数据库,但从业务角度来看这是不可能的,因此我正在寻找一种方法来结束更新的数据库,但也不会将所有数据复制到 kafka 中。
    • 是的,你是对的,数据会出现两次,一次在原始数据库中,一次在 Kafka 中。
    猜你喜欢
    • 2018-02-19
    • 2020-03-22
    • 1970-01-01
    • 2018-07-17
    • 2017-06-09
    • 2019-06-12
    • 2017-03-15
    • 1970-01-01
    • 2019-05-01
    相关资源
    最近更新 更多