应用程序设计:Spring 集成中的数百个文件轮询
Application Design: Hundreds of File Polling in Spring Integration
我和同事讨论了我们在 Weblogic 中构建的应用程序的体系结构。该应用程序的要点是这样的。文件放在网络驱动器上,一些处理完成,文件消失。这些文件属于称为事务的类别。争论的焦点是,是否最好将不同事务的所有文件都放在一个文件夹中并让一个入站文件适配器查看该文件夹,或者按事务分隔文件夹并为每个事务配备一个入站文件适配器。
系统可以有几百个事务,所以如果它是 1:1 的比率,就会有数百个轮询器。也可以将它们分组,但我们仍然可能有 50 多个目录。
并非所有事务都具有相同的吞吐量要求。有些需要近乎实时地被拾取——有些,只需每天查看一次该文件夹并拾取它们。有些交易每天可能有数万个文件。
从高层看,第一个组件从目录获取文件名,将文件移动到下一个文件夹,并在队列中放置一条消息,提醒下一个下游组件处理该文件。
1 个目录的优势:
- 您只有 1 个线程 运行ning.
缺点:
- 你需要不断地快速轮询。您将在可扩展性方面达到稳定状态,因为一个入站适配器只能在一秒钟内为每个目录拾取一定数量的文件。如果使用多个 JVM,轮询器将争夺谁锁定了某个文件并可以移动它。
许多目录的优势:
- 您可以更好地控制交易的提取方式。事务 XYZ 可能只需要安排到 运行 一天一次,而 ABC 每 5 分钟一次。 XYZ 不会妨碍 ABC。所以如果有 10000 个 XYZ 文件和 1 个 ABC 文件,ABC 将很快被提取。
- 可扩展性。如果我有 100 个目录,但发现资源不足,我可以部署 'file receivers' 中的 5 个,并让每个目录查看 20 个不同的目录(旁注,我的同事想构建一个整体...而我想将每个组件分解成它的每个可部署组件,但理论上如果分解,我相信它更具可扩展性,因为我们可以增加接收器的数量)
缺点:许多入站适配器线程轮询(尽管并不总是主动)。
我对社区的问题是 - 就 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)来分配工作给您最大的灵活性,您可以增加每个实例中的消费者线程并根据需要添加更多实例。
我和同事讨论了我们在 Weblogic 中构建的应用程序的体系结构。该应用程序的要点是这样的。文件放在网络驱动器上,一些处理完成,文件消失。这些文件属于称为事务的类别。争论的焦点是,是否最好将不同事务的所有文件都放在一个文件夹中并让一个入站文件适配器查看该文件夹,或者按事务分隔文件夹并为每个事务配备一个入站文件适配器。
系统可以有几百个事务,所以如果它是 1:1 的比率,就会有数百个轮询器。也可以将它们分组,但我们仍然可能有 50 多个目录。
并非所有事务都具有相同的吞吐量要求。有些需要近乎实时地被拾取——有些,只需每天查看一次该文件夹并拾取它们。有些交易每天可能有数万个文件。
从高层看,第一个组件从目录获取文件名,将文件移动到下一个文件夹,并在队列中放置一条消息,提醒下一个下游组件处理该文件。
1 个目录的优势:
- 您只有 1 个线程 运行ning.
缺点:
- 你需要不断地快速轮询。您将在可扩展性方面达到稳定状态,因为一个入站适配器只能在一秒钟内为每个目录拾取一定数量的文件。如果使用多个 JVM,轮询器将争夺谁锁定了某个文件并可以移动它。
许多目录的优势:
- 您可以更好地控制交易的提取方式。事务 XYZ 可能只需要安排到 运行 一天一次,而 ABC 每 5 分钟一次。 XYZ 不会妨碍 ABC。所以如果有 10000 个 XYZ 文件和 1 个 ABC 文件,ABC 将很快被提取。
- 可扩展性。如果我有 100 个目录,但发现资源不足,我可以部署 'file receivers' 中的 5 个,并让每个目录查看 20 个不同的目录(旁注,我的同事想构建一个整体...而我想将每个组件分解成它的每个可部署组件,但理论上如果分解,我相信它更具可扩展性,因为我们可以增加接收器的数量)
缺点:许多入站适配器线程轮询(尽管并不总是主动)。
我对社区的问题是 - 就 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)来分配工作给您最大的灵活性,您可以增加每个实例中的消费者线程并根据需要添加更多实例。