我使用Apache将文件从输入目录传输到messagebroker。这些文件是通过SFTP编写的。为了避免使用仍在传输中的不完整文件,我设置了readLock=changed和readLockCheckInterval=3000。
举个例子,我的一个测试是这样的:
<route>
<from uri="file:inbox?readLock=changed&readLockCheckInterval=3000"/>
<log message="copying ${file:name}"/>
<to uri="file:outbox"/>
</route>我用(echo line 1; sleep 2; echo line 2) > inbox/test对此进行测试,当readLockCheckInterval=3000时,文件将被忠实地复制。但是,这不会扩展,因为file组件将在处理每个文件之前等待三秒钟。所以当我用
for n in $(seq 1 100); do (echo line 1; sleep 2; echo line 2) > inbox/$n & done将文件从inbox移动到outbox需要5分钟。
我读过“骆驼在行动”中关于并行处理的章节。但是,这些示例侧重于对单个消耗文件中行的并行处理。我找不到一种方法来并行化消费者本身。
在我的用例中,每秒大约一个文件的吞吐量是可以的。我只是不喜欢为了实现这个目标而被迫冒不完整数据的风险的想法。无论如何,readLock=changed设置似乎是一个黑客,但我们不能告诉客户复制然后移动,因此似乎没有其他选择。
面对网络延迟,我如何在不牺牲完整性的情况下提高吞吐量?
发布于 2020-01-24 15:26:23
我使用的不是readLockCheckInterval=3000,而是readLockMinAge=3s,吞吐量很好。我现在的测试路线是这样的:
<route>
<from uri="file:inbox?readLock=changed&readLockMinAge=3s"/>
<to uri="file:outbox"/>
</route>事实证明,在这种情况下,我不是唯一一个这样的人,而且有一个提供最低年龄延迟机票来解决这个问题。我只是太不耐烦地阅读文件组件文档,这里已经解释过了。
发布于 2020-01-24 15:00:58
如果生产者比您的使用者更快,并且您希望保持,那么您必须对文件消耗进行并行化。您可以通过多次部署使用者来实现这一点,所有这些都是轮询同一个文件夹。就像这样,您可以并行地处理与使用者实例相同的文件数。
但是,分布式文件使用者有一个新的问题:多个可以尝试同时使用同一个文件--。
要解决这个问题,您需要使用一个分布式幂等存储库来确保相同的文件不会在所有实例中被多次使用。
要使用这个文件组件,我想您必须将readLock设置为idempotent-changed。像这样,使用者应该等到文件不再改变,当多个使用者试图读取文件时,只有第一个“胜利”。因为文件已经在幂等存储库中已知,所以跳过了所有其他文件。
https://stackoverflow.com/questions/59883997
复制相似问题