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。消费超时时间如下:
实例重试策略参数说明
实例类型
后付费系列实例
预付费系列实例
预留+弹性 /按累积量
专业版
企业版
铂金版
消费超时时间
15分钟
默认值:5分钟
10分钟
默认值:1分钟
15分钟
默认值:5分钟
60分钟
默认值:30分钟
最大投递次数
16
默认值:16
16
默认值:16
16
默认值:16
64
默认值:16
basicGet
拉取消息效率较低,能达到的上限TPS没有basicConsume
高。生产环境大规模消费消息推荐使用basicConsume
,而不是basicGet
。queueDeclare
和exchangeDeclare
等元数据接口有限流设置,建议在控制台上创建,不建议在发送数据时调用,否则可能触发限流导致连接关闭。更多信息,请参见使用限制。