让我们想象一下,我们有一个披萨店的订单处理系统设计和建造。
要求是:
R1。 该系统应该是客户端和用例无关的,这意味着该系统可以通过该初始设计过程中未考虑到的客户机进行访问。 例如,如果比萨饼店决定了它的许多客户使用的三星bada智能手机以后,写的Bada OS客户将不需要重写系统的API和系统本身; 或者,例如,如果事实证明,使用的iPad,而不是Android设备是送货司机不知怎么好,那么这将是很容易地创建一个iPad客户端,并不会影响系统的以任何方式API;
R2。 可重用性,这意味着该系统可以在不如果业务流程的变化重写很多代码很容易重新配置。 例如,如果以后的比萨饼店将接受现金送货司机(接受支付采取订单VS接受货到付款的支付之前)一起开始接受网上付款,那么这将是很容易使系统适应新的业务流程;
R3。 高可用性和容错性,这意味着系统应该是在网上,并应接受订单24/7。
因此,为了满足R3,我们可以使用二郎山/ OTP,并具有以下结构:
这里的问题是,这种架构有很多在里面“硬编码”功能。 如果,例如比萨饼店将接受货到付款支付接受在线支付放置订单之前移动,那么它会占用大量的时间和精力来重写整个系统,并修改系统的API。
此外,如果比萨饼店将需要一些措施以加强其CRM客户端,然后再次,我们将不得不重新编写API,客户端和系统本身。
所以,下面的架构旨在解决这些问题,从而帮助满足R1,R2和R3:
系统中的每个“服务”是Webmachine网络服务器与一个RESTful API。 这种方法具有以下优点:
- 二郎/ OTP的所有优度,由于每个Webmachine是一个Erlang应用,其可以被监督,可以被放入一个Erlang释放;
- 服务与所有的面向服务架构的好处 SOA的;
- 容易适应变化的业务流程;
- 易新客户和新的功能添加到客户机(例如在CRM客户端),因为客户端可以(在SOA方面的服务组合性)在系统中使用的所有服务的RESTful API中,而不是一个“中央”的API。
所以,基本上是,在第二图像中提出的系统架构是一种面向服务的架构,其中每个业务具有一个RESTful API而不是WSDL合同并且其中每个服务是一个Erlang / OTP应用程序。
这里是我的问题:
- 图片2:我是想在这里重新发明轮子? 我应该只是单纯的Erlang / OTP架构,而不是坚守? (“纯二郎”是指包装成一个版本的Erlang的应用程序,通过gen_server互相交谈:打电话gen_server:投函数调用);
- 你能说出在建议的方法的任何缺点? (图片2)
- 你觉得它会更容易保持和发展(R1和R2)这样的系统(图2)不是一个真正的Erlang / OTP一个?
- 这样的系统(图2)的安全性可能是一个问题,因为有许多切入点开放网络(所有服务的RESTful API中),而不是只有一个入口点(图1),是不是这样呢?
- 它是确定有几个“策划模块”在这样的系统或者一些更好的做法存在? (“接受订单”,“CRM”和“调度令”上的图片2服务);
- 并纯的Erlang / OTP(图1)具有优于该方法(图2)的任何优点的消息传递的术语和协议的限制? (部分我在以前的类似讨论的问题 ,gen_server:致电VS HTTP REST风格的调用)