簡體   English   中英

使用Erlang / OTP構建容錯的軟實時Web應用程序

[英]Building a fault-tolerant soft real-time web application with Erlang/OTP

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

這些目標並不罕見,但我希望每周7天每天24小時提供服務,即使其具有容錯能力。 此外,我希望它能夠非常快速地工作並且非常敏感。

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

比薩餅送貨店訂單系統

問題是我不知道如何使用所有Erlang / OTP優點來使應用程序具有響應性和容錯性。

這是我的問題:

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

首先,這是一個很大的問題,但我會嘗試將其分解。 讓我們先看一下事實。 它是一個Web服務。 這意味着我們擁有這些層: Web ServerMiddle ware application ,然后是Data Storage 在大多數高可用性應用程序中,數據存儲層必須通過replication實現冗余,並通過Distribution管理負載。 在大多數實際應用程序中,除非應用程序實際上是實時的,否則您不需要在RAM中存儲任何內容,例如Multi-player Game ServerA telecom Switch 所以,你的應用程序,在這種情況下真的,不需要RAM存儲(也許在這里和那里進行某種caching ,正如我們將要看到的那樣。)

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

在存儲之后,讓我們談談中間件。 我想談談Web服務器作為中間件的一部分。 您將需要一個非常穩定的Web服務器,具體取決於負載,並且您想要使用Erlang,我建議使用appmods yaws web server並學習使用它來做RESTFUL服務 使用Proxies sunch作為Web服務器集群前面的Nginx可能有助於負載管理。 至少有幾種方法可以對Web服務器進行負載均衡。 在此之后,您將需要一個OTP應用程序。 OTP應用程序不一定必須有gen_servers 但是,正如您將要學習的那樣,您將真正發現需要並行化的位置或需要順序代碼的位置。 然而,它擔心你想要使用你還沒有掌握的東西。 請按照這本網頁和這本Orielly書來幫助您掌握Erlang的所有內容。 你會發現嘗試Chicago BossMochiwebMisultin Http服務器庫很有用。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM