我一直致力于金融行业的解决方案。该应用程序的主要功能是能够加载大量输入文件、消化它们、更新持久存储中的状态以及根据请求从持久存储中生成提取。很简单。
输入文件是行业标准格式的 XML 大型(超过数百兆字节)消息,其中包含许多重复条目。持久存储是关系数据库。该引擎已实现为可部署在 J2EE 应用服务器上的基于 POJO(作为主干的 Spring 框架)Java 应用程序。
问题是关于解决方案的可扩展性和性能。如果应用程序按顺序处理来自 XML 的条目,则解决方案的可伸缩性相当差。没有办法让应用程序的多个实例参与单个文件的处理。这就是我为输入 XML 文件中的条目引入并行处理的原因。基本上,这个想法是为池中的工人分派处理单个条目。我决定使用 JMS 进行调度。加载文件的组件读取流并简单地提取单个条目并提供给调度队列。队列的另一端有许多并发消费者。每个人从队列中挑选一条消息并处理该条目,它可以立即用于处理其他条目。这与 Web 容器中的 servlet 非常相似。我发现这种方法特别强大的是,只要队列是共享的,工作人员就可以驻留在部署在远程服务器上的应用程序的不同实例中。不幸的是,所有工作人员都连接到维护持久性存储的同一个数据库,如果数据库服务器的功能不足以处理来自并发工作人员的负载,这可能是一个瓶颈。
您对这种架构有何看法?你有类似的应用程序设计吗?你当时的设计选择是什么?