我想为披萨外卖店构建一个容错的软实时 Web 应用程序。它应该帮助比萨店接听顾客的电话,将它们作为订单放入系统(通过 CRM 网络客户端),并帮助调度员为订单分配送货司机。
这些目标并不罕见,但我想让该服务 24/7 可用,即使其具有容错性。此外,我想让它工作得非常快并且 react 灵敏。
下面是此类应用程序的一个非常简单的架构 View 。
问题是我不知道如何使用 Erlang/OTP 的所有优点来使应用程序非常敏感和容错。
以下是我的问题:
最佳答案
首先,这是一个很大的问题,但我会尽量分解它。让我们先来看看事实。它是一个网络服务。这意味着我们有这些层:Web Server
, Middle ware application
然后 Data Storage
.在大多数高可用应用程序中,数据存储层必须通过 replication
具有冗余性。并通过 Distribution
管理负载.在大多数实际应用程序中,您不需要在 RAM 中存储任何内容,除非应用程序本质上是实时的,例如 Multi-player Game Server
或 A telecom Switch
.所以,你的应用程序,在这种情况下,真的不需要 RAM 存储(可能是某种 caching
在这里和那里,正如我们将要看到的。)现在,这种应用程序涉及不同类型的数据,任何时候都不能具有相同形式的信息,因此,使用 RDMS 将迫使您以相同的方式安排所有内容。我的建议是你学会使用任何 document oriented database
, NoSQL DB
或 key-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
很有用和 Mochiweb
或 Misultin
Http 服务器库。关于在 Erlang 中执行此操作,我应该提到的另一件事是,您需要掌握数据结构以及使用它们的有效方法。数据结构选择不当可能会导致问题。在每一步测试和测试一切。使用 records
尽可能在任何地方检查每个阶段的内存消耗。关于这个问题有很多话要说,但希望其他人也能发表他们的想法。
关于architecture - 使用 Erlang/OTP 构建容错软实时 Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11790547/