2016-10-18 38 views
1

我们正试图移动到Apache Camel集群。到目前为止,我们在一个节点上运行并且运行良好。集群中的骆驼readlock策略

一个节点: 我已将readlock策略设置为'changed',它跟踪使用camelLock文件进行的文件更改,并且只有当文件完成下载后,它才会被处理。但骆驼readlock战略'改变'是不鼓励聚类。根据骆驼文件“idempotent”被推荐。这是我用5GB文件测试时发生的情况。

两个节点: 我已将readlock策略设置为'idempotent',它将文件分发给其中一个节点,但骆驼甚至在文件下载完成之前开始处理该文件。

即使在文件下载之前,有没有办法阻止骆驼处理,当readlock策略是幂等的?

回答

1

尽管两个“readLock =改变”和“readLock =幂等”导致文件消费者等待,他们真正解决相当不同的使用情况:虽然“readLock =改变”卫士反对文件不完整(即仍由一些制作者/发送者编写),“readLock = idempotent”防止文件被两个消费者路线读取。有些混淆,他们是由相同的选项解决。

首先,为了解决“改变”的情况:发送者可以被改变,以便它将文件写入一个目录,然后当它完成写入时,它将其复制到由文件消费者监视的目录中?如果这是在你的控制之下,这是一个让操作系统处理事情而不是自己处理它的好方法。 (这不解决多读者的问题)。否则,我建议你恢复到readLock =改变

接下来,在多的读者,一个解决办法是只只有一个节点上的这条路线跑的群集。有时候这可能会破坏集群的目的,但很可能您启动了其他节点来帮助其他一些路由,并且您只需在一个节点上运行此特定路由即可。做这样的事情有点麻烦,因为所有的节点都不再平等,但它仍然是一个可以考虑的选择。最简单的方法是使用某些环境属性来启动一个节点,并将其标记为将处理文件读取的节点...或一些类似的方法。

如果您确实需要多个节点上的路由,您可以使用选项“idempotent = true”启动开始,但这不够好。该选项使用一个存储库,它记录之前已经读过哪些文件,并且默认存储库是内存中的(即每个节点都有自己的存储库)。所以,如果相同的文件实际上被多次接收,并且您希望跳过它,那么默认实现会很有帮助。但是,如果您希望跨节点工作,则必须使用不同的存储库。

一个中央存储库可能是一个数据库。在这种情况下,使用可以使用基于Camel的JDBC或JPA的存储库。或者,你可以使用诸如Hazelcast之类的东西。看到这里你的选择:http://camel.apache.org/idempotent-consumer.html

+0

谢谢大流士。我们在集群中使用hazelcast并且工作得很好,文件仅在集群中的一个节点上进行处理。但是,问题在于readLock设置为idempotent并且发件人发送5GB文件,文件使用者立即或在文件完成下载之前的几秒钟后立即处理它。我们担心网络问题等,如果发件人发送的文件中断,我们的交易状态将不完整。在文件消费者拿起文件之前,希望文件完全下载,就像readLock = changed时发生的那样。 – Arjun

+0

您是否尝试过使用idempotent = true更改readLock =并将idempotentRepository指向Hazelcast? –

+0

在群集上尝试过。这个设置'readLock =用idempotent = true改变,idempotentRepository指向Hazelcast'没有帮助。即使在下载之前,消费者也会收到文件。 – Arjun