web-dev-qa-db-ja.com

RabbitMQ AMQP.BasicProperties.Builderの値

RabbitMQ/AMQP Javaクライアントでは、_AMQP.BasicProperties.Builder_を作成し、それを使用してbuild()の_AMQP.BasicProperties_のインスタンスを作成できます。インスタンスは、あらゆる種類の重要なものに使用できます。このビルダークラスでは、多くの「ビルダー」スタイルのメソッドを使用できます。

_BasicProperties.Builder propsBuilder = new BasicProperties.Builder();
propsBuilder
    .appId(???)
    .clusterId(???)
    .contentEncoding(???)
    .contentType(???)
    .correlationId(???)
    .deliveryMode(2)
    .expiration(???)
    .headers(???)
    .messageId(???)
    .priority(???)
    .replyTo(???)
    .timestamp(???)
    .type(???)
    .userId(???);
_

これらのbuilerメソッドが「ビルドアップ」に役立つフィールド、および最も重要なことには、各フィールドに存在する有効な値を探しています。たとえば、clusterIdとは何ですか?また、その有効な値は何ですか? typeとは何ですか、またその有効な値は何ですか?等。

私は午前中ずっと精練をしてきました:

これらのすべてのドキュメントでは、これらの各フィールドとその有効な値の明確な定義(いくつかのvagueprioritycontentEncodingおよびdeliveryModeの説明以外)を見つけることができません。誰か知っていますか?さらに重要なことは、これらがどこで文書化されているかを誰もが知っていますか?前もって感謝します!

43
user1768830

通常、私は非常に単純なアプローチを使用して何かを暗記します。以下にすべての詳細を示しますが、BasicPropertiesフィールドと値の簡単な図を次に示します。また、キュー/サーバーおよびアプリケーションコンテキストを適切に強調表示しようとしました。

enter image description here

あなたが私にそれを少し強化したいなら-ちょっとしたコメントを落としてください。私が本当に欲しいのは、視覚的なキーを提供し、理解を簡単にすることです。

高レベルの説明source 1source 2 ):

Clust IDは廃止されているため、除外します。

  • アプリケーションID-メッセージを生成したアプリケーションの識別子。
    • コンテキスト:アプリケーションの使用
    • 値:任意の文字列を指定できます。
  • コンテンツエンコーディング-メッセージコンテンツエンコーディング
    • コンテキスト:アプリケーションの使用
    • 値:MIMEコンテンツエンコーディング(gzipなど)
  • コンテンツタイプ-メッセージコンテンツタイプ
    • コンテキスト:アプリケーションの使用
    • 値:MIMEコンテンツタイプ(例:application/json)
  • 相関ID-これに関連するメッセージ。このメッセージへの返信は何ですか。アプリケーションでは、この情報をメッセージペイロードに入れる代わりに、この属性を使用することをお勧めします。
    • コンテキスト:アプリケーションの使用
    • 値:任意の値
  • 配信モード-メッセージをディスクに保存する必要がありますか?
    • コンテキスト:キュー実装の使用
    • 値:非永続(1)または永続(2)
  • 有効期限-メッセージが削除されるまでの有効期限。有効期限フィールドの値は、TTLミリ秒単位の期間。以下の詳細を参照してください。
    • コンテキスト:キュー実装の使用
  • Headers-任意のアプリケーション固有のメッセージヘッダー。
    • コンテキスト:アプリケーションの使用
  • メッセージID-文字列としてのメッセージ識別子。アプリケーションがメッセージを識別する必要がある場合、メッセージペイロードに入れるのではなく、この属性を使用することをお勧めします。
    • コンテキスト:アプリケーションの使用
    • 値:任意の値
  • Priority-メッセージの優先度。
    • コンテキスト:キュー実装の使用
    • 値:0から9
  • ReplyTo-他のアプリが応答を送信するキュー名。一般に、応答キュー(またはコンシューマアプリケーションが応答を指示するのに役立つその他の識別子)に名前を付けるために使用されます。アプリケーションでは、この情報をメッセージペイロードに入れる代わりに、この属性を使用することをお勧めします。
    • コンテキスト:アプリケーションの使用
    • 値:任意の値
  • タイムスタンプ-メッセージが送信された瞬間のタイムスタンプ。
    • コンテキスト:アプリケーションの使用
    • 値:エポックからの秒。
  • Type-メッセージタイプ、例えばこのメッセージが表すイベントまたはコマンドのタイプ。この情報をメッセージペイロードに含める代わりに、アプリケーションで使用することをお勧めします。
    • コンテキスト:アプリケーションの使用
    • 値:任意の文字列を指定できます。
  • ユーザーID-オプションのユーザーID。実際の接続ユーザー名に対してRabbitMQによって検証されました。
    • コンテキスト:キュー実装の使用
    • 値:認証されたユーザーである必要があります。

ところで、私はついに最新のサーバーコード(rabbitmq-server-3.1.5)をレビューすることに成功しました。rabbit_stomp_test_util.erlに例があります:

                content_type     = <<"text/plain">>,
                content_encoding = <<"UTF-8">>,
                delivery_mode    = 2,
                priority         = 1,
                correlation_id   = <<"123">>,
                reply_to         = <<"something">>,
                expiration       = <<"my-expiration">>,
                message_id       = <<"M123">>,
                timestamp        = 123456,
                type             = <<"freshly-squeezed">>,
                user_id          = <<"joe">>,
                app_id           = <<"joe's app">>,
                headers          = [{<<"str">>, longstr, <<"foo">>},
                                    {<<"int">>, longstr, <<"123">>}]

誰かがすべての詳細を知りたいと思うのは良いことです。可能であれば、メッセージ本文に情報を配置するのではなく、既知のメッセージ属性を使用する方がはるかに優れているためです。ところで、基本的なメッセージプロパティは、明確で有用なものとはほど遠いです。カスタムを使用する方が良いと思います。

enter image description here

良い例(- source

enter image description here

更新-有効期限フィールド

重要な注意:expirationはキューコンテキストに属します。そのため、サーバーによってメッセージがドロップされる場合があります。

enter image description here

READMEは次のように述べています。

expirationはshortstrです。 RabbitMQはこれがエンコードされた文字列であると想定するため、ttlをその整数値の文字列表現に変換します。

ソース:

77
Renat Gilmanov

執筆時点:

  1. 最新のAMQP標準は AMQP 1.0 OASIS標準 です。
  2. RabbitMQの最新バージョンは3.1.5(サーバーとクライアント)で、これは AMQP 0.9.1 (zip形式のpdfおよびXMLスキーマ)をサポートしていると主張しています。
  3. RabbitMQは、プロトコルの独自の説明を 拡張機能を含むXMLスキーマ (非標準)、さらに 拡張機能のないXMLスキーマ ((2 ))および pdf doc

この答えでは:

  • (3)のリンクが主な詳細情報源です
  • (2)(3)が不十分な場合、pdf docが二次詳細として使用されます
  • (2)が不十分な場合、ソースコード(Javaクライアント、アーランサーバー)が3次詳細として使用されます。
  • (1)通常は使用されません-プロトコルとスキーマはOASIS向けに(かなり)進化しており、RabbitMQの将来のバージョンに適用されるはずですが、現在は適用されていません。 (1)が使用された2つの例外は、contentTypeおよびcontentEncodingのテキストによる説明でした。これらはAMQP 1.0で適切に説明された標準フィールドであるため、安全です。

次のテキストは、これらのソースから、もう少し簡潔または明確にするために言い換えられています。

  • content-type(AMQP XML type = "shortstr"; Java type = "String"):オプション。メッセージのアプリケーションデータセクション(本文)のRFC-2046 MIMEタイプ:使用される文字エンコーディングを定義する文字セットパラメータを含めることができます:例: 'text/plain; charset =“ utf-8”'コンテンツタイプが不明な場合content-typeは、受信者が実際のタイプを決定できるように設定するべきではなく(SHOULD NOT)、セクションが真に不透明なバイナリデータであることがわかっている場合、content-typeはapplication/octet-streamに設定する必要があります。
  • content-encoding(AMQP XML type = "shortstr"; Java type = "String"):オプション。現在、アプリケーションデータに適用される追加のコンテンツエンコーディング、およびコンテンツタイプヘッダーフィールドによって参照されるメディアタイプを取得するためにどのデコードメカニズムを適用する必要があるかについて説明します。 RFC 2616のセクション3.5に従って解釈されるコンテンツタイプの修飾子。有効なコンテンツエンコーディングはIANAに登録されています。実装は、元のメッセージとの互換性を維持する場合を除き、圧縮エンコーディングを使用しないでください。 HTTPやSMTPなどの他のプロトコルで送信されます。実装は、HTTPやSMTPなどの他のプロトコルで最初に送信されたメッセージと互換性がある場合を除き、複数のコンテンツエンコーディング値を指定しないでください。
  • headers(AMQP XML type = "table"; Java type = "Map"):オプション。アプリケーション-指定されたヘッダーパラメータとその値のリストこれらは、アプリケーションのみで使用するために設定できますさらに、「Header Exchange Type」でキューを作成することができます-キューが作成されると、一連のヘッダープロパティ名が与えられますそれぞれが一致するオプションの値を持つため、このキューへのルーティングはヘッダー一致によって行われます。
  • deliveryMode(RabbitMQ XML type = "octet"; Java type = "Integer"):1(非永続的)または2(永続的)永続性を実装するキューでのみ機能永続的なメッセージはディスク上に安全に保持され、深刻なネットワーク障害、サーバーのクラッシュ、オーバーフローなどが発生した場合でも配信されることが保証されています。
  • priority(AMQP XML type = "octet"; Java type = "Integer"):相対的なメッセージ優先度( 0〜9)。優先度の高いメッセージは、同じメッセージキューで待機している優先度の低いメッセージよりも先に[MAY BE ??-GB]送信されます。特定のサービス品質レベルを維持するためにメッセージを破棄する必要がありますが、サーバーは優先度の低いメッセージを最初に破棄します。
  • correlation-id(AMQP XML type = "octet"; Java type = "String"):オプション。アプリケーション使用、正式な(RabbitMQ)動作なしクライアント間のメッセージをマークまたは識別するために使用できるクライアント固有のID。
  • replyTo(AMQP XML type = "shortstr"; Java type = "String"):オプション。アプリケーションで使用する場合、正式な(RabbitMQ)動作はありませんが、要求メッセージで使用される場合、プライベート応答キューの名前を保持する場合があります。
  • expiration(AMQP XML type = "shortstr"; Java type = "String"):オプション RabbitMQ AMQP 0.9.1スキーマ from(3)「実装用、正式な動作なし」(2)からのA​​MQP 0.9.1スキーマpdfは、このメッセージが期限切れと見なされる絶対時間を示しています。 、これらの説明は両方とも無視する必要がありますthis TTL link and the client/serverクライアントからは、BasicPropertiesのカスタムアプリケーション初期化を介してのみ有効期限が設定されます。サーバーでは、これを使用して、メッセージを受信した時点からTTLキューイングの前のサーバー。サーバーは、TTL(1)メッセージの最小値としてTTL(clientBasicProperties expirationミリ秒単位の相対時間)および(2)queue TTL(configuredx-message-ttl(ミリ秒))形式:文字列引用符付き整数ミリ秒数。サーバーで受信されたメッセージの有効期限。
  • message-id(AMQP XML type = "shortstr"; Java type = "String"):オプション。アプリケーション使用、正式な(RabbitMQ)動作なし。設定する場合、メッセージプロデューサはグローバルに一意の値に設定する必要があります。将来(AMQP 1.0)、ブローカはメッセージIDの値が一致する場合、メッセージを重複として破棄することがあります同じノードに送信された以前に受信したメッセージのもの。
  • timestamp(AMQP XML type = "timestamp"; Java type = "Java.util.Date"):オプション。アプリケーションで使用する場合、正式な(RabbitMQ)動作はありませんこのメッセージが作成された絶対時間。
  • type(AMQP XML type = "shortstr"; Java type = "String"):オプション。アプリケーションで使用する場合、正式な(RabbitMQ)動作なし[メッセージは、アプリケーション固有の「タイプ」または「フォーム」または「ビジネストランザクション」である/それに属していると説明します-GB]
  • userId(AMQP XML type = "shortstr"; Java type = "String"):オプション。XMLスキーマの状態「アプリケーションで使用する場合、正式な(RabbitMQ)の動作はありません」-しかし、これは最新リリースで変更されたと思われます(続きを読む)。設定すると、クライアントはこの値をメッセージの作成を担当するユーザーのIDとして設定します。 RabbitMQ :このプロパティがパブリッシャーによって設定される場合、その値は接続を開くために使用されるユーザーの名前と同じである必要があります(つまり、検証は接続/認証済みユーザーであることを確認するために行われます)。 -idプロパティが設定されていない場合、発行者のIDはプライベートのままです。
  • appId(RabbitMQ XML type = "shortstr"; Java type = "String"):オプション。アプリケーションで使用する場合、正式な(RabbitMQ)動作はありません。作成アプリケーションID。プロデューサーが入力し、コンシューマーが読み取ることができます(R-MQサーバーコードを見ると、「webmachine-wrapper」プラグインが、管理者がスクリプトにappIdを提供できるWebマシンを作成するためのスクリプトと一致するテンプレートを提供します。
  • cluster Id(RabbitMQ XML type = "N/A"; Java type = "String"):AMQP 0.9.1で非推奨-すなわち使用されません。以前のバージョンでは、クラスターアプリケーションで使用するためのクラスター内ルーティング識別子は使用されませんでした。ただし、これは非推奨であり、現在のスキーマから削除されているため、R-MQサーバーコードでは使用されません。

上記からわかるように、これらのプロパティの大部分は「アプリケーション使用のみ」であり、RabbitMQによって使用されないため、列挙値/制約値/推奨値がありません。あなたは簡単な仕事をしています。アプリケーションに役立つ値を自由に書き込んだり読み込んだりできます-データ型が一致し、コンパイルされている限りです:)。 ContentTypeおよびcontentEncodingは、標準のHTTP使用によるものです。 DeliveryModepriorityは制約付きの数値です。

注:AMQP.BasicPropertiesの便利ですが単純な定数は、クラス MessageProperties で使用できます。

乾杯:)

UPDATE TO POST:

Renat(コメントを参照)に感謝し、rabbit_amqqueue_process.erlのerlangサーバーコードと RabbitMQ TTL Extensions to AMQP 。メッセージの有効期限(time- to-live)を指定できます

  • キューごと:

    Map<String, Object> args = new HashMap<String, Object>();
    args.put("x-message-ttl", 60000);
    channel.queueDeclare("myqueue", false, false, false, args);
    
  • またはメッセージごと:

    byte[] messageBodyBytes = "Hello, world!".getBytes();
    AMQP.BasicProperties properties = new AMQP.BasicProperties();
    properties.setExpiration("60000");
    channel.basicPublish("my-exchange", "routing-key", properties, messageBodyBytes);
    

ここでは、ttl/expirationはミリ秒単位であるため、それぞれ60秒です。これを反映するために、expirationの定義を更新しました。

10
Glen Best

AMQP仕様は、プロパティの一般的な拡張可能なモデルを定義します。

AMQPプロパティは、問題のメッセージに関するメタデータを表すという点で、概念的にはHTTPヘッダーに多少似ています。 HTTPの場合と同じように、メッセージペイロードに対して 個別にフレーム化 です。しかし、それらは基本的にキー/値マップです。

RabbitMQなどの一部のブローカーは、expirationなどの特定のメッセージプロパティを解釈して、ベンダー固有の値を追加します(その場合、 TTLを強制 )。

しかし、最終的に、AMQPプロパティは、各メッセージと一緒に安全に送信されるキー/値のペアの大きな束にすぎません。 AMQPブローカーのドキュメントは、彼らが特別に解釈するものと、あなた自身のものを送る方法を教えてくれます。

そうは言っても、そもそもこの質問をしているのであれば、おそらくそれらについて心配する必要はないでしょう。メッセージプロパティを設定することをまったく心配せずに、メッセージを正常に送信できます。

0
Brian Kelly