このトピックでは、ApsaraMQ for RabbitMQ で使用されるメッセージ有効期間 (TTL) に関する用語を紹介します。また、メッセージ TTL の使用シナリオ、使用上の注意、設定方法についても説明します。
メッセージ TTL とは
ApsaraMQ for RabbitMQ では、メッセージ TTL は、メッセージをキューに保持できる期間を決定します。キュー内のメッセージの保持期間がキューのメッセージ TTL を超えると、メッセージは次のいずれかの方法で処理されます。
キューにデッドレター交換が設定されていない場合、メッセージはキューによって破棄されます。
キューにデッドレター交換が設定されている場合、メッセージはキューによって破棄され、デッドレター交換に転送されます。その後、デッドレター交換はメッセージをデッドレターキューにルーティングします。デッドレターキュー内のメッセージを取得できます。詳細については、「デッドレター交換」をご参照ください。
使用シナリオ
メッセージ TTL を使用して、メッセージの蓄積を防ぐことができます。たとえば、特定の期間内にアプリケーションのメッセージが劇的に増加する場合があります。期限切れのメッセージを保存する必要がない場合は、メッセージ TTL を指定して期限切れのメッセージを破棄できます。これにより、ビジネスにおけるメッセージの蓄積を防ぎます。
メッセージ TTL を指定する際のルール
ApsaraMQ for RabbitMQ では、x-message-ttl または expiration 引数を使用してメッセージ TTL を指定できます。 ApsaraMQ for RabbitMQ では、rabbitmqctl ツールの policy パラメーターを使用してメッセージ TTL を指定することはできません。
ApsaraMQ for RabbitMQ コンソールでキューを作成する際に、キューのメッセージ TTL を指定できます。メッセージを送信する際にも、メッセージ TTL を指定できます。
キューを作成するときとメッセージを送信するときの両方でメッセージ TTL を指定した場合、小さい方の値がメッセージの TTL として使用されます。
遅延メッセージの実際のメッセージ TTL は、次の式を使用して計算されます:
Actual message TTL of a delayed message = min {Message-level TTL, queue-level TTL} + delay time。詳細については、「遅延メッセージ」をご参照ください。メッセージ TTL の最大値は、インスタンスでスケジュール済みメッセージの送信に指定されたスケジュール済み間隔と同じです。メッセージ TTL の値は、ミリ秒単位の負でない整数である必要があります。
キューのメッセージ TTL が 0 に指定されている場合、メッセージがキューにルーティングされた後、すぐに消費されない限り、メッセージは破棄されるか、キューのデッドレター交換に転送されます。
設定方法
ApsaraMQ for RabbitMQ では、次の方法を使用してメッセージ TTL を指定できます。
ApsaraMQ for RabbitMQ コンソール
ApsaraMQ for RabbitMQ コンソールでキューのメッセージ TTL を指定できます。詳細については、「キューの管理」をご参照ください。
OpenAPI エクスプローラー
OpenAPI エクスプローラー を使用して CreateQueue オペレーションを呼び出し、キューのメッセージ TTL を指定できます。詳細については、「CreateQueue」をご参照ください。
オープンソース RabbitMQ SDK
オープンソース RabbitMQ SDK を使用して、キューまたはメッセージのメッセージ TTL を指定できます。詳細については、「サポートされている SDK」をご参照ください。サンプルコード:
x-message-ttl 引数を使用してキューのメッセージ TTL を指定する
Map<String, Object> props = new HashMap<String, Object>(); props.put("x-message-ttl", 1000); channel.queueDeclare("myqueue", false, false, false, props); // キューのメッセージ TTL を指定します。expiration 引数を使用してメッセージのメッセージ TTL を指定する
byte[] messageBodyBytes = "test".getBytes(); AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder() .expiration("1000") .build(); channel.basicPublish("myqueue", peoperties, messageBodyBytes); // メッセージの TTL を指定します。