Todos los productos
Search
Centro de documentos

ApsaraMQ for RocketMQ:Suscripción a mensajes

Última actualización: Sep 04, 2026

Suscríbase a mensajes de ApsaraMQ for RocketMQ mediante el SDK de cliente TCP para C/C++. Este tema explica los dos modos de suscripción, proporciona una implementación completa del consumidor y aborda la gestión de su ciclo de vida.

Modos de suscripción

ApsaraMQ for RocketMQ admite dos modos de suscripción que determinan cómo se distribuyen los mensajes entre las instancias de consumidor dentro del mismo group ID.

Suscripción por clúster (predeterminado)

Cada mensaje se entrega a una sola instancia de consumidor en el grupo. Todos los consumidores identificados con el mismo group ID procesan una cantidad equitativa de mensajes.

Por ejemplo, si un topic contiene nueve mensajes y el grupo tiene tres instancias de consumidor, cada instancia recibe tres mensajes.

// Clustering subscription is the default mode. To set it explicitly:
factoryInfo.setFactoryProperty(ONSFactoryProperty::MessageModel, ONSFactoryProperty::CLUSTERING);

Utilice la suscripción por clúster cuando cada mensaje deba procesarse solo una vez, como en el procesamiento de pedidos o la distribución de tareas.

Suscripción por difusión

Cada mensaje se entrega a todas las instancias de consumidor del grupo. Cada consumidor recibe una copia completa de todos los mensajes.

Por ejemplo, si un topic contiene nueve mensajes y el grupo tiene tres instancias de consumidor, cada instancia recibe los nueve mensajes.

// Set broadcasting subscription mode.
factoryInfo.setFactoryProperty(ONSFactoryProperty::MessageModel, ONSFactoryProperty::BROADCASTING);

Utilice la suscripción por difusión cuando cada instancia requiera los mismos datos, como en la actualización de caché local o la sincronización de configuración.

Nota
  • Todas las instancias de consumidor que comparten el mismo group ID deben usar suscripciones consistentes. Para obtener más información, consulte Subscription consistency.

  • La suscripción por difusión no admite mensajes ordenados, mantenimiento del progreso de consumo ni restablecimiento del offset del consumidor. Para obtener más información, consulte Clustering consumption and broadcasting consumption.

Código de ejemplo

El siguiente ejemplo crea un PushConsumer que se suscribe a dos topics, procesa los mensajes entrantes mediante un callback de listener y gestiona el ciclo de vida del consumidor.

#include "ONSFactory.h"

#include <iostream>
#include <thread>
#include <mutex>

using namespace ons;

// Mutex to synchronize access to shared resources across listener threads.
std::mutex console_mtx;

class ExampleMessageListener : public MessageListener {
public:
    Action consume(Message& message, ConsumeContext& context) {
        // Return CommitMessage after successful processing.
        // Return ReconsumeLater if processing fails or you want to consume
        // the message again -- the broker redelivers the message after a
        // predefined interval.
        std::lock_guard<std::mutex> lk(console_mtx);
        std::cout << "Received a message. Topic: " << message.getTopic() << ", MsgId: "
        << message.getMsgID() << std::endl;
        return CommitMessage;
    }
};

int main(int argc, char* argv[]) {
    std::cout << "=======Before consuming messages=======" << std::endl;
    ONSFactoryProperty factoryInfo;

    // Group ID created in the ApsaraMQ for RocketMQ console.
    // ApsaraMQ for RocketMQ instances use group IDs instead of producer IDs
    // and consumer IDs. This parameter maintains backward compatibility.
    factoryInfo.setFactoryProperty(ONSFactoryProperty::ConsumerId, "GID_XXX");

    // Retrieve credentials from environment variables.
    // Make sure ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET
    // are set before running this program.
    factoryInfo.setFactoryProperty(ONSFactoryProperty::AccessKey, getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
    factoryInfo.setFactoryProperty(ONSFactoryProperty::SecretKey, getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));

    // Endpoint of the ApsaraMQ for RocketMQ instance.
    // Get this value from the ApsaraMQ for RocketMQ console.
    factoryInfo.setFactoryProperty(ONSFactoryProperty::NAMESRV_ADDR, "http://xxxxxxxxxxxxxxxx.aliyuncs.com:80");

    PushConsumer *consumer = ONSFactory::getInstance()->createPushConsumer(factoryInfo);

    // Subscribe to messages with a specific tag in topic-1.
    const char* topic_1 = "topic-1";
    const char* tag_1 = "tag-1";

    // Subscribe to all messages in topic-2 by using the wildcard tag "*".
    const char* topic_2 = "topic-2";
    const char* tag_2 = "*";

    // Register the listener and subscribe to both topics.
    ExampleMessageListener * message_listener = new ExampleMessageListener();
    consumer->subscribe(topic_1, tag_1, message_listener);
    consumer->subscribe(topic_2, tag_2, message_listener);

    // Start the consumer. Messages begin arriving after this call.
    consumer->start();

    // Keep the main thread alive. In production, replace this with
    // your application's main loop or signal handler.
    std::this_thread::sleep_for(std::chrono::milliseconds(60 * 1000));
    consumer->shutdown();
    delete message_listener;
    std::cout << "=======After consuming messages======" << std::endl;
    return 0;
}

Pasos siguientes