SDK使用注意事项

更新时间:

本文介绍使用开源的客户端SDK接入云消息队列 RabbitMQ 版服务端时的注意事项。

使用客户端时需要设置自动重连功能吗?

设置com.rabbitmq.client.ConnectionFactory接口时,必须开启连接自动恢复功能,保证服务端升级时,客户端断开连接可自动重新连接,否则会导致消息读写中断。

//设置为true,开启Connection自动恢复功能;设置为false,关闭Connection自动恢复功能。
factory.setAutomaticRecoveryEnabled(true);
//设置自动恢复间隔时间,单位:毫秒。
factory.setNetworkRecoveryInterval(5000);

生产消息时需要注意什么?

  • 在生产或消费过程中,请勿频繁开启或关闭连接。请尽可能使用长期存活的Connection,以免每次收发消息时都需要创建新的Connection,消耗大量的网络资源和服务端资源,甚至引起服务端SYN Flood防护。更多信息,请参见Connection

  • 生产消息前根据实际情况选择是否打开发送确认接口。开启发送确认,服务端收到消息后,会调用本地方法确认消息收到。

  • mandatory设置为true时,如果消息因为路由原因,未到达Queue,客户端添加的ReturnListener接口将会被调用。

  • 发送消息时,强烈建议自定义msgId,即消息的唯一标识。可用于消息查询、轨迹查询、以及故障排查时后台信息定位。

  • 消息发送时,需要根据basicPublish接口返回的错误类型决定是否抛出异常。

    • 如果是业务自身问题,例如ExchangeNotExist(Exchange不存在)则需要抛出异常。

    • 如果是发送消息被限流,建议关闭旧的连接,重新创建并初始化Channel,这样可以保证业务的连续性。

消费消息时需要注意什么?

  • 消费数据时,需要防止消费倾斜。具体做法,请参见Connection和Channel的使用建议

  • 消费数据时,使用basic.basicQos设置服务端允许缓存未ack消息的数量,当到达设置值时,服务端将不再推送消息到客户端。当客户端提交ack后,服务端将再次推送等同ack数量的消息,保持服务端缓存最大未ack消息数量小于等于QoS设置值。QoS可以设置在Channel上,也可以设置在单个Consumer上。channel.basicQos(100, true)表示同一Channel上创建的所有Consumer共享100的额度限制。channel.basicQos(100, false)或者channel.basicQos(100)表示不同Consumer之间额度不共享,不同Consumer额度都是100。如果客户端不设置,默认使用服务端配置,服务端默认针对每个消费者限制100,也即等同于客户端channel.basicQos(100, false)。自定义设置值不能超过100,否则设置不生效,仍然使用默认值。如果消费能力较弱,建议将QoS值降低。如果服务端堆积消息量达到设置的QoS,则不会再推送消息给客户端。这种情况下客户端看到的现象是服务端间歇性推送消息,并且重启消费者后消息恢复,建议通过增强消费者的消费能力解决。如果使用autoACK消费模式,basicQos将不生效。

  • 消费者提交的ack如果不在指定时间内,则触发消费重试。消息将会被重新投递,最多重试16次。若重试16次还未成功,则消息将被丢弃或发送至死信Exchange。消费超时时间如下:

    实例重试策略参数说明

    实例类型

    Serverless系列实例

    预付费系列实例

    预留+弹性 /按累积量

    专业版

    企业版

    铂金版

    消费超时时间

    15分钟

    默认值:5分钟

    10分钟

    默认值:1分钟

    15分钟

    默认值:5分钟

    60分钟

    默认值:30分钟

    最大投递次数

    16

    默认值:16

    16

    默认值:16

    16

    默认值:16

    64

    默认值:16

  • basicGet拉取消息效率较低,能达到的上限TPS没有basicConsume高。生产环境大规模消费消息推荐使用basicConsume,而不是basicGet

  • queueDeclareexchangeDeclare等元数据接口有限流设置,建议在控制台上创建,不建议在发送数据时调用,否则可能触发限流导致连接关闭。更多信息,请参见使用限制