文档

注意要点

更新时间:
一键部署

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

要点

说明

com.rabbitmq.client.ConnectionFactory接口

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

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

加密传输

本示例使用默认的非加密端口5672,如果使用加密传输,需要连接5671端口,并设置

com.rabbitmq.client.ConnectionFactory的SslProtocol。

 private void setSSL(com.rabbitmq.client.ConnectionFactory factory) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
        SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
        
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init((KeyStore) null);
        
        sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
        
        factory.useSslProtocol(sslContext);
    }

生产消息

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

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

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

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

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

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

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

消费消息

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

  • 消费消息时,请根据业务自身消费能力设置QoS,即服务端最多推送未ack消息的条数,默认为100条,自定义设置值不能超过100,否则设置不生效,仍然使用默认值。如果消费能力较弱,建议将QoS值降低。如果服务端堆积消息量达到设置的QoS,则不会再推送消息给客户端。这种情况下客户端看到的现象是服务端间歇性推送消息,并且重启消费者后消息恢复,建议通过增强消费者的消费能力解决。

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

    • Serverless版实例:5分钟

    • 专业版实例:1分钟

    • 企业版实例:5分钟

    • 铂金版实例:30分钟

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

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

  • 本页导读 (1)
文档反馈