Ordena mensajes

En esta página, se explica cómo recibir mensajes en orden.

Si quieres obtener más información sobre cómo recibir mensajes, consulta la descripción general de los suscriptores.

Recibe mensajes en orden

Si los mensajes tienen la misma clave de orden y están en la misma región, puedes habilitar el orden de los mensajes y recibir los mensajes en el orden en el que el servicio de Pub/Sub los recibe.

Pub/Sub entrega cada mensaje al menos una vez, por lo que el servicio de Pub/Sub podría volver a entregar los mensajes. Cuando recibes mensajes en orden y el servicio de Pub/Sub vuelve a entregar un mensaje con una clave de orden, Pub/Sub mantiene el orden mediante la entrega de los mensajes posteriores con la misma clave de ordenamiento. El servicio de Pub/Sub vuelve a enviar estos mensajes en el orden en que los recibió originalmente.

Cuando el servicio de Pub/Sub vuelve a enviar un mensaje con una clave de ordenamiento, el servicio de Pub/Sub también vuelve a entregar todos los mensajes posteriores con la misma clave de ordenamiento, incluidos los mensajes con confirmación de recepción. Vuelve a confirmar la recepción de estos mensajes.

Habilita el orden de los mensajes

Para recibir los mensajes en orden, configura la propiedad de ordenamiento de mensajes de la suscripción de la que recibes mensajes. Recibir mensajes en orden puede aumentar la latencia.

Puedes configurar la propiedad de orden de los mensajes cuando creas una suscripción con Cloud Console, la herramienta de línea de comandos de gcloud o la API de Pub/Sub.

Console

Para crear una suscripción con la propiedad de ordenamiento de mensajes, sigue estos pasos:

  1. En Cloud Console, ve a la página Suscripciones.

    Ir a la página Suscripciones

  2. Haz clic en Crear suscripción.

  3. Ingresa un ID de suscripción.

  4. Elige un tema para recibir mensajes.

  5. En la sección Orden de mensajes, selecciona Ordenar mensajes con una clave de orden.

  6. Haga clic en Crear.

gcloud

Para crear una suscripción con la propiedad de ordenamiento de mensajes, usa el comando gcloud beta pubsub subscriptions create y la marca --enable-message-ordering:

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

Reemplaza SUBSCRIPTION_ID por el ID de la suscripción.

Si la solicitud es exitosa, la línea de comandos muestra una confirmación:

Created subscription [SUBSCRIPTION_ID].

REST

Para crear una suscripción con la propiedad de orden de los mensajes, envía una solicitud PUT como la siguiente:

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

Reemplaza lo siguiente:

  • PROJECT_ID: El ID del proyecto con el tema
  • SUBSCRIPTION_ID: El ID de la suscripción

En el cuerpo de la solicitud, especifica lo siguiente:

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

Reemplaza TOPIC_ID por el ID del tema que deseas adjuntar a la suscripción.

Si la solicitud es exitosa, la respuesta es la suscripción en formato JSON:

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

Java

Antes de probar esta muestra, sigue las instrucciones de configuración de Java en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para Java.

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());
    }
  }
}

Una vez que se configura la propiedad de orden de los mensajes, el servicio de Pub/Sub entrega los mensajes con la misma clave de orden en el que el servicio de Pub/Sub recibe los mensajes. Por ejemplo, si un publicador envía dos mensajes con la misma clave de orden, el servicio de Pub/Sub primero envía el mensaje más antiguo.