Locking 集群中的Camel读锁策略

Locking 集群中的Camel读锁策略,locking,apache-camel,Locking,Apache Camel,我们正在尝试使用ApacheCamel迁移到集群。到目前为止,我们在一个节点上使用了它,并且工作得很好 一个节点: 我已将readlock策略设置为“changed”,它使用camelLock文件跟踪文件更改,并且只有当文件下载完成后,才会将其拾取以进行处理。但在集群中不鼓励使用“已更改”的骆驼读锁策略。根据camel文档,建议使用“幂等元”。这就是使用5GB文件进行测试时发生的情况 两个节点: 我将readlock策略设置为“幂等”,它将文件分发到其中一个节点,但camel甚至在文件下载完成之

我们正在尝试使用ApacheCamel迁移到集群。到目前为止,我们在一个节点上使用了它,并且工作得很好

一个节点: 我已将readlock策略设置为“changed”,它使用camelLock文件跟踪文件更改,并且只有当文件下载完成后,才会将其拾取以进行处理。但在集群中不鼓励使用“已更改”的骆驼读锁策略。根据camel文档,建议使用“幂等元”。这就是使用5GB文件进行测试时发生的情况

两个节点: 我将readlock策略设置为“幂等”,它将文件分发到其中一个节点,但camel甚至在文件下载完成之前就开始处理该文件

当readlock策略是幂等的时,有没有办法阻止camel在文件下载之前就进行处理?

尽管“readlock=changed”和“readlock=幂等”都会导致文件使用者等待,但它们确实解决了完全不同的用例:“readlock=changed”可以防止文件不完整(也就是说,仍然由某些生产者/发送者编写),“readLock=幂等元”可以防止文件被两个使用者路由读取。它们被同一个选项寻址,这有点令人困惑

首先,解决“已更改”的情况:是否可以更改发件人,使其将文件写入一个目录,然后在完成写入后,将其复制到文件使用者监视的目录中?如果这是在您的控制下,这是让操作系统处理事情而不是自己处理的好方法。(这并没有解决多个读卡器的问题。)否则,我建议您恢复到readLock=changed

接下来,在多个读卡器上,一个解决方法是只在集群的一个节点上运行此路由。有时这可能会破坏集群的目的,但很可能您正在启动其他节点以帮助处理其他路由,并且您可以在一个节点上运行此特定路由。这有点麻烦HoCK来做这样的事情,因为所有的节点不再相等,但它仍然是一个可以考虑的选项。最简单的是启动一个节点,它具有一些环境属性,它将它标记为处理文件读取的节点…或类似的方法。 如果确实希望路由在多个节点上,可以使用选项“幂等=true”开始,但这本身不够好。该选项使用存储库,其中记录以前读取的文件,默认存储库位于内存中(即每个节点都有自己的存储库)。因此,如果同一文件实际上被多次接收,并且您希望跳过它,则默认实现非常有用。但是,如果您希望它跨节点工作,则必须使用不同的存储库


一个中央存储库可以是一个数据库。在这种情况下,可以使用Camel的JDBC或基于JPA的存储库。或者,您可以使用类似Hazelcast的存储库。请参见此处了解您的选项:

我们还在Docker集群模式中使用了
readLock=changed
,并且工作得非常好,因为我们在一定时间间隔内使用了
readLockMinAge

nk you Darius。我们在群集中使用hazelcast,效果非常好,文件只在群集中的一个节点上处理。但问题是readLock设置为幂等,发送方发送5GB文件,文件使用者立即或在几秒钟后甚至在文件下载完成之前将其提取处理。我们担心t网络问题等,如果发送方发送的文件中断,我们的事务状态将不完整。希望在文件使用者提取文件之前完全下载该文件,就像readLock=changed时发生的情况一样。您是否尝试过readLock=changed,幂等元=true,幂等元存储库指向Hazelcast?在群集上尝试过。此设置“readLock=changed with idempotent=true和指向Hazelcast的idempotentRepository”没有帮助。文件在下载之前就被使用者拾取。我不知道为什么readLock=changed不起作用。我只是使用两个并行运行的docker容器进行了尝试,它们一直等到写入(在第三个容器中)已完成。可能是文件在两次检查之间没有变化:即,可能需要使用readLockCheckInterval、readLockMinAge等?可能,我将为Camel的Apache用户邮件列表提出一个问题