2012-08-03 6 views
7

ピザの配送店にフォールトトレラントなソフトリアルタイムWebアプリケーションを構築したいと考えています。それは、ピザ屋が顧客からの電話を受け取り、注文としてシステムに(CRMウェブクライアントを介して)入れ、ディスパッチャが注文に配送ドライバを割り当てるのを助けるべきである。Erlang/OTPによるフォールトトレラントなソフトリアルタイムWebアプリケーションの構築

これらの目標は珍しいことではありませんが、サービスを24時間いつでも利用できるようにしたい、つまりフォールトトレラントにすることです。さらに、私はそれを非常に速く働かせ、非常に敏感であるようにしたいと思います。

以下は、このようなアプリケーションの非常に単純なアーキテクチャビューです。

pizza delivery shop orders system

問題

は、私は、アプリケーションが非常に即応性と耐障害性にするのErlang/OTPの良さのすべてを使用する方法がわからないということです。ここで

私の質問は以下のとおりです。システム要素は、フォールトトレランスとどのように私はそれを行う必要がありますを提供するために、複製されるべき

  1. ?私は複製されたMnesiaデータベースに各車両のステータス(座標、割り当てられた注文など)を保存できることを知っています。それは正しい方法ですか?
  2. 従来のSQLベース(たとえばboss_dbに基づく)であり、非常に高速な応答を提供するためにMnesiaで実行する必要があるデータストレージサービスはどれですか?このようなフォールト・トレラントで高い応答性のアプリケーションに顧客の記録と履歴を保管するために従来のSQLデータベースを使用するのは問題ありませんか?
  3. アプリケーションに高い応答性を持たせるために、すべてのサービス(顧客、車両ステータスなど)のすべてのデータをRAMに保存する必要がありますか?
  4. 永続的な車両データ(ID、容量など)を従来のSQLデータベースに保存し、リアルタイムデータ(座標、割り当てられた注文、トランク内の注文など)をMnesiaデータベースに保存してアプリケーションはよりリアルタイムに反応しますか?
+1

すべてのアプリケーションのロジックとデータを複製しない場合、たとえば24時間いつでもサービスを24時間365日に行うことができます。 ) –

+0

ロジックを扱うノードが2つ以上あるErlang/OTPシステムでデータを複製する方法についてのリファレンスを提供できますか? – skanatek

+0

プロセスグループ、すべてに送信、競合解決、または単にriak/couchdbを使用してください。それとも、世話に目を向けるのか。しかし、あなた自身でこれを行うことは、本当に難しい作業です。 –

答えて

8

まず第一に、これは大きな疑問ですが、私はそれを打破しようとします。事実を最初に見てみましょう。そのWebサービス。つまり、これらのレイヤーはWeb Server,Middle ware application、次にData Storageです。ほとんどの可用性の高いアプリケーションでは、データストレージレイヤーはreplicationで冗長性を持ち、負荷はDistributionで管理する必要があります。実際のアプリケーションでは、アプリケーションが本質的にリアルタイムでない限り、RAMに何も格納する必要はありません(Multi-player Game ServerA telecom Switchなど)。あなたのアプリケーションの種類は、この場合実際には、RAMストレージの必要はありません(cachingここでは、ここでは見ています)。

ここでは、この種のアプリケーションにはさまざまな種類のデータが含まれています。一度に同じ形式を持つことができない情報は、RDMSを使用することで、すべて同じ方法で配置するように強制します。私の提案は、document oriented databaseNoSQL DBまたはkey-value systemのいずれかを使用することを学ぶことです。実際の複雑さを考慮してモデル化されているからです。あらゆる種類のストレージに関する詳細はpdfにあります。 Couch base serverを使用することをお勧めします。データはJSON documentsschemalessとなり、アプリケーションが大きくなるにつれて進化します。どのアプリケーションでも必要な方法で、配布と複製が可能です。実行時にサーバーを追加したりサーバーを削除したりすることができます。システム全体が再調整されます。また、キャッシュのために組み込まれたmemcachedが付属しているので、あなたが話していたIN-Memoryの部分では、キャッシュはすべてあなたのために行います。

保管の後、ミドルウェアについて話すことができます。私は、Webサーバーについてミドルウェアの一部として話したいと思います。負荷に応じて非常に安定したWebサーバーが必要で、Erlangを使用したいと思っているのですが、があり、appmodsを使用してRESTFUL servicesを実行する方法を学びます。 Webサーバーのクラスタの前にあるNginxのようなプロキシーsunchを使用すると、負荷管理に役立ちます。少なくとも、Webサーバーの負荷を分散するにはいくつかの方法があります。その後、OTPアプリケーションが必要になります。 OTPアプリケーションは、gen_serversを持つ必要はありません。しかし、あなたが学ぶように、実際には並列化が必要な場所、または連続したコードが必要な場所を発見します。しかし、あなたがまだ習得していないものを使いたいと心配しています。 this web bookとこのOrielly bookに従ってください。Erlangに関するすべてのことをマスターするのに役立ちます。 Chicago BossMochiwebまたはMisultin HTTPサーバーライブラリを試してみると便利です。

Erlangでこれを行うことについてもう一つ言わなければならないのは、データ構造とそれらを操作するエフェクト方法をマスターする必要があるということです。不適切なデータ構造の選択は問題を引き起こす可能性があります。各ステップですべてをテストしてテストします。可能であればどこでもrecordsを使用し、各段階でメモリ消費量を確認してください。この質問について多くのことしか言いませんが、うまくいけば、他の人たちも自分の考えを投稿するつもりです。

+0

oreillyの本はlearnyousererlangにリンクされています。それを編集しただろうが、あなたが意味する本が分からない、少なくとも2冊のoreilly本がある;) –

+0

私はリンクを修正した。申し訳ありません。 –

+0

@MuzaayaJoshuaマルチプレイヤーゲームサーバーの場合、データストレージをすべてRAMに保存する最適なアプローチ/ツールは何ですか? – skanatek

2

ハッキングこのゲーム:https://github.com/synrc/games すべてのリアルタイム、低レイテンシ、パブ/サブ、データベース、アーキテクチャに関する質問があり、最先端のソフトウェアとして書かれています。私はgen_fsmを使って、あなたのアプリの状態を「大丈夫」の監督者のように制御することを提案します。 riakはkvs libと統合されており、ソーシャルアップデートのサポートも良好です。 n2o choosedカウボーイサーバー、私の見解では、最高のサーバー周り。 http://www.ostinelli.net/a-comparison-between-misultin-mochiweb-cowboy-nodejs-and-tornadoweb/

関連する問題