2

我想實施一個分佈式銷售點系統,有點像Point of sale app architecture advice中描述的系統。如何使用Message Broker和數據庫設計分佈式應用程序?

正是有了這些charachteristics分佈式系統:

  • 客戶是關鍵任務,他們應該工作,即使網絡連接或服務器發生故障,但只是幾天左右。
  • 客戶端必須易於安裝。
  • 每個客戶端都有自己的本地嵌入式數據庫。
  • 客戶端和服務器之間的通信使用消息隊列。
  • 該服務器用於備份,簿記,統計和向客戶分發價格。
  • 服務器放置在互聯網上。

我使用JavaDB作爲數據庫在Java Swing中實現客戶端。

我的應用程序應該如何與消息代理和數據庫進行通信?

我從來沒有使用過Message Queues和Message Brokers。我的想法是,應用程序從數據庫中讀取數據,但寫入消息代理,消息代理寫入數據庫並與服務器通信。或者這是一個壞主意?我應該如何解決這個問題?

因此,除了我的嵌入式數據庫,我還需要找到一個消息代理,最好是一個用Java編寫的消息代理,可以嵌入到我的應用程序中,以便於安裝。

+0

我不擅長這個來制定答案。您可能想看看「企業集成模式」(Hohpe,Woolf,Addison-Wesley)。然而,這個要求聽起來很可怕:「即使網絡連接或服務器出現故障,客戶端也應該能夠工作,但只需幾天左右」,「服務器用於分發[...]爲客戶提供價格。「你能保證價格不會改變,即你知道價格預先變化的日期嗎? 「 – mnemosyn 2010-04-06 15:51:09

+0

」我的想法是,應用程序從數據庫中讀取數據,但寫入消息代理,消息代理寫入數據庫並與服務器通信。或者這是一個壞主意?...「 這不是一個壞主意的想法,但你至少應該決定你期望使用哪個消息代理。有些人可能有預製件與數據庫直接對話,否則你也應該在另一邊編碼... – 2010-04-06 16:04:17

+0

@mnemosyn:不,價格變化時沒有日期。價格可以改變,你也可以改變客戶的價格。但是,直到連接重新啓動後,纔會將其分發給其他客戶端。 – Jonas 2010-04-06 16:19:53

回答

4

在純技術層面上,這可能是一個好點開始:http://java.sun.com/products/jms/tutorial/

你也絕對應該拿到書的副本,「企業集成模式」這解釋了所有可以使用的排隊系統中的各種方式。

從你的描述,我設想了以下模式是有用的(對不起,不知道在書中所使用的術語,因爲我沒有它現在製作了我自己。):

  • 發佈訂閱:服務器將發佈消息(例如更新價格信息),該消息被傳遞給訂閱該類信息的所有客戶端。您需要覆蓋的一個重要案例是,在您的客戶端在此類廣播期間斷開連接時,會發生什麼情況。你必須確保它不會錯過任何信息,或有辦法再次趕上。

  • 失火和遺忘:一個通信夥伴(例如客戶端)會發送一條消息,而不會期待任何形式的響應。排隊系統將負責最終交付。這可以用於提交訂單等。

  • 回電:這就像兩個或更多的火災和忘記消息在相反的方向。隨後的呼叫將有一個ID,以便將該消息標記爲對之前收到的特定消息的響應。提交訂單時這很有用,但需要某種答案。當然,答案可能會在一天後到達,因此您需要一份未完成訂單列表,這些列表可能應該對用戶可見,或者列表支持個人。發送多個回覆時,您必須處理不按順序到達的郵件的情況。如果可能,處理這個問題的好方法是在每條消息中包含早期消息的所有信息。這樣你可以簡單地丟棄舊信息。

所以通信會像這樣工作: - 服務器偶爾更新發送到所有客戶端。消息可能應該包含某種版本信息,因此客戶端可以確保它們具有所有消息。 - 定期(或aftger從服務器接收一段時間沒有更新或...)客戶端請求來自服務器的特殊更新,以確保它具有所有當前信息。上面提到的版本信息可用於識別缺失的信息 - 客戶端收到消息並將內容存儲在本地數據庫中 - 客戶端從數據庫中讀取信息以向用戶提供信息 - 客戶端提交訂單或任何時間服務器,可能接收不同步的回答

一些普遍性的建議:

隨着排隊你在地獄併發的中間。所以,對所有可能出現「錯誤」的東西進行創意。例子是 - 郵件到達不按順序 - 發送時接收器不可用(這也是首先使用郵件的原因) - 接收器不可用並且不會返回在線狀態。消息傳遞服務器有保證傳遞的選項。這意味着他們必須存儲消息直到實際發送消息。如果客戶永遠不會回到在線狀態,則郵件將永遠保留,填滿存儲空間

確保所有郵件處理與應用程序的其餘部分完全分離,以便於測試。

思考升級服務器和客戶端的過程,特別是當消息格式發生變化時。您或者必須在相同的時間點升級所有時間,或者您的服務器必須能夠處理一段時間的新舊消息格式。

+0

謝謝你的回答!您對我的計劃有何看法,即應用程序從數據庫中讀取並寫入消息代理,並且代理將其寫入數據庫並與服務器通信? – Jonas 2010-04-08 10:29:12

+0

合理的聲音是一個基本的想法。當然,你會發現許多問題與細節有關,但是對於所有應用於不可靠網絡連接的方法來說都是如此。 – 2010-04-08 18:33:04