Erlang容错应用程序:CAP的PA或CA?

ska*_*tek 6 erlang couchdb mnesia erlang-otp cap

我已经问了一个问题,关于一个简单的容错软实时网络比萨饼店交付应用.

在此输入图像描述

我在那里得到了非常好的评论和答案,但我不同意这是一个真正的网络服务.它不仅仅是一种网络服务,它更像是一个实时系统来接受客户的订单,控制这些订单的调度并控制实时交付这些订单的车辆.

此外,与"真正的"网络服务不同,这个系统不是为了拥有许多用户 - 只有少数调度员(电话运营商)和一些将使用它的交付驱动程序(因为现在我没有要求提供直接访问)为实际客户提供服务;只有调度员和交付司机才能直接访问).

因此这个问题有点笼统.

我发现,为了做出正确的选择,为我所要做的这个应用程序的第一件事NoSQL数据存储选项之间做出选择CA,PACP根据CAP定理.

现在,使用Erlang构建Web应用程序的书称"虽然它[Mnesia]不是SQL数据库,但它是一个像SQL数据库一样的CA数据库.它不会处理网络分区".同一本书说CouchDB数据库是一个PA数据库.

考虑到这一点,我认为我需要对我的应用程序做的第一件事是确定"容错"术语对CAP的意义.

我的简单要求是使应用程序24/7(R1)可用.另一个是没有必要扩展,应用程序将拥有非常适量的用户(可能无法拥有数千个调度程序)(R2).

现在,R1是否要求应​​用程序提供一致性,可用性和分区容差以及具有哪些优先级?

什么类型的数据存储选项将更好地处理以下问题:

  1. 为调度员(接受客户电话和使用CRM的人)提供24/7可用性,以查找客户记录并将订单输入系统;
  2. 查看当前正在进行的服务订单及其状态(放置,烘焙,发送,交付,交付)实时;
  3. 实时跟踪所有工作车辆的位置及其有效载荷;
  4. 在系统崩溃或网络崩溃后恢复系统的任何部分以继续提供1,2和3;

总结一下:什么样的数据存储(CA,PA或CP)将更好地适应上述系统?什么样的数据存储能更好地满足R1要求?

Tob*_* P. 4

  • 对于您的 24/ 要求,您正在搜索具有(高)可用性的数据库,因为您希望您的请求每次都成功(即使它们只是错误结果)。
  • 当您没有分区容错能力时,netsplit 会导致整个系统瘫痪
  • 一致性固然很好,但你只能拥有 3 个中的 2 个。

PA 解决方案是您最好的选择。我强烈推荐受 Amazon Dynamo 启发的解决方案。最著名的 dynamo 实现是 riak 和 couchdb。Riak 甚至允许您通过调整读写副本将 PA 更改为其他形式。