2017-07-15 33 views
0

我有一個應用程序,在雲上的兩個不同節點上維護。我在應用程序中有一個調度程序,每5分鐘觸發一次,它在數據庫中執行一些更新操作。如何避免這兩個操作導致數據庫中的異常。有一種應用程序可能知道的方式,其他實例已被觸發或可能在雲代工中發生的任何類型的節點間通信。在多個節點上更新操作併發性

非常感謝

+0

我會研究一種使用面向消息的解決方案的架構。恕我直言,你選擇了一個容易出現困難的架構/實現。 –

+0

還是依賴數據庫中的數據:事務(和隔離級別)來防止同時更新,可能還有一個存儲最後更新的時間戳的列,您可以在執行更新之前檢查它們? – dkoper

+0

該應用程序託管在多個節點上的雲中,並作爲休息服務被調用。所以只有一個節點會響應外部休息呼叫。唯一的挑戰是在應用程序中執行的調度機制。有兩種應用程序可以知道的方式,一種已經啓動了調度過程,另一種則不應該這樣做。換句話說,在兩個不同節點上託管的相同應用程序之間的相互通信。 – IMahajan

回答

0

幾個選項來介意的Cloud Foundry:

  1. 創建一個分佈式的 「鎖定」 與您的數據庫。這可能與數據庫中的表或記錄一樣簡單,即調度程序在執行任何其他操作之前首先檢出。一旦鎖定,調度程序就可以工作。如果它未能獲得鎖定,它會重新進入睡眠狀態。然後當它完成時,它返回鎖。

    如果你有很多工作要做,你可以將它分成不同的部分併爲每個部分鎖定,這樣你就可以將工作分散到不同的實例中。儘管這會變得更加複雜,所以你必須權衡這些額外複雜的優勢,看看它是否值得用於你的用例。

  2. 只在第一個節點上運行調度器。您可以通過查看應用程序實例號來確定第一個節點。 env變量CF_INSTANCE_INDEXVCAP_APPLICATION,其中包含JSON並具有instance_index屬性。對於任一選項,第一個實例的值將爲0。如果它是0,則調度程序運行。如果它大於零,則調度程序不會運行。

希望幫助!

相關問題