我们正在尝试通过利用Spring Cloud数据流来设计ETL解决方案。
要求主要是:
我们面临的一些挑战:
我们尝试使用JDBC源启动器应用程序连接到源数据库,
但是,由于我们要访问的数据库受到其他部门的限制,因此它们受到限制,因此无法使用jdbc.update功能更新源数据库以将行标记为“可见”。
是否存在一种建议的方法来查询和翻页大型结果集而不会耗尽内存?在这种情况下,jdbc.max-rows-per-poll选项似乎不合适。
我们不建议使用Tasks / Batch,因为流管道更强大,更干净(数据可以流过流并进行转换)。有没有人成功地使用SCDF流来实现类似的目标,或者根本就不是为此用例设计的?
答案 0 :(得分:1)
可以在SCDF的流模型和批处理模型中解决所描述的需求。而且,看来您已经能够很好地将这两个功能相关联。 :)
要考虑的几个选项。
对于#1,由于您没有办法说服数据库团队在现有表中添加新列,因此您可以构建一个自定义流/批处理应用程序来模仿JDBC源的功能,但是,请使用另一个数据存储区来跟踪已经“看到”或“已处理”的记录。最终,您需要某种形式的持久性存储/缓存来决定要处理哪些行,而不要处理哪些行。
或者,您可以构建一个基于数据库支持的CDC功能的自定义源。我们正在尝试使用Debezium构建一个[参见:spring-cloud-stream-app-starters/app-starters-release#173],并且在tzolov/cdc-debezium上有关于此事的POC。这样,您仅需依靠受支持的数据库的CDC事件模型即可自动仅从表中接收新记录。
可以随意尝试POC并使用您的发现/用例对问题#173进行评论。
第二个问题更多是设计问题。如果需要使用1-go处理较大的结果集,是否适合流传输模型?也许您可以将其设计为脱机处理它们的任务/批处理工作,以便更好地利用故障恢复和可重新启动性。
一旦有了类似CDC的源,无论如何,您收到的只是新事件/行,因此可能会自动解决流控制问题。