7

我想为披萨外卖店构建一个容错的软实时 Web 应用程序。它应该帮助比萨店接受客户的电话,将它们作为订单输入系统(通过 CRM 网络客户端),并帮助调度员为订单分配送货司机。

这些目标并不稀奇,但我想让服务 24/7 可用,即使其具有容错性。此外,我想让它工作得非常快并且反应灵敏。

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

披萨外卖店订单系统

问题是我不知道如何使用 Erlang/OTP 的所有优点来使应用程序非常敏感和容错。

以下是我的问题:

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

2 回答 2

8

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

现在,这种应用程序涉及到不同类型的数据,信息在任何时候都不能具有相同的形式,因此,使用 RDMS 将迫使您以相同的方式安排一切。我的建议是您学习使用 any document oriented database、 aNoSQL DB或,key-value system因为它们针对现实世界的复杂性进行了很好的建模。有关任何类型存储的更多信息,请参见此 pdf。我建议您使用Couch 基础服务器,您的数据将简单地成为JSON documentsschemaless并且可以随着应用程序的增长而发展。它带有分发和复制功能,就像任何应用程序都需要它一样。您可以在运行时添加服务器或删除服务器,整个系统只是不断地重新平衡自己。它还附带memcached内置用于缓存,因此对于您所说的 IN-Memory 部分,缓存将为您完成一切。

说完Storage,再说说中间件。我想谈谈作为中间件一部分的 Web 服务器。您将需要一个非常稳定的 Web 服务器,具体取决于负载,并且您想使用 Erlang,我建议使用yaws Web 服务器并学习使用. 使用代理 sunch 作为Web 服务器集群的前端可能有助于负载管理。至少有几种方法可以在 Web 服务器前进行负载平衡。在此之后,您将需要一个 OTP 应用程序。OTP 应用程序不一定必须具有appmodsNginxgen_servers. 但正如您将学习的那样,您会发现,真正需要并行化的地方或需要顺序代码的地方。然而,它担心你想使用你还没有掌握的东西。请关注这本网络书和这本Orielly 书,以帮助您掌握有关 Erlang 的一切。您会发现尝试Chicago BossMochiweb/或MisultinHttp 服务器库很有用。

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

于 2012-08-03T09:37:26.850 回答
3

破解这个游戏:https ://github.com/synrc/games 所有实时、低延迟、发布/订阅、数据库、架构问题都在那里,编写为最先进的软件。我建议使用 gen_fsm 来控制应用程序中的状态,就像在“好的”主管中所做的那样。riak 与 kvs lib 集成,对社交更新也有很好的支持。n2o 选择了牛仔服务器,在我看来,周围最好的服务器。http://www.ostinelli.net/a-comparison-between-misultin-mochiweb-cowboy-nodejs-and-tornadoweb/

于 2014-11-02T23:23:25.047 回答