MQ現在主流の製品
1.ZeroMQ
最速のメッセージキューイングシステム、高スループットのシナリオのための特定の需要として知られています。
メッセージキュー、多くのコードを開発する必要性として使用する場合は、スケーラブル、C言語を使用して柔軟な開発は、実際には再パッケージ化されたソケットライブラリです。ZeroMQは、マシンダウンした場合、データが失われること、唯一の非永続キューを提供します。送信データストリームとしてストームZeroMQを使用しており、ツイッター。
2.RabbitMQ
AMQP、XMPP、SMTP、ストンプ、それはそれは非常にヘビー級になるように、また真であるエンタープライズクラスの開発に適している:Erlangの並行は、言語自体の利点を組み合わせ、我々は多くのプロトコルをサポートしています。
パフォーマンスの向上が、二次開発とメンテナンスを行うことが助長されていません。
3.ActiveMQ
歴史的なオープンソースプロジェクトは、Apacheのサブプロジェクトです。多くの製品ではJMS1.1仕様を達成するために適用されている、軽量、さまざまなプロトコルを達成するために簡単に統合春-JMSないことができ(RocketMQ以上のソースコード)、サポートがより多くのために、データベースにキューの数を持続しました状況が良いサポートではありません。
4.Redis
MQとして使用することができますニュースサブスクリプションサービスを提供するメモリベースのデータベースとして、KV、以下のアプリケーション例、および不便な拡張があります。チームと運用チームのRabbitMQとRedisのために、100万回を実施し、10万記録された実行時間に一度。
試験データは、データ128バイト、512バイト、1K 10Kと4種類のサイズに分割されています。
実験は:パフォーマンスデータは、Redisの比較的小さいチームは、RabbitMQのよりも高く、かつデータサイズが10Kを超える場合、Redisのは耐えられない遅い缶があるとき、チームは関係なく、データサイズの、Redisのは非常に良好なパフォーマンスを示してきたとき、しかし、チームのパフォーマンスのRabbitMQはRedisのよりもはるかに低いです。
5.Kafka / Jafka
カフカは、Apacheのサブプロジェクトである、高性能クロスランゲージは、メッセージキューイングシステムをパブリッシュ/サブスクライブに分散され、そしてJafkaはカフカのハッチが来る上、カフカのアップグレード版であるということです。
これは、次の特性があります。
- 急速な持続性は、メッセージは、オーバーヘッドのO(1)で永続的であってもよいです。
- 率スループット共通のサーバ上の高スループットを達成することができるいずれかの10W / sの、完全分散型システム、ブローカー、プロデューサー、消費者は自動的に配布、自動負荷分散のためのネイティブ・サポートを備えています。
- 支持Hadoopのデータは、ログデータとのHadoopシステムのオフライン分析用と同じ、並列に制限をロードしなくリアルタイム処理を必要とし、これは実行可能な解決策です。
- オンラインとオフライン処理するHadoopの統一メッセージのパラレルローディング機構によるカフカ。ActiveMQのにはApacheカフカの相対は、非常に良好な性能の外、または良い仕事分散システムに加えて、非常に軽量なメッセージングシステムです。
あなたは、メッセージキューが必要ないとき
あなたは、それが最初に考慮されるための必要性をメッセージ・キューを使用する必要がある場合。
:あなたは多くの、最も一般的な種類があるMQシーンを使用することができます
- ビジネスを行うのデカップリング
- 最終的一貫性
- 放送
- フロー制御をシフトピーク負荷
あなたは、ビジネスロジックの処理結果に強い整合性、フォーカスを必要とする一方、RPCがより適切です。
メッセージキューの使用シナリオ
1.デカップリング
デカップリングは、最も本質的な問題を解決するためのメッセージ・キューです。話すのは、いわゆるデカップリング、簡単なポイントは、唯一のプロセスのコアに興味がある、トランザクションです。他のシステムに依存する必要がありますが、物事は結果を待たずに、通知する必要はそれほど重要ではありません。換言すれば、モデルメッセージベースのケアではなく、「通知」である「治療」。
例として、オーダーシステム上で、最終的な支払いはどのような成功を統合した後、ユーザーにテキストメッセージを送信する必要があるかもしれ注文が、実際には、これは我々のシステムのコアプロセスではありませんアップ。
外部システムの不足ペース(例えばSMSゲートウェイスピードなどは良くない)場合には、時間が多くのユーザーの主な流れは、結果を確認するには良い数分を持っているためにクリックを支払うのは嫌だ長くなります。その後、我々は唯一のSMSシステムに通知する必要があり、それはすぐに処理を完了するのを待つ必要はありません「私たちは、成功を支払いました」。
2.最後の一貫性
最終的な一貫性がを指し、成功か失敗のどちらか、一貫性のある二つのシステムの状態。
もちろん、そこに時間制限は、理論的には、早いほど良いが、実際にはさまざまな例外の場合には、最終ステータス合意に達するために、いくつかの遅延が発生する場合がありますが、最後の二つのシステムの状態は同じです。
次のようなメッセージキューから生まれた「結果整合性」、のようないくつかの産業
- 通知(アリ)
- QMQ(どこへ行く)など
それが設計された、信頼性の高い取引がシステムに通知することです。
銀行への移転需要を転送し、結果整合性のプロセスを理解するためには、お金を控除する制度が成功した場合、システムBプラスお金が成功する必要があり、非常に簡単です。何事もなかったようにそれ以外の場合は、一緒にロールバックします。
しかし、このプロセスは、多くの可能な事故があります。
- 成功した控除金、コールマネープラスBのインターフェイスが失敗します。
- 成功は成功したものの、お金、コールマネープラスBのインターフェイスを控除したが、異常タイムアウトによるネットワークの最終結果を得ます。
- 成功した控除金は、Bプラスお金が失敗し、控除はお金が、マシンダウンAマシンをロールバックしたいと思います。
目に見える、そう簡単ではありません本当に、本当に製この一見単純なことをしようとしています。
すべてのVM間の一貫性、ビューの一般的なソリューションの技術的な観点からは、次のとおりです。
- 強い一貫性、分散トランザクションが、あまりにもハードとコストがかかりすぎる上陸したが、後に具体的に言及されます。
- 主に「記録」と「補償」のアプローチと結果整合性、。物事の不確実性、まず最初に記録した後、不確実な何かをのすべてを行う前に、その結果は次のようになります。成功、失敗、または不確実な、「不確実」(タイムアウトなど、など)の障害と同等であり。成功はクリーンアップする事を記録することができ、そしてすべてのものは、それが成功するまで、再び再係合するように失敗に失敗し、不確実性のために、定期タスクなどに頼ることができます。
- 戻る前の例に、Bを与えるために、成功した場合には、お金のAシステムを控除「予告」それはライブラリに記録されている(システムの最高の信頼性を保証するために、これら二つのお金プラスお金を控除Bと成功を通知することができますでローカルトランザクションで維持もの)、通知が正常にこのレコードを削除され、通知が失敗した場合や不確実なタスクは、私たちが正しい日付にステータス更新を置くまで、代償が私たちに通知のタイミングに依存することです。
- 全モデルはまだやることができますが、行うには、メッセージキューに基づいて、統合モデルに抽象化することができRPCに基づいており、「企業のバスを。」
- 具体的には、ローカル・トランザクションおよび(ロールバックが失敗したと)一緒にビジネスの変化通知メッセージ、床を維持するため、RPCが正常ブローカー、成功した着陸後ブローカー、RPCリターンに到着、その後、あなたがローカルニュースを削除することができます。そうでない場合は、ローカルニュースは、このように信頼性の高いメッセージの床のブローカーを確保すること、常にポーリング再送タイミングタスクに頼ってきました。
- 消費者は、成功の消費者の確認を送信するまでのプロセスのようなメッセージを送信するために、消費者へのブローカーは、それがメッセージを送ってきました。
- メッセージを受信することができるようになりますのは、重複したメッセージ、2階経由のメッセージに加えて、補償の問題は下流で無視しましょう。ステートマシンは、究極の一貫性を達成するために、彼らのビジネスを更新し、重い刑を行うには、バージョン番号の上などに依存しています。
結果整合性は、メッセージキューの本質的な特徴ではないが、それは、最終的なことを行うために、メッセージキューの一貫性に依存していません。
また、すべては結果整合性を達成することはできません、メッセージの100%が理論的には、メッセージキューを失われない保証するものではありません。まあ、理論的には、100%トラブルシューティングのシステム障害や深刻なバグと言うべきです。
カフカは、クラスを設計することができるように、メッセージの設計レベルで失われている(例えば、ブラシプレートのタイミングとして、電源メッセージが失われます)。でも唯一の1000分の1失われたメッセージの場合、ビジネスにも正しい結果を保証するために、他の手段を使用する必要があります。
2.放送
メッセージキューの基本的な機能の一つは、放送されています。
メッセージ・キュー、いつでも新しいビジネスパーティーのアクセスがない場合、我々は新しいFBIのインタフェースを持っています。メッセージキューでは、我々は唯一のメッセージ配信キューかどうかを心配する必要があり、物事の下流で、購読したい人へと、疑いが大幅に発展し、FBIの負荷を軽減します。
たとえば、この記事では、製品の冒頭で述べた再更新メッセージにライブラリが「懸念」することができる当事者が多数を持っていますが、製品の中心部や観光スポットにライブラリが唯一気にメッセージを、変更に貢献する必要がある製品の変更だけでなく、多くの観光スポットを発表しました。アクセス。
3.ピークシフトとフロー制御
機能を処理するための下流が異なっているものを想像してみてください。
例えば、秒あたりの要求数百万のフロントエンドWeb十に耐えるように、驚くほど何の事はLVSとnginxののいくつかを構築し、負荷分散装置がすることができ、その後、ビットマシンを取得する必要がないだけ。
しかし、データベースの処理能力が非常に制限されても、SSDプラスライブラリサブテーブルで、スタンドアローンの処理能力は、まだ1万です。コストを考慮のために、我々は、フロントエンドデータベースに追いつくためにマシンの数を夢見ている余裕はありません。
この問題はまた、並行性の先端は、大きさのオーダーでないと、ゲートウェイカードの速度(要求当たり数百回)に、ショートメッセージングシステムボード効果に起因し得るように、システムとシステムとの間に存在します。
ただし、ユーザーが約半分夜の分をテキストメッセージが表示され、一般的にあまり問題はありません。メッセージ・キューがない場合、また2つのシステム間で協議の複雑なスライディングウィンドウによって達成することができないこと。
しかし、システムの複雑さは指数関数的に上流または下流バウンドDOストレージに、一連の質問が処理され、タイミング混雑します。容量のギャップが処理しているときはいつでも、私たちは、このロジックを維持するためのロジックの別のセットを開発する必要があります。したがって、通信システムを使用して中間体2つの系統の内容をダンプし、そして下流のシステムがこれらのメッセージを処理し、次いで、これらのメッセージを処理する能力を有する場合、それは、比較的一般的な方法です。
メッセージキューは要約を使用しています
1.メッセージキューはのための万能薬ではない必要な強度と遅延敏感トランザクションを確実にするために、RPCメッセージキューに優れています。
いくつかの無害のために、または他の誰かのために、彼らがそのように心配されていないことが非常に重要なものについて2.は、メッセージキューでそれを行うことができます。
3.メッセージキューサポートの最終的な一貫性は、「分散トランザクション」シーン、およびトランザクションを分散かさばるに対して良好取り扱うことができるに敏感処理遅延に使用することができます。
前記下流のシステム容量にギャップがある場合、「漏斗」を行う一般的なメッセージキューを使用すると、そこに下流の処理能力の時間であり、その後、分散。
5.メッセージキューが決定的にそれを使用するときに発行ケアシステムを知らせるために、下流のシステムの多くを持っている場合。
ブログ記事複数のプラットフォームからこの記事OpenWriteリリース!