第 8 章 流控制
流控制可通过限制他们之间的数据流来防止生产者和消费者变得负担过重。AMQ 核心协议 JMS 允许您为消费者和生产者配置流控制。
消费者流控制
消费者流控制控制代理和客户端之间的数据流,因为客户端会消耗来自代理的消息。在将消息传送给消费者之前,AMQ 核心协议 JMS 默认会缓冲消息。如果没有缓冲区,客户端首先需要从代理请求每个消息,然后才能使用。这种类型的"往返"通信成本很高。客户端上的数据流很重要,因为内存不足的问题会导致用户无法足够快速地处理消息,缓冲区也开始与传入消息溢出。
制作者流控制
与基于消费者窗口的流控制类似,客户端可以限制从生产者发送到代理的数据量,以防止代理被过多的数据所覆盖。对于制作者,窗口大小决定了任意时间可以处于机状态的字节数。
8.1. 设置使用者窗口大小 复制链接链接已复制到粘贴板!
客户端缓冲区中保存的最大信息大小取决于其 窗口大小。AMQ 核心协议 JMS 的默认窗口大小为 1 MiB,或 1024 * 1024 字节。默认为大多数用例。对于其他情况,找到窗口大小的最佳值可能需要对您的系统进行基准测试。如果您需要更改默认值,AMQ 核心协议 JMS 允许您设置缓冲区窗口大小。
以下示例演示了如何使用 AMQ 核心协议 JMS 设置使用者窗口大小参数。每个示例将使用者窗口大小设置为 300,000 字节。
流程
如果客户端使用 JNDI 来实例化其连接工厂,在连接字符串 URL 中包括
consumerWindowSize参数。将 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=300000Copy 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