2016-10-18 105 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