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

标签 architecture erlang real-time otp fault-tolerance

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

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

下面是此类应用程序的一个非常简单的架构 View 。

pizza delivery shop orders system

问题是我不知道如何使用 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 ServerA telecom Switch .所以,你的应用程序,在这种情况下,真的不需要 RAM 存储(可能是某种 caching 在这里和那里,正如我们将要看到的。)现在,这种应用程序涉及不同类型的数据,任何时候都不能具有相同形式的信息,因此,使用 RDMS 将迫使您以相同的方式安排所有内容。我的建议是你学会使用任何 document oriented database , NoSQL DBkey-value system因为它们很好地模拟了现实世界的复杂性。有关任何类型存储的更多信息,请参见此 pdf .我建议你使用 Couch base server您的数据将只是 JSON documents , schemaless并且可以随着您的应用程序的增长而发展。它带有分发和复制功能,就像任何应用程序都需要它一样。您可以在运行时添加服务器或删除服务器,整个系统只会保持重新平衡。它还带有 memcached内置缓存,因此对于您正在谈论的 IN-Memory 部分,缓存将为您做一切。在 Storage 之后,让我们谈谈中间件。我想将 Web 服务器作为中间件的一部分来讨论。您将需要一个非常稳定的 Web 服务器,具体取决于负载,并且如果您想使用 Erlang,我建议 yaws web server学做RESTFUL services与它一起使用 appmods .使用代理作为 Nginx Web 服务器集群的前面可能有助于负载管理。至少有几种方法可以在 Web 服务器前面进行负载平衡。在此之后,您将需要一个 OTP 应用程序。 OTP 应用程序不必具有 gen_servers .但是正如您将学习的那样,您会真正发现哪些地方需要并行化或哪些地方需要顺序代码。然而,它担心你想使用你还没有掌握的东西。请关注 this web book而这个 Orielly book帮助你掌握关于 Erlang 的一切。您会发现试用 Chicago Boss 很有用和 MochiwebMisultin Http 服务器库。关于在 Erlang 中执行此操作,我应该提到的另一件事是,您需要掌握数据结构以及使用它们的有效方法。数据结构选择不当可能会导致问题。在每一步测试和测试一切。使用 records尽可能在任何地方检查每个阶段的内存消耗。关于这个问题有很多话要说,但希望其他人也能发表他们的想法。

    关于architecture - 使用 Erlang/OTP 构建容错软实时 Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11790547/

    相关文章:

    php - 将 NodeJS Realtime 与现有 PHP 应用程序集成

    real-time - Asterisk:调用文件和实时

    gps - GPS跟踪中的数据优化

    objective-c - 具有运行到完成语义的 KVO - 这可能吗?

    gcc - 什么是计算机科学中的目标架构?

    erlang - 从 Erlang 中的 RSA 私钥生成 x509 公钥

    database - 与存储系统性质相关的大容量存储图像格式

    javascript - 通过cordova部署时,服务器端meteor代码在哪里运行?

    jquery - 支持网络和移动应用程序的架构方法

    erlang - 为什么可以在 Erlang 中创建对同一进程的多个监视器引用?