19.2. 制作者流控制
JBoss EAP 消息传递还可以限制从客户端发送的数据量,以防止服务器接收过多的消息。
基于窗口的流控制
JBoss EAP 消息传递利用信用交换规范消息制作者。只要有足够的学分,生产者就可以发送消息到地址。发送邮件所需的信用金额由邮件大小决定。由于生产者的学分较低,他们必须从服务器请求更多。在服务器配置中,生产者一次请求的信用量称为 producer-window-size
,这是 connection-factory
元素的属性:
<connection-factory name="MyConnFactory" ... producer-window-size="1048576" />
窗口大小决定了任意时间可以内亮的字节数量,从而防止远程连接过载服务器。
使用管理 CLI 读取和写入给定连接工厂的 producer-window-size
属性。以下示例使用 RemoteConnectionFactory
,它包含在默认配置中并供远程客户端使用。
-
使用管理 CLI 读取
producer-window-size
属性:
subsystem=messaging-activemq/server=default/connection-factory=RemoteConnectionFactory:read-attribute(name=producer-window-size) { "outcome" => "success", "result" => 65536 }
-
使用管理 CLI 编写
producer-window-size
属性:
/subsystem=messaging-activemq/server=default/connection-factory=RemoteConnectionFactory:write-attribute(name=producer-window-size,value=65536) {"outcome" => "success"}
如果使用 Jakarta Messaging,客户端可以调用 ConnectionFactory
的 setProducerWindowSize(int producerWindowSize)
方法以直接设置窗口大小。
如果使用 core API,可以使用 ServerLocator
的 setProducerWindowSize(int producerWindowSize)
方法设置窗口大小。
阻塞基于 Producer Window 的流控制
通常,消息传递服务器始终提供与请求相同的分数。但是,可以限制服务器发送的信用量,这可以防止因为生产者发送超过一次可处理的消息而耗尽内存。
例如,如果您有一个名为 myqueue
的 Jakarta 消息队列,并且您将最大内存大小设置为 10MB,服务器将规定队列中的消息数量,使其大小永不会超过 10MB。当地址变满时,生产者将在客户端阻止,直到地址上有足够的空间可用。
阻止制作者流控制是分页的一种替代方法,它不会阻止生产者,而是将信息页到存储。如需更多信息 ,请参阅 关于分页。
address-setting
配置元素包含用于管理阻止制作者流控制的配置。address-setting
用于将一组配置应用到该地址注册的所有队列。有关如何进行此操作的更多信息,请参阅配置地址设置。
对于需要阻止制作者流控制的每个 address-setting
,您必须包含 max-size-bytes
属性的值。绑定到该地址的所有队列的总内存不能超过 max-size-bytes
。对于 Jakarta Messaging 主题,这意味着主题中所有订阅的总内存不能超过 最大大小。
您还必须将 address-full-policy
属性设置为 BLOCK
,以便服务器知道如果达到 max-size-bytes,
则应阻止制作者。以下是设置了这两个属性 的 address-setting
示例:
<address-setting ... name="myqueue" address-full-policy="BLOCK" max-size-bytes="100000" />
上例会将 Jakarta Messaging 队列"myqueue"的最大大小设置为 100000
字节。达到最大大小后,生产者将被阻止发送到该地址。
使用管理 CLI 设置这些属性,如下例所示:
-
为指定
address
-setting 设置 max-size-
bytes
/subsystem=messaging-activemq/server=default/address-setting=myqueue:write-attribute(name=max-size-bytes,value=100000) {"outcome" => "success"}
-
为指定的
address-
setting 设置 address-full-
policy
/subsystem=messaging-activemq/server=default/address-setting=myqueue:write-attribute(name=address-full-policy,value=BLOCK) {"outcome" => "success"}
速率限制流控制
如果您为它所使用的
每秒可发送的消息数量,如下例所示:
connection-factory
指定制作者/最大值,请限制生产者
<connection-factory name="MyConnFactory" producer-max-rate="1000" />
默认值为 -1,它会
禁用速率限制流控制。
使用管理 CLI 读取和写入 producer-max-rate
的值。以下示例使用 RemoteConnectionFactory
,它包含在默认配置中并供远程客户端使用。
-
阅读
producer-max-rate
属性的值:
/subsystem=messaging-activemq/server=default/connection-factory=RemoteConnectionFactory:read-attribute(name=producer-max-rate) { "outcome" => "success", "result" => -1 }
-
编写
producer-max-rate
属性的值:
/subsystem=messaging-activemq/server=default/connection-factory=RemoteConnectionFactory:write-attribute(name=producer-max-rate,value=100) {"outcome" => "success"}
如果使用 core API,请使用方法 ServerLocator.setProducerMaxRate(int producerMaxRate)
来设置速率。
如果您使用 JNDI 来实例化和查找连接工厂,则可以使用实例化连接工厂的 setProducerMaxRate(int producerMaxRate)
方法在客户端上设置最大速率。