2012-08-03 62 views
7

我想爲比薩餅店提供一個容錯軟實時Web應用程序。它應該幫助披薩店接受客戶打來的電話,將它們作爲訂單放入系統(通過CRM網絡客戶端),並幫助調度員爲訂單分配送貨司機。用Erlang/OTP構建容錯軟實時Web應用程序

這些目標沒有什麼特別之處,但我希望能夠全天候提供服務,即使其具有容錯功能。此外,我想讓它工作得非常快,並且非常快速。

下面是這種應用程序的一個非常簡單的體系結構視圖。

pizza delivery shop orders system

的問題是,我不知道如何使用所有的Erlang/OTP善良,使應用程序非常敏感和容錯。

這裏是我的問題:

  1. 哪個系統要素應以提供容錯和我應該怎麼做,被複制?我知道我可以將每輛車的狀態(座標,分配的訂單等)存儲在Mnesia複製數據庫中。這是一條正確的路嗎?
  2. 哪些數據存儲服務應該是傳統的基於SQL的(例如基於boss_db),哪些數據存儲服務應該在Mnesia上完成以提供非常快速的響應?使用傳統的SQL數據庫來存儲客戶記錄和歷史記錄在一個容錯和高度響應的應用程序中是否可行?
  3. 我是否應該嘗試將所有服務(客戶,車輛狀態等)的所有數據存儲在RAM中,以便使應用程序具有高度響應性?
  4. 我應該在常規SQL數據庫中存儲持久車輛數據(id,容量等),並將實時數據(座標,分配的訂單,訂單等)存儲在Mnesia數據庫中該應用程序更實時響應?
+1

如果您沒有複製您的所有應用程序邏輯和數據,您將如何在24小時內全天候提供服務。數據庫服務器故障;) – 2012-08-03 11:55:49

+0

您能否提供一個關於如何在具有2+節點處理邏輯的Erlang/OTP系統中複製數據的參考? – skanatek 2012-08-07 07:43:59

+0

進程組,發送給所有的衝突解決方案或僅使用riak/couchdb。或者你看看mnesia。但是,通過你自己來做這件事將是一件非常艱鉅的任務。 – 2012-08-07 12:05:56

回答

8

首先,這是一個很大的問題,但我會盡力分解它。讓我們先看看事實。它是一個Web服務。這意味着我們有這些層次:Web Server,Middle ware application然後Data Storage。在大多數高度可用的應用程序中,數據存儲層必須通過replication具有冗餘,並通過Distribution管理負載。在大多數現實世界的應用程序中,除非應用程序真的是實時應用程序,否則不需要在RAM中存儲任何內容,例如Multi-player Game ServerA telecom Switch。因此,在這種情況下,您的應用程序實際上並不需要RAM存儲器(可能是某種caching,因爲我們將會看到)。

現在,這種應用程序涉及不同類型的數據,信息在任何時候都不能具有相同的形式,因此,使用RDMS將迫使您以同樣的方式安排一切。我的建議是,您學會使用任何document oriented databaseNoSQL DBkey-value system,因爲它們很好地模擬了現實世界的複雜性。有關任何類型存儲的更多信息,請參閱此pdf。我建議您使用Couch base server,您的數據將簡單地變爲JSON documentsschemaless,並可隨着應用程序的增長而發展。它配有分發和複製,就像任何應用程序需要它的方式一樣。您可以在運行時添加服務器或刪除服務器,並且整個系統會自行重新進行平衡。它還內置了用於緩存的memcached,因此對於您正在討論的IN-Memory部分,緩存將爲您做所有事情。

存儲之後,讓我們談談中間件。我想談談作爲中間件的一部分的Web服務器。您將需要一個非常穩定的Web服務器,具體取決於負載,並且您希望使用Erlang,我建議yaws web server並學習如何使用appmods執行RESTFUL services。使用代理服務器作爲Nginx,可以幫助進行負載管理。至少有幾種負載平衡Web服務器的方法。在此之後,您將需要一個OTP應用程序。 OTP應用程序不必必須具有gen_servers。但是,正如你將要學習的那樣,你會發現,實際上,你需要並行化的地方,或者你需要順序代碼的地方。然而,它擔心你想使用你還沒有掌握的東西。請按照this web bookOrielly book來幫助你掌握關於Erlang的一切。您可能會發現嘗試使用Chicago BossMochiwebMisultin Http服務器庫很有用。

另一件我應該提到的在Erlang中做這件事的是,你需要掌握你的數據結構和一個有效的方法來處理它們。數據結構選擇不當可能會導致問題。在每一步測試和測試一切。如果可能的話,在任何地方使用records,並檢查每個階段的內存消耗情況。關於這個問題有很多要說的,但希望其他人也會發表他們的想法。

+0

oreilly的書與learnyousomeerlang相關。本來會編輯它的,但我不知道你的意思是哪本書,至少有2本oreilly書;) – 2012-08-03 11:53:53

+0

我修復了這個鏈接。對不起,關於 – 2012-08-05 14:24:12

+0

@MuzaayaJoshua在多玩家遊戲服務器的情況下,使數據存儲器將所有內容存儲在RAM中的最佳方法/工具是什麼? – skanatek 2012-08-07 07:32:03

2

破解此遊戲:https://github.com/synrc/games 所有實時,低延遲,pub/sub,數據庫,體系結構問題都在那裏,作爲最先進的軟件編寫。我建議使用gen_fsm來控制應用程序中的狀態,就像在'好的'主管完成的一樣。 riak與kvs lib集成,對社交更新也有很好的支持。在我看來,選擇牛仔服務器是最好的服務器。 http://www.ostinelli.net/a-comparison-between-misultin-mochiweb-cowboy-nodejs-and-tornadoweb/