Spring Cloud DataFlow http轮询和重复数据删除

时间:2017-08-14 15:11:58

标签: spring-integration spring-batch spring-cloud-stream spring-cloud-dataflow spring-cloud-task

我一直在阅读很多Spring Cloud DataFlow和相关文档,以便生成将在我的组织的Cloud Foundry部署中运行的数据提取解决方案。目标是轮询HTTP服务以获取数据,为了讨论每天可能需要三次,并在PostgreSQL数据库中插入/更新该数据。 HTTP服务似乎每天提供数万条记录。

到目前为止,一个混淆点是DataFlow管道上下文中用于重复删除轮询记录的最佳实践。源数据没有时间戳字段来帮助跟踪轮询,只有粗略的日级日期字段。我也无法保证记录不会追溯更新。这些记录似乎有一个唯一的ID,因此我可以通过这种方式对记录进行重复删除,但我根据文档在DataFlow中如何最好地实现该逻辑。据我所知,Spring Cloud Stream starters没有提供这种开箱即用的功能。我正在阅读关于Spring Integration的smart polling,但我不确定是否也意味着要解决我的问题。

我的直觉是在DataFlow Stream中创建自定义处理器Java组件,该组件执行数据库查询以确定是否已插入轮询记录,然后将适当的记录插入目标数据库,或者在流中传递它们。是否在Stream应用程序中可接受的中间步骤中查询目标数据库?或者,我可以在Spring Cloud Task中实现这一切,作为基于某些计划触发的批处理操作。

继续使用DataFlow应用程序的最佳方法是什么?如上所述,在DataFlow / Stream / Task / Integration应用程序中,实现重复数据删除的常见/最佳实践是什么?我应该复制启动应用程序的设置还是从头开始,因为我相当确定我是否需要编写自定义代码?我甚至需要Spring Cloud DataFlow,因为我不确定我会使用它的DSL吗?对所有问题道歉,但对于Cloud Foundry和所有这些Spring项目都不熟悉,将它们拼凑在一起是令人生畏的。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您走在正确的轨道上,根据您的要求,您很可能需要创建自定义处理器。您需要跟踪插入的内容以避免重复。

没有什么可以阻止您在流应用中编写此类处理器,但是性能可能会受到影响,因为对于每条记录,您将发出数据库查询。

如果订单不重要,您可以并行化查询,以便处理多个并发消息,但最终您的数据库仍然会付出代价。

另一种方法是使用bloomfilter,它可以帮助您加快检查插入记录的速度。

您可以从克隆启动器应用程序开始,您可以让一个轮询器触发一个http客户端处理器来获取您的数据,然后通过您的自定义代码处理器,最后到jdbc-sink。像describe 'template_variables' do it 'initializes all the new vars per document' do expect(document.template_variables.size).to eq subject.master_var_hash.size end end

这样的东西

使用SCDF的一个优点是您可以通过部署属性(例如stream create time --triger.cron=<CRON_EXPRESSION> | httpclient --httpclient.url-expression=<remote_endpoint> | customProcessor | jdbc

)独立扩展自定义处理器

答案 1 :(得分:1)

Spring Cloud Data Flow基于Spring Cloud Stream构建数据集成流,而Spring Cloud Stream完全基于Spring Integration。 Spring Integration中存在的所有原则都可以应用于SCDF级别的任何地方。

这可能是一个你无法避免某些编码的情况,但你所需要的是在EIP Idempotent Receiver中调用的。 Spring Integration为我们提供了一个:

System.Diagnostics.Process.Start(someFileName).Close();