应用程序设计:Spring 集成中的数百个文件轮询

Application Design: Hundreds of File Polling in Spring Integration

我和同事讨论了我们在 Weblogic 中构建的应用程序的体系结构。该应用程序的要点是这样的。文件放在网络驱动器上,一些处理完成,文件消失。这些文件属于称为事务的类别。争论的焦点是,是否最好将不同事务的所有文件都放在一个文件夹中并让一个入站文件适配器查看该文件夹,或者按事务分隔文件夹并为每个事务配备一个入站文件适配器。

系统可以有几百个事务,所以如果它是 1:1 的比率,就会有数百个轮询器。也可以将它们分组,但我们仍然可能有 50 多个目录。

并非所有事务都具有相同的吞吐量要求。有些需要近乎实时地被拾取——有些,只需每天查看一次该文件夹并拾取它们。有些交易每天可能有数万个文件。

从高层看,第一个组件从目录获取文件名,将文件移动到下一个文件夹,并在队列中放置一条消息,提醒下一个下游组件处理该文件。

1 个目录的优势:

缺点:

许多目录的优势:

缺点:许多入站适配器线程轮询(尽管并不总是主动)。

我对社区的问题是 - 就 Spring 集成而言,在应用程序中启动可能有数百个入站文件适配器有多可怕?可能出现什么问题?我假设当文件入站适配器没有列出目录时,它几乎处于空闲状态并且不消耗任何资源?

我们使用 Weblogic 作为应用服务器,我的同事还建议使用工作管理器来管理系统其他部分的线程资源。这也可以用来处理数百个入站适配器吗?

谢谢!

轮询器共享一个任务调度程序,默认池有 10 个线程,但可以增加。所以这不是真正的问题 - 是的,在轮询之间不会消耗任何资源。

From a high level, the first component obtains the filename from a directory, moves the file to the next folder and places a message on the queue alerting the next downstream component to work on the file.

由于轮询器做的工作很少(移动文件并将消息发送到队列),我认为拥有单个实例(可能有热备用)不会成为限制因素。

my colleague wants to build a monolith...while I want to breakout each component into its each deployable

我同意你的做法。使用中间件(JMS、RabbitMQ)来分配工作给您最大的灵活性,您可以增加每个实例中的消费者线程并根据需要添加更多实例。