全部产品
云市场

使用开源 C_C++ SDK 访问阿里云 MQ

更新时间:2019-09-13 22:00:01

开源 SDK 连接阿里云 MQ,需要重新修改部分配置信息即可,使用方式和默认配置保持兼容。

前提条件

  • 请确保平台版本满足以下条件:

    • Linux:CentOS 6.X、CentOS 7.X、ReHL 6.x、ReHL 7.x
    • Darwin:macOS Mojave 10.14.x
    • Windows:Win10
  • 已下载 rocketmq-client-cpp 1.2.2 或以上版本的开源 SDK。

  • 已在阿里云 MQ 控制台创建资源,包括 Topic、Group ID(GID)、接入点(Endpoint),以及 AccessKeyId 和 AccessKeySecret。针对新建实例(有独立命名空间),还包括 Instance ID。

    命名空间详情请参见产品更新日志

设置参数

下文中只涉及部分核心代码的示例,完整的代码请参见 Example

访问阿里云需要使用阿里云的鉴权方式和接入点,下文针对默认实例(无独立命名空间)和新建实例(有独立命名空间),分别列出需要修改的配置信息,其余的配置和开源 RocketMQ 的使用完全兼容。

注意事项

在设置代码时,需注意以下关键配置项:

  • SessionCredentials

    C/C++ SDK 提供了访问阿里云默认的鉴权方式,示例代码如下:

    1. void setSessionCredentials(const std::string& input_accessKey,
    2. const std::string& input_secretKey,
    3. const std::string& input_channel);
    4. //此处前两个参数分别为从控制台上获取 AccessKeyId 和 AccessKeySecret,如果访问阿里云,设置 channel 为 "ALIYUN"
  • 接入点

    阿里云 MQ 将访问的 Name Server 地址以接入点的方式提供。

    1. void setNamesrvAddr(const std::string& namesrvAddr);

    NamesrvAddr 设置为控制台上获取的接入点地址

  • GID(Producer ID/Consumer ID)

    由于阿里云 MQ 将原来的 Producer ID(PID)和 Consumer ID(CID)合并,统一称作 GID,开源 SDK 除了在 Producer 和 Consumer 区分命名空间的时候,在构造函数里可以指定 GID、PID、CID 外,额外提供了设置 GID 的接口。示例代码如下:

    1. void setGroupName(const std::string& groupname);

    针对新建实例,还需要将 GID 重新拼接,格式为 InstanceID%GID。详情请参见下文的示例代码。

    注意:此接口调用必须在实例 start 之前。

  • Topic

    对于新用户,需要在控制台创建 Topic,对于需要迁移的用户,在控制台上创建相同的 Topic 即可,这里不用修改,如果是申请的新实例,这里需要把实例 ID 拼接上,格式为 InstanceID%Topic

默认实例(无独立命名空间)

  • 生产者示例代码

    1. //控制台上申请的 GID 或者 PID
    2. DefaultMQProducer producer("GID_XXXX");
    3. //如果上一步初始化的时候已经设置过,这步设置可以跳过
    4. producer.setGroupName("GID_XXXX");
    5. //控制台上获取的接入点信息
    6. producer.setNamesrvAddr("http://XXXX.mq-internet-access.mq-internet.aliyuncs.com:80");
    7. //用户的 AccessKeyId 和 AccessKeySecret,控制台上可以获取,第三个参数固定默认使用 “ALIYUN”
    8. producer.setSessionCredentials("mq acesskey", "mq secretkey", "ALIYUN");
  • 消费者示例代码

    1. //控制台上申请的 GID 或者 CID
    2. DefaultMQPushConsumer consumer("GID_XXXX");
    3. //如果上一步初始化的时候已经设置过,这步设置可以跳过
    4. consumer.setGroupName("GID_XXXX");
    5. //控制台上获取的接入点信息
    6. consumer.setNamesrvAddr("http://XXXX.mq-internet-access.mq-internet.aliyuncs.com:80");
    7. //用户的 AccessKeyId 和 AccessKeySecret,控制台上可以获取,第三个参数固定默认使用 “ALIYUN”
    8. consumer.setSessionCredentials("mq acesskey", "mq secretkey", "ALIYUN");
    9. //设置订阅的 Topic 和 TAGs
    10. consumer.subscribe("TOPIC","TAGS");
    11. ........
    12. //注册处理消息的回调函数
    13. consumer.registerMessageListener(&msglistener);

新建实例(有独立命名空间)

由于新建实例给用户提供了自己的命名空间,用于逻辑资源隔离,所以使用开源 SDK 访问时,需要显式的设置实例 ID,即 InstanceId,从控制台获取,格式为 MQ_INST_XXXXX_XXXX

  • 生产者示例代码

    1. //控制台上申请的 GID 或者 PID,需要和 InstanceId 拼装
    2. DefaultMQProducer producer("MQ_INST_XXXX_XXXX%GID_XXXX");
    3. //如果上一步初始化的时候已经设置过,这步设置可以跳过
    4. producer.setGroupName("MQ_INST_XXXX_XXXX%GID_XXXX");
    5. //控制台上获取的接入点信息,接入点包含了新建实例的命名空间信息
    6. producer.setNamesrvAddr("http://MQ_INST_XXXX_XXXX.mq-internet-access.mq-internet.aliyuncs.com:80");
    7. //用户的 AccessKeyId 和 AccessKeySecret,控制台上可以获取,第三个参数固定默认使用 “ALIYUN”
    8. producer.setSessionCredentials("mq acesskey", "mq secretkey", "ALIYUN");
    9. ...........
    10. //发送消息的时候,Topic 也需要指定 InstanceId
    11. MQMessage msg("MQ_INST_XXXX_XXXX%YOURTOPIC", "TAG", "BODY");
  • 消费者示例代码

    1. //控制台上申请的 GID 或者 CID,需要和 InstanceId 拼装
    2. DefaultMQPushConsumer consumer("MQ_INST_XXXX_XXXX%GID_XXXX");
    3. //如果上一步初始化的时候已经设置过,这步设置可以跳过
    4. consumer.setGroupName("MQ_INST_XXXX_XXXX%GID_XXXX");
    5. //控制台上获取的接入点信息
    6. consumer.setNamesrvAddr("http://MQ_INST_XXXX_XXXX.mq-internet-access.mq-internet.aliyuncs.com:80");
    7. //用户的 AccessKeyId 和 AccessKeySecret,控制台上可以获取,第三个参数固定默认使用 “ALIYUN”
    8. consumer.setSessionCredentials("mq acesskey", "mq secretkey", "ALIYUN");
    9. //设置订阅的 Topic 和 TAGs,由于新建实例的 Topic 需要拼装
    10. consumer.subscribe("MQ_INST_XXXX_XXXX%TOPIC","TAGS");
    11. ........
    12. //注册处理消息的回调函数
    13. consumer.registerMessageListener(&msglistener);

更多信息

使用方法详情请参见 C/C++ 使用说明