我挑战你 :)
我已经有人执行了一个过程。我将尝试描述需求,我希望我可以从“最佳方法”中获得一些建议。
这是给金融机构的。
我有一个路由框架,该框架将允许我接收文件并将请求发送到其他系统。我有一个可以随意使用的数据库,但是只有我本人和我的软件可以访问该数据库。
事实
通过路由框架,我收到一个文件。
该文件中的每一行都采用固定长度格式,带有一个人的标识和一个数量(+很多其他东西)。
该文件在100MB以下的时间中占99%的时间(每行约800字节,即2,2mb = 2600行)
每年一次,我们有1-3 GB的数据。
在“应用服务器”上运行
我可以根据需要派生子流程。 (在合理范围内)
运行超过两天时,我无法保证一致性。子进程可能会死亡,与数据库/框架的连接可能会丢失,文件可能会移动
我无法通过框架发送可靠的消息。电话是syncnus,所以我必须等待答案。
发送LOTS时,发送这些getPerson请求可能/可能会使我的“进程”崩溃。
我们正在使用Java。
要求
我必须返回包含所有数据的文件+我必须为某些行添加更多信息。 (约25-50%的线:至少25.000)
我只能通过框架对另一个系统执行getPerson请求才能获得此信息。每人一个。耗时200至400毫秒。
它必须能够在两天内完成
很高兴有
检查点。如果我要长时间运行,我肯定希望能够重新启动该过程,而无需从头开始。
...
您将如何设计?
稍后我将添加当前的“ hack”和我的简要想法
==========当前解决方案================
它在BEA / Oracle Weblogic Integration上运行,不是根据选择而是根据定义
收到文件后,将每一行读入数据库
id,行,状态,批处理文件名和状态“需要处理”
当所有行都在数据库中时,行用mod 4分隔,并且每四分之一行开始一个进程,并且需要它的每一行通过getPerson调用进行充实,并且状态设置为“已处理”。 (当前批次中为38.0000)。
处理完所有四分之四的行后,编写者进程开始于从该数据库中选择100行,将其写入文件并将其状态更新为“已写入”。
完成所有操作后,新文件将交还给路由框架,并将“完成”电子邮件发送给操作人员。
这4个处理过程可能会/将失败,因此可以通过http获取WLI上的servlet来重启它们。
最佳答案
尽可能简化。
就最简单的过程而言,批次(尝试将它们作为单位处理,以及它们的各种大小)似乎是可丢弃的。听起来行是原子的,而不是批次。
通过异步FIFO消息队列将所有行作为单独的原子事务馈入,并具有良好的检测机制(并适当记录日志和路由故障)。然后,您可以严格按照例外处理问题。 (数据库中的队列表可能可以工作。)
仅在消息记录中的一列维护批次标识,并根据需要以任何方式汇总批次。