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,客户端可以调用 ConnectionFactorysetProducerWindowSize(int producerWindowSize) 方法以直接设置窗口大小。

如果使用 core API,可以使用 ServerLocatorsetProducerWindowSize(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) 方法在客户端上设置最大速率。