代码之家  ›  专栏  ›  技术社区  ›  whywake

Kafka在Web应用中的集成

  •  1
  • whywake  · 技术社区  · 8 年前

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

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

    我应该如何继续?我是否应该创建类似于SQL server中的表结构的主题并对其执行操作?我是否应该重定向我的应用程序,以便先在Kafka中编写任何更改,然后再在事务数据库中编写?请考虑上述用例,就卡夫卡的使用提出建议。

    1 回复  |  直到 8 年前
        1
  •  3
  •   RyanWilcox    8 年前

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

    (一些同事刚刚用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模式发布到模式注册表。(主题名称是可知的,因此如果您处于自动创建主题=false的环境中,那么您可以根据表名称手动创建主题)。从没有卡夫卡连接的知识开始,我花了大约2个小时才弄清楚足够的配置,以便将一个大型SQL Server数据库转储到卡夫卡。

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

    总是可以选择让你的web应用程序本身成为卡夫卡制作人,而忽略较低级别的数据库内容。这可能是一个更好的解决方案,例如,如果一个请求在数据存储中创建了许多记录,但实际上这是一个相关的事件(订单可能会在关系数据库中派生出一些行项目记录,但下游数据库只关心订单的生成)。

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

    推荐文章