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

设计流程

  •  0
  • svrist  · 技术社区  · 17 年前

    我挑战你:)

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


    这是为金融机构准备的。

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

    事实

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


    必要条件

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

    可有可无

    • 检查点。如果我要运行很长时间,我当然希望能够重新启动这个过程,而无需从头开始。 ...

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

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

    它在BEA/Oracle Weblogic Integration上运行,这不是出于选择,而是出于定义

    当收到文件时,每一行都被读入数据库

    id, line, status,batchfilename
    以及状态“需要处理”

    当所有行都在数据库中时,行由mod 4分隔,每四分之一行启动一个进程,需要它的每一行都由getPerson调用丰富,状态设置为“已处理”。(当前批次为38.0000)。

    当所有4个四分之一的行都已处理后,写入程序将从该数据库中选择100行,将其写入文件并将其状态更新为“已写入”。 当所有工作完成后,新文件将被交还给路由框架,并向操作人员发送一封“完成”电子邮件。

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

    3 回复  |  直到 17 年前
        1
  •  4
  •   dkretz    17 年前

    尽可能地简化。

    从最简单的过程来看,这些批次(试图将它们作为单元处理,以及它们的各种大小)似乎是可以丢弃的。听起来行是原子的,而不是批。

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

    仅使用消息记录中的列维护批标识,并根据需要随时按需汇总批。

        2
  •  1
  •   Rasmus Faber    17 年前

    当您收到文件时,解析它并将信息放入数据库。

    制作一个表,每行包含一条需要getPerson请求的记录。

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

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

        3
  •  1
  •   nchris    17 年前

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

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

    您还可以使用一些大容量加载器(例如Oracles SQL loader)将文件中的大量数据放入表中,再次添加一列来标记行是否已处理,这样如果进程崩溃,您就可以从中断的地方继续。

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