第 8 章 流控制
通过限制流量之间的数据流,流控制可防止生产者和消费者变得过度密度。AMQ 核心协议 JMS 允许您为消费者和生产者配置流控制。
消费者流控制
消费者流控制控制代理和客户端之间的数据流,因为客户端会消耗来自代理的消息。在向消费者提供前,AMQ Core Protocol JMS 缓冲消息。如果没有缓冲区,客户端会首先需要从代理请求每个消息,然后才能消耗它。这种类型的"往返"通信非常昂贵。当消费者无法快速处理消息,且缓冲区开始与传入的消息溢出时,对客户端上的数据流进行监管非常重要。
生成者流控制
与消费者的基于窗口的流控制类似,客户端可将从制作者发送到代理的数据数量限制为防止代理被过度使用太多数据。对于生成者,窗口大小决定了任何一次可以处于 flight 的字节数。
8.1. 设置消费者窗口大小 复制链接链接已复制到粘贴板!
客户端侧缓冲区中保存的最大消息大小由其 窗口大小 决定。AMQ Core Protocol JMS 的窗口的默认大小为 1 MiB,或 1024 * 1024 字节。对于大多数用例,默认值是正常的。对于其他情况,查找窗口大小的最佳值可能需要对您的系统进行基准测试。如果需要更改默认值,AMQ Core Protocol JMS 允许您设置缓冲区窗口大小。
以下示例演示了如何在使用 AMQ Core Protocol JMS 时设置消费者窗口大小参数。每个示例将消费者窗口大小设置为 300,000 字节。
流程
如果客户端使用 JNDI 来实例化其连接工厂,请将
consumerWindowSize
参数作为连接字符串 URL 的一部分。将 URL 存储在 JNDI 上下文环境中。以下示例使用jndi.properties
文件来存储 URL。java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory connectionFactory.myConnectionFactory=tcp://localhost:61616?consumerWindowSize=300000
java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory connectionFactory.myConnectionFactory=tcp://localhost:61616?consumerWindowSize=300000
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果客户端不使用 JNDI 来实例化其连接工厂,请将值传递给
ActiveMQConnectionFactory.setConsumerWindowSize ()
。ConnectionFactory cf = ActiveMQJMSClient.createConnectionFactory(...) cf.setConsumerWindowSize(300000);
ConnectionFactory cf = ActiveMQJMSClient.createConnectionFactory(...) cf.setConsumerWindowSize(300000);
Copy to Clipboard Copied! Toggle word wrap Toggle overflow