設計および構築するピザ店の注文処理システムがあるとします。
要件は次のとおりです。
R1. システムは、クライアントやユースケースに依存しない必要があります。これは、初期設計時に考慮されなかったクライアントがシステムにアクセスできることを意味します。たとえば、ピザ屋が後で顧客の多くが Samsung Bada スマートフォンを使用すると判断した場合、Bada OS 用のクライアントを作成するためにシステムの API とシステム自体を書き直す必要はありません。または、たとえば、Android デバイスの代わりに iPad を使用する方が配送ドライバーにとって何らかの方法で優れていることが判明した場合、iPad クライアントを作成するのは簡単であり、システムの API にはまったく影響しません。
R2. 再利用性。これは、ビジネス プロセスが変更された場合に、多くのコードを書き直すことなく、システムを簡単に再構成できることを意味します。たとえば、後でピザ店が配達ドライバーによる現金の受け入れに加えてオンラインでの支払いの受け入れを開始した場合 (注文を受ける前に支払いを受け入れる VS 配達時に支払いを受け入れる)、システムを新しいビジネスプロセスに適応させるのは簡単です。 ;
R3. 高可用性と耐障害性。つまり、システムはオンラインで、24 時間年中無休で注文を受け付ける必要があります。
したがって、R3 を満たすために、Erlang/OTP を使用し、次のアーキテクチャを持つことができます。
ここでの問題は、この種のアーキテクチャには多くの「ハードコーディングされた」機能があることです。たとえば、ピザ屋が配達時の現金支払いから注文前のオンライン支払いに移行すると、システム全体を書き直したり、システムの API を変更したりするのに多くの時間と労力がかかります。
さらに、ピザ屋が CRM クライアントを強化する必要がある場合は、API、クライアント、およびシステム自体を書き直す必要があります。
したがって、次のアーキテクチャは、これらの問題を解決し、R1、R2、および R3 を満たすのに役立つことを目的としています。
システム内の各「サービス」は、RESTful API を備えた Webmachine Web サーバーです。このようなアプローチには、次の利点があります。
- 各 Webmachine は Erlang アプリケーションであり、監視することができ、Erlang リリースに入れることができるため、Erlang/OTP のすべての利点。
- SOA のすべての利点を備えたサービス指向アーキテクチャ。
- ビジネスプロセスの変更に簡単に適応できます。
- クライアントは 1 つの「中央」API (SOA に関するサービスの構成可能性) ではなく、システム内のすべてのサービスの RESTful API を使用できるため、新しいクライアントと新しい機能をクライアント (CRM クライアントなど) に簡単に追加できます。
したがって、基本的に、2 番目の図で提案されているシステム アーキテクチャは、各サービスが WSDL コントラクトの代わりに RESTful API を持ち、各サービスが Erlang/OTP アプリケーションであるサービス指向アーキテクチャです。
そして、ここに私の質問があります:
- 写真 2: ここで車輪の再発明を試みているのでしょうか? 代わりに、純粋な Erlang/OTP アーキテクチャに固執する必要がありますか? (「純粋な Erlang」とは、リリースにパックされた Erlang アプリケーションを意味し、gen_server:call および gen_server:cast 関数呼び出しを介して互いに通信します);
- 提案されたアプローチの欠点を挙げることができますか? (写真2)
- 真の Erlang/OTP システムよりも、このようなシステム (図 2) の維持と拡張 (R1 と R2) の方が簡単だと思いますか?
- このようなシステムのセキュリティ (図 2) は問題になる可能性があります。これは、1 つのエントリ ポイント (図 1) ではなく、多くのエントリ ポイント (すべてのサービスの RESTful API) が Web に対して開かれているためです。そうではありませんか?
- そのようなシステムに複数の「オーケストレーション モジュール」を配置しても問題ないでしょうか。(写真2の「受注」「CRM」「発送」サービス);
- 純粋な Erlang/OTP (図 1) には、メッセージ パッシングとプロトコルの制限に関して、このアプローチ (図 2) よりも利点がありますか? (私の以前の同様の質問、gen_server:call VS HTTP RESTful 呼び出しで部分的に説明されています)