【问题标题】:Integration of Kafka in Web ApplicationKafka 在 Web 应用程序中的集成
【发布时间】:2018-02-25 01:19:36
【问题描述】:

我有一个基于 Java 的 Web 应用程序,它使用 2 个 Microsoft SQL 后端数据库服务器(1 个服务器是实时数据库,因为它是事务性的,另一个是报告数据库)。事务数据库和报告数据库之间的延迟约为 30 分钟,增量数据使用 SQL 作业加载,该作业每 30 分钟运行一次,执行时间约为 20-25 分钟。该作业正在执行一个 SSIS 包,并使用该包,对来自报告数据库的数据进行进一步处理并存储在 HDFS 和 HBase 中,最终用于分析。

现在,我想减少这种滞后,为此,我正在考虑实施一个消息传递框架。在做了一些研究之后,我了解到 Kafka 可以解决我的目的,因为 Kafka 除了作为消息传递框架之外,还可以作为 ETL 工具。

我应该如何进行?我应该在 SQL Server 中创建类似于表结构的主题并对其执行操作吗?我是否应该重定向我的应用程序以先写入 Kafka 中发生的任何更改,然后再写入 Transactional 数据库?考虑到上述用例,请就 Kafka 的使用提出建议。

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    有几种方法可以做到这一点,需要最少的代码,然后总是可以选择编写自己的代码。

    (一些同事刚看完这个,用 SQL Server 和 Oracle,所以我在这里知道一点)

    如果您使用的是企业版 SQL Server,您可以使用更改数据捕获和Confluent Kakfa Connect 来读取对数据的所有更改。这(似乎)需要企业许可证,并且可能包括其他一些额外费用(我对这里的细节不清楚。这可能是因为我们使用的是旧版本的 SQL Server 或因为我们有许多数据库服务器)。

    如果你不是/不能使用 CDC 的东西,Kafka Connect's JDBC support 也有一种模式,它会轮询数据库以进行更改。如果您的记录有 some kind of timestamp column,则此方法效果最佳,但通常是这种情况。

    没有 CDC 的仅轮询模式意味着您不会获得每个更改 - 即,如果您每 30 秒进行一次轮询并且记录更改两次,您将不会收到有关此更改的单独消息,但是如果有意义的话,您将收到一条包含这两项更改的消息。这对于您的业务领域可能是可以接受的,但需要注意。

    无论如何,Kafka Connect 非常酷 - 它会根据您的表名自动为您创建 Kafka 主题,包括将 Avro 模式发布到 Schema Registry。 (主题名称是已知的,因此如果您处于 auto topic creation = false 的环境中,那么您可以根据表名自己手动创建主题)。从不了解 Kafka Connect 开始,我大概花了 2 个小时才弄明白配置足以将大型 SQL Server 数据库转储到 Kafka。

    我在 a Github repository of a Confluent employee 中找到了描述所有这些的附加文档,以及设置文档等。

    始终可以选择让您的 Web 应用程序本身成为 Kafka 生产者,而忽略较低级别的数据库内容。这可能是一个更好的解决方案,例如,如果请求在数据存储中创建了许多记录,但实际上它是一个相关事件(订单可能会在您的关系数据库中产生一些 LineItem 记录,但下游数据库只关心订单已制作)。

    在消费者端(即“旁边”您的其他数据库),您可以使用另一端的 Kafka Connect 来获取更改,如果需要,甚至可以编写自定义插件,或者编写自己的 Kafka 消费者微服务来放置更改到另一个数据库中。

    【讨论】:

    • 感谢您的宝贵建议。我使用的是企业版 SQL Server 2016,因此 CDC 可以在我的情况下工作。但是轮询方法也可以工作,因为我有以 ModifiedDateTime 列形式的 currentTimeStamp,每次更改都会更新。我会检查这两个选项。再次感谢您的帮助:)
    • 我按照您提供的链接进行操作,但找不到将 Kafka 与 SQL Server 连接以遵循轮询方法的方法。在 Confluent JDBC 连接器列表中,连接器可用于几乎所有数据库,但找不到任何用于 SQL Server 的连接器。您是否有任何有用的链接/博客提供有关使用轮询方法的任何信息或步骤?
    • 根据我的经验和测试,您只需将 JDBC jar 用于 MSSQL,将其添加到 Kafkan Connect 插件路径,并指定连接 URL jdbc:mysql://
    猜你喜欢
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 2014-12-04
    • 2020-05-25
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多