我想建立一个比萨饼递铺容错软实时的Web应用程序。 它应该帮助比萨饼店,接受客户的电话,把他们当成订单进入系统(通过CRM Web客户端),帮助调度员指派送货司机的订单。
这些目标是没有什么不寻常,但我愿作全天候提供服务,也就是使其容错。 此外,我想使它非常快的工作,是非常敏感的。
下面是对于这样的应用的非常简单的结构图。
问题是,我不知道如何使用所有的Erlang / OTP善良,使应用程序非常敏感和容错。
这里是我的问题:
- 哪个系统要素应以提供容错和我应该怎么做,被复制? 我知道我可以每个车辆的状态(坐标,分配的订单等)存储在复制的Mnesia数据库。 那是一个正确的方式去?
- 其中数据存储服务应该是传统的基于SQL的(例如基于boss_db ),并应在Mnesia的完成提供了非常快的响应? 它是确定使用传统的SQL数据库存储在这样一个容错和高度敏感的应用的客户记录和历史记录?
- 我应该尝试在RAM中的所有服务(客户,车辆状态等)中的所有数据存储,以使应用程序高度敏感?
- 我应该持久车辆数据(ID,容量等)存储在传统的SQL数据库,并存储实时在一个Mnesia数据库中的数据(坐标,分配的订单,订单树干,等等),使应用程序更实时响应?
首先,这是一个很大的问题,但我会尝试打破它。 让我们以事实先看看。 它是一种网络服务。 这意味着我们必须在这些层: Web Server
, Middle ware application
,然后Data Storage
。 在大多数高度可用的应用程序,数据存储层必须通过冗余replication
和负载通过管理Distribution
。 在大多数现实世界的应用程序,你会不会需要存储在RAM中任何东西,除非应用程序真的是实时性质的,比如Multi-player Game Server
或A telecom Switch
。 所以,你的一种应用,在这种情况下确实,无需RAM存储(也许某种caching
在这里和那里,因为我们将要看到的。)
现在,这种应用,涉及到不同类型的数据,信息不能有相同的形式,在任何一个时间,因此,使用关系数据库管理系统将迫使你安排好一切以同样的方式。 我的建议是,你要学会使用任何document oriented database
,一个NoSQL DB
或key-value system
,因为它们是很好的模拟真实世界的复杂性。 任何类型的存储更多信息,这是发现的PDF格式 。 我建议你使用沙发基础服务器 ,其中您的数据将仅仅是JSON documents
, schemaless
,并为您的应用程序的增长可演变。 它配备了分发和复制,只是任何应用程序曾经需要它的方式。 您可以添加服务器或删除服务器,在运行时,整个系统只是不断再平衡本身。 它还配备了memcached
内置缓存,所以在内存中的一部分,你在谈论,缓存会为你做的一切。
蓄水后,让说说中间件。 我想谈的web服务器作为中间件的一部分。 您将需要一个非常稳定的Web服务器,根据负载,并且是要使用二郎山,我建议雅司病web服务器 ,并学做RESTful服务使用它appmods
。 使用代理sunch为Nginx
网络服务器集群的盈方可能有助于负载管理。 ATLEAST有Web服务器的负载均衡盈的几种方法。 在此之后,您将需要一个OTP应用。 一个OTP应用亘古不变的必需要有gen_servers
。 但正如你将学习,你会发现,真的,你需要并行化或者需要顺序代码。 它然而,令人担忧的是,你要使用的东西,你还没有掌握。 请按照这个网页的书 ,这Orielly书 ,帮助您掌握有关Erlang的一切。 你可能会发现它有用尝试Chicago Boss
和Mochiweb
或Misultin
HTTP服务器库。
另一件事我应该提到关于在二郎山这样做的是,你需要掌握你的数据结构,并与他们一起工作的effcient方式。 数据结构的选择不当可能会引起问题。 试验的每一步测试一切。 使用records
无处不如果可能的话,在每个阶段检查内存消耗。 只是有很多要说这个问题,但我希望,其他人也将会发表他们的想法。
破解这个游戏: https://github.com/synrc/games所有实时,低延迟的pub / sub,数据库架构的问题都在那里,写为国家的最先进的软件。 我建议使用的gen_fsm控制状态在您的应用程序,如“好”监督员进行。 了Riak集成了KVS lib中,有对社会的更新也有很好的支持。 N2O选用牛仔服务器,在我看来,最好的服务器周围。 http://www.ostinelli.net/a-comparison-between-misultin-mochiweb-cowboy-nodejs-and-tornadoweb/