设计一个过程

时间:2009-01-20 21:51:01

标签: java

我挑战你:)

我有一个人已经实施过程。我将尝试描述这些要求,我希望能得到一些“最佳方式”的输入。


这是针对金融机构的。

我有一个路由框架,允许我接收文件并向其他系统发送请求。我有一个我可以使用的数据库,但只有我和我的软件可以访问这个数据库。

事实

  • 通过路由框架,我收到了一个文件。
  • 此文件中的每一行都遵循固定长度格式,包含人员和金额的标识(+许多其他内容)。
  • 这个文件99%的时间都在100MB以下(每行约800字节,即2,2mb = 2600行)
  • 每年一次我们有1-3 GB的数据。
  • 在“appserver”上运行
  • 我可以随意分叉子进程。 (在合理范围内)
  • 运行两天以上我无法保证一致性。子进程可能会死,与db / framework的连接可能会丢失,文件可能会移动
  • 我不能通过框架发送可靠的消息。呼叫是同步的,所以我必须等待答案。
    • 发送LOTS可能/可能发送这些getPerson请求会导致我的“进程”崩溃。
  • 我们正在使用java。


要求

  • 我必须返回包含所有数据的文件+我必须为某些内容添加更多信息。 (大约25-50%的线:至少25.000)
  • 此信息我只能通过框架向另一个系统执行getPerson请求。每人一个。需要200到400毫秒。
  • 必须能够在两天内完成

很高兴

  • 检查点。如果我要运行很长一段时间,我肯定希望能够重新启动该过程而无需从顶部开始。 ...

你会如何设计? 我稍后会添加当前的“黑客”和我的简短想法

==========当前解决方案================

它在BEA / Oracle Weblogic Integration上运行,而不是按照选择而是按照定义

收到文件后,每行都会用

读入数据库

id, line, status,batchfilename
和状态'需要处理'

当所有行都在数据库中时,行按mod 4分开,每个行的每个季度开始一个进程,并且需要它的每一行都被getPerson调用丰富,状态设置为'Processed'。 (当前批次为38.0000)。

当行的所有4个排序都已处理时,编写器进程从该数据库中选择100行开始,将它们写入文件并将其状态更新为“已写入”。 完成所有操作后,新文件将被传回路由框架,并向操作人员发送“即时完成”电子邮件。

4个处理进程可能会/将会失败,因此可以使用http get到WLI上的servlet重新启动它们。

3 个答案:

答案 0 :(得分:4)

尽可能简化。

批次(试图将它们作为单位处理,并且它们的各种尺寸)在最简单的过程中似乎是可丢弃的。听起来这些行是原子的,而不是批次。

通过异步FIFO消息队列将所有行作为单独的原子事务提供,具有良好的检测机制(以及适当的日志记录和路由故障)。然后,您可以在异常的基础上严格处理问题。 (数据库中的队列表可能有效。)

仅使用消息记录中的列维护批次标识,并根据需要通过该方式汇总批次,无论何时需要。

答案 1 :(得分:1)

收到文件后,解析文件并将信息放入数据库中。

创建一个包含每行记录的表,该表需要getPerson请求。

让一个或多个线程从此表中获取记录,执行请求并将完成的记录放回表中。

处理完所有记录后,生成完整的文件并将其返回。

答案 2 :(得分:1)

如果文件的处理需要2天,那么我将从实现某种简历功能开始。将大文件拆分为较小的文件并逐个处理。如果由于某种原因整个处理过程中断,那么你就不必重新开始了。

通过将较大的文件拆分为较小的文件,您还可以使用更多的服务器来处理文件。

您还可以使用一些批量加载器(例如Oracles SQL Loader)将大量数据从文件中取出到表中,再次添加一列来标记该行是否已被处理,这样您就可以选择如果进程崩溃,你就离开了。

返回值可能是许多小文件,最后这些小文件将组合成大型单个文件。如果选择了数据库方法,您还可以将结果保存在一个表中,然后可以将其提取到csv文件中。