メッセージの順序指定

このページでは、メッセージを順に受信する方法について説明します。

メッセージの受信の詳細については、サブスクライバーの概要をご覧ください。

メッセージを順に受信

メッセージに同じ順序指定キーがあり、同じリージョンに存在している場合、メッセージの順序指定を有効にすると、Pub/Sub サービスで受信する順序でメッセージを受信できます。

Pub/Sub は各メッセージを少なくとも 1 回配信するため、Pub/Sub サービスでメッセージが再度配信される可能性があります。メッセージを順序どおりに受信し、Pub/Sub サービスで順序指定キーのあるメッセージが再配信される場合、Pub/Sub では、同じ順序指定キーのある後続のメッセージも再配信することによって順序が維持されます。Pub/Sub サービスでは、こうしたメッセージが最初に受信した順序で再配信されます。

Pub/Sub サービスで順序指定キーがあるメッセージが再配信される場合、確認済みメッセージを含めて、同じ順序指定キーがある後続のすべてのメッセージが再配信されます。メッセージをもう一度確認します。

メッセージの順序指定の有効化

メッセージを順に受信するには、メッセージを受信するサブスクリプションのメッセージ順序指定プロパティを設定します。メッセージを順に受信すると、レイテンシが増加する可能性があります。

Cloud Console、gcloud コマンドライン ツール、または Pub/Sub API を使用してサブスクリプションを作成するときに、メッセージの順序指定プロパティを設定できます。

Console

メッセージの順序指定プロパティがあるサブスクリプションを作成する手順は次のとおりです。

  1. Cloud Console で [サブスクリプション] ページに移動します。

    [サブスクリプション] ページに移動

  2. [サブスクリプションを作成] をクリックします。

  3. サブスクリプション ID を入力します。

  4. メッセージを受信するトピックを選択します。

  5. [メッセージの順序指定] セクションで、[順序指定キーを使用してメッセージの順序を指定する] を選択します。

  6. [作成] をクリックします。

gcloud

メッセージの順序指定プロパティがあるサブスクリプションを作成するには、gcloud beta pubsub subscriptions create コマンドと --enable-message-ordering フラグを使用します。

gcloud beta pubsub subscriptions create SUBSCRIPTION_ID \
  --enable-message-ordering

SUBSCRIPTION_ID をサブスクリプションの ID に置き換えます。

リクエストが成功すると、コマンドラインに確認メッセージが表示されます。

Created subscription [SUBSCRIPTION_ID].

REST

メッセージの順序指定プロパティがあるサブスクリプションを作成するには、次のような PUT リクエストを送信します。

PUT https://pubsub.googleapis.com/v1/projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID
Authorization: Bearer $(gcloud auth application-default print-access-token)

以下を置き換えます。

  • PROJECT_ID: トピックがあるプロジェクトのプロジェクト ID
  • SUBSCRIPTION_ID: サブスクリプションの ID

リクエストの本文で、次のように指定します。

{
  "topic": TOPIC_ID,
  "enableMessageOrdering": true,
}

TOPIC_ID は、サブスクリプションにアタッチするトピックの ID に置き換えます。

リクエストが成功すると、JSON 形式のサブスクリプションが返されます。

{
  "name": projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID,
  "topic": projects/PROJECT_ID/topics/TOPIC_ID,
  "enableMessageOrdering": true,
}

Java

このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、Pub/Sub Java API のリファレンス ドキュメントをご覧ください。

import com.google.cloud.pubsub.v1.SubscriptionAdminClient;
import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.ProjectTopicName;
import com.google.pubsub.v1.Subscription;
import java.io.IOException;

public class CreateSubscriptionWithOrdering {
  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String topicId = "your-topic-id";
    String subscriptionId = "your-subscription-id";

    createSubscriptionWithOrderingExample(projectId, topicId, subscriptionId);
  }

  public static void createSubscriptionWithOrderingExample(
      String projectId, String topicId, String subscriptionId) throws IOException {
    try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) {

      ProjectTopicName topicName = ProjectTopicName.of(projectId, topicId);
      ProjectSubscriptionName subscriptionName =
          ProjectSubscriptionName.of(projectId, subscriptionId);

      Subscription subscription =
          subscriptionAdminClient.createSubscription(
              Subscription.newBuilder()
                  .setName(subscriptionName.toString())
                  .setTopic(topicName.toString())
                  // Set message ordering to true for ordered messages in the subscription.
                  .setEnableMessageOrdering(true)
                  .build());

      System.out.println("Created a subscription with ordering: " + subscription.getAllFields());
    }
  }
}

メッセージの順序設定プロパティを設定すると、Pub/Sub サービスでメッセージを受信する順序と同じ順序指定キーがあるメッセージが配信されます。たとえば、パブリッシャーが同じ順序指定キーがある 2 つのメッセージを送信する場合、Pub/Sub サービスでは最も古いメッセージが最初に配信されます。