使用Erlang/OTP构建容错的软实时Web应用程序

ska*_*tek 7 architecture erlang fault-tolerance real-time erlang-otp

我想为比萨饼送货店建立一个容错的软实时网络应用程序.它应该有助于披萨店接受来自客户的电话,将它们作为订单放入系统(通过CRM网络客户端),并帮助调度员将订单分配给送货司机.

这些目标并不罕见,但我希望每周7天每天24小时提供服务,即使其具有容错能力.此外,我希望它能够非常快速地工作并且非常敏感.

下面是这种应用程序的一个非常简单的架构视图.

比萨饼送货店订单系统

问题是我不知道如何使用所有Erlang/OTP优点来使应用程序具有响应性和容错性.

这是我的问题:

  1. 应该复制哪些系统元素以提供容错,我应该如何做?我知道我可以在复制的Mnesia数据库中存储每辆车的状态(坐标,分配的订单等).这是一个正确的方法吗?
  2. 哪些数据存储服务应该是传统的基于SQL的(例如基于boss_db),哪些应该在Mnesia上完成以提供非常快速的响应?是否可以使用传统的SQL数据库将客户记录和历史记录存储在这样的容错和响应速度快的应用程序中?
  3. 我是否应该尝试将所有服务(客户,车辆状态等)的所有数据存储在RAM中,以使应用程序具有高响应性?
  4. 我应该将持久性车辆数据(id,容量等)存储在传统的SQL数据库中,并将实时数据(坐标,分配的订单,主干中的订单等)存储在Mnesia数据库中,以使应用程序更多实时响应?

Muz*_*hua 8

首先,这是一个很大的问题,但我会尝试将其分解.让我们先看一下事实.它是一个Web服务.这意味着我们必须在这些层:Web Server,Middle ware application然后Data Storage.在大多数高可用性应用程序中,数据存储层必须具有冗余replication和负载管理Distribution.在大多数实际应用程序中,您不需要在RAM中存储任何内容,除非应用程序本质上是实时的,例如a Multi-player Game ServerA telecom Switch.所以,你的那种应用程序,在这种情况下真的,不需要RAM存储(也许某种在caching这里和那里,正如我们将要看到的那样.)

现在,这种应用程序涉及不同类型的数据,信息不能在任何时候都有相同的形式,因此,使用RDMS将迫使您以相同的方式安排所有事情.我的建议是你学习使用任何document oriented database,NoSQL DB或者key-value system因为它们很好地模拟了现实世界的复杂性.有关任何类型存储的更多信息,请参阅此pdf.我建议您使用Couch基本服务器,您的数据将简单地存在JSON documents,schemaless并且可以随着应用程序的增长而发展.它配备了分发和复制,就像任何应用程序需要它一样.您可以在运行时添加服务器或删除服务器,整个系统只是保持自我重新平衡.它还memcached内置了缓存功能,因此对于您所谈论的IN-Memory部分,缓存将为您完成所有工作.

在存储之后,让我们谈谈中间件.我想谈谈Web服务器作为中间件的一部分.您将需要一个非常稳定的Web服务器,具体取决于负载,并且您想要使用Erlang,我建议使用yaws Web服务器并学习使用它来执行RESTFUL服务appmods.使用Proxies sunch作为NginxWeb服务器集群的前沿可能有助于负载管理.至少有几种方法可以对Web服务器进行负载均衡.在此之后,您将需要一个OTP应用程序.OTP应用程序不一定非必需gen_servers.但是,正如您将要学习的那样,您将真正发现需要并行化的位置或需要顺序代码的位置.然而,它担心你想要使用你还没有掌握的东西.请按照这本网页和这本Orielly书来帮助您掌握Erlang的所有内容.你会发现尝试Chicago Boss和/ MochiwebMisultinHttp服务器库很有用.

关于在Erlang中执行此操作,我应该提到的另一件事是,您需要掌握数据结构以及使用它们的有效方法.数据结构选择不当可能会导致问题.在每一步测试和测试一切.records尽可能在任何地方使用并检查每个阶段的内存消耗.关于这个问题还有很多话要说,但希望其他人也会发表他们的想法.

  • 也许这会对你有所帮助:http://jeena.net/t/GGS.pdf但是你应该首先设计你的架构.在每个节点上存储所有内容都无法扩展.而你的逻辑主要问题是玩家的分布和节点间的沟通.您应该对游戏服务器设计进行广泛的研究.看看别人如何解决他们的问题.只有最大限度地减少节点间通信,您的扩展才能真正发挥作用.在最好的情况下,两个erland节点实际上不必彼此通信.每个节点只需要在其节点内的玩家之间进行消息传递. (2认同)