2013-05-30 9 views
34

少しの背景。サービス指向アーキテクチャ - AMQPまたはHTTP

非常に大きなモノリシックなDjangoアプリケーションです。すべてのコンポーネントが同じデータベースを使用します。残りの部分に影響を与えずにシステムの一部を個別にアップグレードできるように、サービスを分離する必要があります。

私たちはRabbitMQをCeleryのブローカーとして使用しています。 RESTインターフェースを使用して

  1. HTTPサービス:

    今、私たちは2つのオプションがあります。イベントループサービスへ

  2. AMQPを超えるJSONRPC

それは、彼らが精通しているが、私はAMQP上でRPCを使用することの利点は、はるかにそれを上回る考えるものだから私のチームは、HTTPに傾いています。

AMQPは、メッセージ配信を保証しながら、ロードバランシングと高可用性を簡単に追加できる機能を提供します。 HTTPで私たちはRESTインタフェースで動作するようにクライアントのHTTPラッパーを作成する必要がありに対し

、我々は、ロードバランサに入れて、私ができるなどHA AMQPで

を持っているために、そのインフラストラクチャを設定する必要がちょうどサービスの別のインスタンスを生成すると、他のインスタンスと同じキューに接続し、bam、HA、およびロードバランシングに接続します。

私はAMQPに関する私の考えで何かを見逃していますか?一般 - まず

答えて

66

は、

  • REST、RPC - アーキテクチャパターン、AMQP - ワイヤーレベルおよびHTTP - 際にHTTPアプリケーションプロトコルTCP/IP
  • の上で動作
  • AMQPは、特定のプロトコルであります-purposeプロトコルは、このように、HTTPは、HTTPの自然はあなた次第であり、それはインフラに依存する形式、
  • RESTとRPCの使用データのシリアル化の両方の同期です
  • AMQP自然が非同期であるAMQPと比較いまいましい高いオーバーヘッドがあります。あなたがどこでもPythonを使用しているなら、私はあなたがPythonネイティブのシリアル化を使うことができると思います - pickleこれはJSONやその他のフォーマットより高速でなければなりません。 HTTP + RESTやAMQP + RPC、答えはインフラの本当に主題である:HTTP + RESTとAMQP + RPCの両方が使用するものを選択しているのであれば、異種および/または分散環境

で実行することができます

  • 複雑さとリソースの使用。特定の要件がなければ、両方のソリューションが正常に動作しますが、私はむしろそれらを透過的に切り替えることができるようにいくつかの抽象化を行います。

    チームにはHTTPに精通しているが、AMQPには慣れていないと言われました。開発時間が重要な時間であれば、答えが得られます。

    複雑さを最小限に抑えてHAインフラストラクチャを構築したい場合は、AMQPプロトコルが必要です。

    私はそれらの両方の経験を持っていたとRESTfulなサービスの利点は次のとおりです。

    • 彼らは
    • 人々が原因一般的に(デバッグに簡単に
    • それらに精通しているWebインターフェイス上でよくマッピングされましたHTTP目的)
    • サードパーティのサービスにAPIを簡単に提供します。 AMQPベースのソリューションの

    利点:いまいましい速い

    • 柔軟
    • が簡単にスケールする保守が容易
    • (リソースの使用状況の意味での)費用対効果の高い

    RESTはプロトコルではなくパラダイムですが、AMQPベースのAPIの上にサードパーティのサービスにRESTfulなAPIを提供することができますが、AQMP RPC APIの構築について考える必要があります。私はこの方法でAPIを外部サードパーティサービスに提供し、古いコードベース上で実行されるインフラストラクチャの部分、またはAMQPサポートを追加できない部分にAPIへのアクセスを提供しました。

    あなたの質問は、エンドユーザーにAPIを提供する方法ではなく、ソフトウェアのさまざまな部分間のコミュニケーションをよりうまく構成する方法です。

    あなたが負荷の高いプロジェクトをお持ちの場合、RabbitMQは素晴らしいソフトウェアであり、異なるマシン上で実行される任意の数のワーカーを簡単に追加できます。また、それはミラーリングし、クラスタ化しています。さらにもう一つ、RabbitMQは、信頼性が高く安定したプラットフォームであるErlang OTPの上に構築されています(bla-bla-bla)。マーケティングだけでなくエンジニアにとっても優れています。 nginxログでRabbitMQが実行されているのと同じパーティション上のすべてのディスクスペースを占有したときに、RabbitMQに問題が発生しました。

  • +3

    私たちはHTTP/RESTに行くことになりました。私は本当に私たちのアーキテクチャにうまく収まるので、AMQPルートに行きたいと思っていましたが、私のチームは新しいものを試してみたいと思っていませんでした。 AMQPとRPCの代わりにHTTPを使用して、還元剤と高可用性SOAシステムを開発するには、はるかに多くの作業が必要です。 – jreid42

    +1

    @pinepain AMQPを使用すると、実際にHTTPを使用していない場合(リクエスト/レスポンス方式で作業中)の宛先にメッセージをプッシュすることができるということが1つのことだと思いますが(修正してください) – rayman

    +0

    @rayman HTTPとAMQPは私はそのような基準をその比較に使用したくないと思います。 – pinepain

    13

    解決策の皮肉なことには、AMQPまたは他のMQソリューションが、HTTP専用サービスの固有の信頼性を失うことを防ぐために使用されることがよくあります - 一定のレベルのタイムアウトを提供するために&リトライロジックとメッセージ永続性呼び出し側は独自のHTTP絶縁コードを実装する必要はありません。信頼性の高いAMQPコア上の非常に薄いHTTPゲートウェイまたはアダプタ層で、JSONRPCなどのより信頼性の高いクライアントプロトコルを使用してAMQPに直接移行するオプションは、このシナリオではしばしば最適なソリューションです。

    関連する問題