Message Queue対Webサービス?[閉まっている]


258

どのような状況で、ウェブサービスではなくメッセージキューを介して話すアプリを好むでしょうか(ここでは、XML、JSON、YAML、またはHTTPを介したもので、特定のタイプではありません)。

ローカルネットワーク上の2つのアプリ間で会話する必要があります。1つはWebアプリであり、別のアプリ(異なるハードウェアで実行)でコマンドを要求する必要があります。リクエストには、ユーザーの作成、ファイルの移動、ディレクトリの作成などがあります。メッセージキューを使用するよりも、どのような状況でXML Webサービス(または単純なTCPなど)を使用しますか?

WebアプリはRuby on Railsですが、問題はそれよりも広いと思います。

回答:


315

Webサービスを使用すると、クライアントとサーバーがあります。

  1. サーバーに障害が発生した場合、クライアントは責任を持ってエラーを処理する必要があります。
  2. サーバーが再び動作しているとき、クライアントはサーバーを再送信する責任があります。
  3. サーバーが呼び出しに応答し、クライアントが失敗した場合、操作は失われます。
  4. 競合はありません。つまり、数百万のクライアントが1つのサーバーのWebサービスを1秒間に呼び出すと、おそらくサーバーがダウンします。
  5. サーバーからの即時応答を期待できますが、非同期呼び出しも処理できます。

RabbitMQ、Beanstalkd、ActiveMQ、IBM MQシリーズ、Tuxedoなどのメッセージキューを使用すると、さまざまなフォールトトレラントな結果が期待できます。

  1. サーバーに障害が発生した場合、キューはメッセージを保持します(オプションで、マシンがシャットダウンした場合でも)。
  2. サーバーが再び稼働すると、保留中のメッセージを受信します。
  3. サーバーが呼び出しに応答し、クライアントが失敗した場合、クライアントが応答を確認しなかった場合、メッセージは保持されます。
  4. 競合が発生し、サーバーが処理するリクエストの数を決定できます(代わりにワーカーと呼びます)。
  5. 即時の同期応答を期待していませんが、同期呼び出しを実装/シミュレートできます。

メッセージキューにはさらに多くの機能がありますが、これは、エラー条件を自分で処理するか、メッセージキューに任せるかを決定するための経験則です。


1
SOAP / JMSバインディングが使用されている場合、Webサービスでの疎結合も得られます。
koppor

サーバー側の複数のマイクロサービスの場合、どちらを優先するWebサービスまたはキューイングにする必要がありますか?
shivendra pratap sing 2017

@sw様 、それは私たちが通常のウェブサイトの前にMQを置くことができることを意味するかどうか知っていてもよいですか?WordpressのWebサイト(LAMPスタック)があるとします。Apacheの前でMQを使用して、リクエストが同時に来るのではなく、1つずつ来るようにできますか?この場合、クライアント(ブラウザ)はApacheではなくMQに接続されていますが、そうですか?しかし、ブラウザはHTTP接続を開いたままにし、Apacheが応答するのを待ち続けますか?これについて少し理解してください。ご親切に感謝します。
夏期劇場

@夏期劇場あなたのユースケースは何ですか?ブラウザを使用してエンドユーザーにメリットをもたらすために何を試みていますか?
sw。

クライアント/サーバーのセットアップに関するこれらの問題は、キューとサーバーの間、およびクライアントとキューの間の問題でもありませんか?クライアント/サーバーのパラダイムがまだ存在し、現在2つの場所にあるようです。
想像者

75

REST HTTP呼び出しがメッセージキューの概念をどのように置き換えることができるかを検討する上で、最近かなりの量の調査が行われました。

プロセスとタスクの概念をリソースとして導入すると、中間メッセージングレイヤーの必要性がなくなり始めます。

例:

POST /task/name
    - Returns a 202 accepted status immediately
    - Returns a resource url for the created task: /task/name/X
    - Returns a resource url for the started process: /process/Y

GET /process/Y
    - Returns status of ongoing process

タスクには初期化のための複数のステップがあり、プロセスはポーリング時にステータスを返すか、完了時にコールバックURLにPOSTすることができます。

これは非常に単純で、中間層なしで実行中のすべてのプロセスとタスクのrss / atomフィードをサブスクライブできることがわかったときに、非常に強力になります。とにかく、キューシステムには何らかのWebフロントエンドが必要であり、この概念には、カスタムコードの別のレイヤーなしで組み込まれています。

リソースは、削除するまで存続します。つまり、プロセスとタスクが完了した後も、履歴情報を表示できます。

複雑なプロトコルを追加することなく、複数のステップがあるタスクであっても、サービスディスカバリを組み込みました。

GET /task/name
    - returns form with required fields

POST (URL provided form's "action" attribute)

サービスディスカバリはHTMLフォームであり、人間が読める形式で普遍的な形式です。

フロー全体は、一般的に受け入れられているツールを使用して、プログラムまたは人間が使用できます。これはクライアント駆動であるため、RESTfulです。Web用に作成されたすべてのツールは、ビジネスプロセスを推進できます。別のログサーバーの配列に非同期でPOSTを実行することで、代替メッセージチャネルがまだあります。

しばらく考えた後、RESTはメッセージングキューとESBの必要性を完全に排除できることを理解し始めます。

http://www.infoq.com/presentations/BPM-with-REST


11
@tempireフォールトトレランスなどはどうですか?RESTは素晴らしいですが、開発者はミドルウェアを自分で構築することになります
Dan Rosenstark 2011年

10
@Yar「これについてはどうですか」に関するほとんどの質問は、「Webではどのように処理されますか?」と言い換えることができます。フォールトトレランスは、ロードバランサーまたはDNSレコードの操作によっても処理できます。水平方向のスケーラビリティなど、解決すべき問題がいくつかあります-Webは本質的にそれをうまく処理しません(たとえば、ddos攻撃)。
テンパイア2011

8
@ tempire、Webでの配信は保証されていませんよね?送信ボタンを押して、メッセージが宛先に届くように祈ります。MQがあれば、MQに到達したら完了です。宛先へのメッセージの取得を処理します。
Dan Rosenstark、2011

10
ただし、「保証付き配信」の意味を考慮してください。メッセージキューの稼働時間と同じくらい「保証」されます。メッセージキューを、タスクとプロセスをリソースとして処理するRESTサーバーで置き換えます。これにより、他のものと同じ「保証」が得られます。基本的に、メッセージキューはまだありますが、Web標準でアクセス可能な形式であり、任意のWebツールを使用して監視できます。
テンパイア

16
@Yar-MQがそのようなことを考慮するほど十分に解決しようとしている問題定義を理解している人は多くないと思います。彼らはMQを理解していますが、それは問題空間を理解することとは異なります。しかし、世界中のほとんどのプログラマーとマネージャーは、エンジニアソリューションではなくピースを接続するように訓練されていると思うので、それは広範囲にわたる問題です。
テンパイア2011

32

メッセージキューは、処理に時間がかかる可能性のあるリクエストに最適です。リクエストはキューに入れられ、クライアントをブロックせずにオフラインで処理できます。クライアントに完了を通知する必要がある場合は、クライアントがリクエストのステータスを定期的に確認する方法を提供できます。

メッセージキューを使用すると、時間をかけてより適切にスケーリングすることもできます。実際の処理を時間全体に分散できるため、重いアクティビティのバーストを処理する能力が向上します。

メッセージキューとWebサービスは直交する概念です。つまり、相互に排他的ではありません。たとえば、メッセージキューへのインターフェイスとして機能するXMLベースのWebサービスを使用できます。あなたが探している違いは、メッセージキューと要求/応答です。後者は、要求が同期的に処理されるときです。


3
はい、私はただこれを考えていました:彼らがブロックしているか非ブロックしているかではありません。処理に時間がかかる、または予測できない時間がかかるかどうかです...それらが直交していることに関しては、Webサービスを長いリクエスト(もちろん、個別のドロップオフとピックアップ)に使用できることも事実です。しかし、メッセージキューの贅沢さを持っている場合、それは良い考えかもしれません。
Dan Rosenstark、2010年

私の新しい質問は、プロセスを同期させたいがタイムアウト時に非同期にしたい場合はどうなりますか?次に、おそらくWebサービスの方が適しているでしょう。
Dan Rosenstark、

27

メッセージキューは非同期であり、配信が失敗した場合は何度も再試行できます。リクエスタが応答を待つ必要がない場合は、メッセージキューを使用します。

「Webサービス」というフレーズは、HTTPを介した分散コンポーネントへの同期呼び出しを思い起こさせます。要求者が応答を返す必要がある場合は、Webサービスを使用します。


1
ありがとう、そうです。「保証付き配送」、それが重要かどうか考えなければなりません。つまり、同期と非同期はある意味で好みのようなものです。明らかに白黒のケースがありますが、巨大な灰色の真ん中もあります。
Dan Rosenstark、

22

一般的に、ブロッキングタスク用のWebサービス(コードを実行する前にこのタスクを完了する必要があります)と非ブロッキングタスク用のメッセージキュー(かなり時間がかかる可能性がありますが、それを待つ必要はありません)。


Webサービスは一方向のメソッドも提供します(@Oneway)。回答を受け取るには、クライアントがWebサービスを提供する必要があります。
koppor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.