第 3 章 新的和更改的功能
本节介绍了 AMQ Broker 7.11 中突出显示的一组增强功能和新功能。
- CR 中的 image 和 version 属性的验证更改
在 7.11.5 中,Operator 验证 CR 中的 image 和 version 属性的配置与之前的版本不同。
在 7.11.5 之前,Operator 会验证 CR 没有:
-
没有
spec.deploymentPlan.initImage
属性的spec.deploymentPlan.image
属性,反之亦然。 -
带有 spec.deploymentPlan.
image 和
属性的spec.deploymentPlan
.initImagespec.version
属性,或两者。
在 7.11.5 中,Operator 继续验证 CR 没有
spec.deploymentPlan.image
属性,但没有spec.deploymentPlan.initImage
属性,反之亦然。在 7.11.5 中,Operator 验证被修改为同时验证:spec.version
属性中指定的版本号(如果存在)与部署的代理容器镜像版本匹配。如果版本不同,Operator 会将 CR 中的
BrokerVersionAligned
条件的状态设置为Unknown
以突出显示不匹配的信息,但不匹配不会影响部署中运行的代理。CR 没有
spec.deploymentPlan.image
和spec.deploymentPlan.initImage
属性,没有spec.version
属性。如果 CR 的
spec.deploymentPlan.image
和spec.deploymentPlan.initImage
属性没有spec.version
属性,Operator 会将 CR 中的Valid
条件的状态设置为Unknown
以警告配置不完整。注意缺少
spec.version
属性会导致 Operator 每次升级 Operator 时在部署中重启代理 Pod。Pod 重启是必需的,因为 Operator 使用最新支持的代理版本更新 StatefulSet 中的标签,除非在spec.version
属性中明确设置了版本号。要防止每个将来的 Operator 升级都重启代理,您必须设置 CR 中的
spec.version
属性中部署的代理的版本号。-
在 7.11.5 中,您可以在启动代理后在 CR 的
status
部分找到部署的代理的版本号。如需更多信息,请参阅在 Openshift 上部署 AMQ Broker 中的 查看代理部署的状态信息。 在 7.11.5 之前,您可以使用 OpenShift Container Platform Web 控制台在代理 Pod 的日志文件中找到版本号:
-
单击
。 - 点代理 Pod 名称。
点 Logs 选项卡。
版本号显示在日志输出顶部的
Artemis
横幅后。
-
单击
-
在 7.11.5 中,您可以在启动代理后在 CR 的
注意具有 Unknown 状态值为
Unknown
的条件不会阻止 Operator 完成代理部署。-
没有
- 可以自定义 Operator 的领导选举设置
从 7.11.5 开始,您可以自定义 Operator 用于领导选举机制的设置。如果使用 Operator Hub 安装 Operator,您可以使用 OpenShift Container Platform Web 控制台在安装 Operator 后在 Operator 订阅中配置领导选举设置。如果使用 OpenShift Container Platform 命令行界面安装 Operator,您可以在 Operator 配置文件
operator.yaml
中配置领导选举设置,可以是在安装 Operator 之前或之后。以下是在
operator.yaml
文件中配置的领导选举设置示例:apiVersion: apps/v1 kind: Deployment ... template ... spec: containers: - args: - --leader-elect - --lease-duration=60 - --renew-deadline=40 - --retry-period=5 ...
以下是 Operator 订阅中配置的领导选举设置示例:
apiVersion: operators.coreos.com/v1alpha1 kind: Subscription ... spec: ... config: env: - name: ARGS value: "--leader-elect --lease-duration=60 --renew-deadline=60 --retry-period=5"
leader-elect
:让 Operator 能够与其他实例一起竞争领导选举机制,以确保一次没有多个实例运行。lease-duration
: 持续时间(以秒为单位),非领导 Operator 会在尝试获取之前领导未续订的租期前等待。默认值为15
。renew-deadline
:领导 Operator 在尝试续订领导角色前等待的持续时间(以秒为单位)。默认值为10
。retry-period
: Operator 在尝试获取和更新领导角色之间等待的时间(以秒为单位)。默认值为2
。- 可以更新 address-settings 元素中的单个属性
-
在 7.11.5 中,您可以使用 Jolokia REST 接口以 JSON 格式更新
address-settings
元素中的独立属性。在以前的版本中,如果要更新address-settings
元素中的属性或属性子集,则需要在 update 操作中包含所有未更改的address-settings
属性。 - 警告级别消息在 Critical Analyzer 中变为错误级别
-
在 7.11.5 中,Critical Analyzer 为之前分配了
WARN
级别的消息分配一个ERROR
级别。 - 新的参数,以更好地控制页面消息流到内存中
在 7.11.3 之前,您可以通过设置
max-read-page-bytes
和max-read-page-messages
参数的限值来控制 paged 消息流。在应用这些限制时,代理会计算内存中的消息,这些消息已准备好发送到当前提供的消费者和消息。如果消费者需要确认消息,则当前交付的消息可以使用内存或消息限制,这会阻止代理将新消息读取在内存中。因此,代理可能会耗尽消息。从 7.11.3 开始,您可以为两个新参数设置限值,以控制分页消息流到内存中。在应用这些限制时,代理不会考虑发送消息。
-
预抓取页字节
内存(以字节为单位),可用于将页面消息读取到每个队列的内存。默认值为 20MB。 -
Prefetch-page-messages
Number of paged 消息,代理可以从磁盘读取到每个队列的内存。默认值为 -1,这意味着没有应用任何限制。
如果消费者确认消息较慢,您可以增加 max-read-
page-bytes 和
参数的默认限制,以提供提供消息的容量。然后,max-read
-page-messageprefetch-page-bytes
和prefetch-page-messages
参数的默认限制允许代理将新消息读取到内存中。注意如果在
prefetch-page-bytes
参数的值前达到max-read-page-bytes
参数的值,代理将停止将进一步页面的消息读入内存中。- AMQ 核心协议 JMS 客户端可以切换到集群中的其他实时代理
- 在 7.11.2 之前,如果 AMQ Core Protocol JMS 客户端丢失与 live 代理的连接,则只能在两个代理都配置为实时/备份对以进行高可用性(HA)时,它才能切换到备份代理。从 7.11.2 开始,AMQ Core Protocol JMS 客户端可以配置为切换到 HA 对中的备份代理或集群中的任何其他实时代理。
要使客户端能够切换到集群中的任何实时代理,请在客户端的连接 URI 中指定
failoverAttempts
配置选项。例如:-
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(“(tcp://host1:port,tcp://host2:port,tcp://host3:port,tcp://host4:port,tcp://host5:port)?ha=true&failoverAttempts=2&reconnectAttempts=2”);
将 failoverAttempts
选项设置为 2 时,客户端会尝试连接到集群中的 2 个其他实时代理。如果客户端在非 HA 配置以及 HA 配置中的 live 和 backup 代理都失败,则会发生故障转移尝试。
示例中所示的 reconnnectAttempts
配置选项仅在 HA 对中配置了两个代理时从 live 代理切换到备份代理。
- 当 AMQ Broker 使用 JDBC 持久性时,分页性能会改进
-
从 7.11.2 开始,当 AMQ Broker 配置为使用 JDBC 持久性时,会提高分页性能。作为分页改进的一部分,一个新的参数
jdbc-max-page-size-bytes
,在使用 JDBC 时,将页大小限制为 100KB。您可以自定义默认限制。如需更多信息,请参阅配置 AMQ Broker 中的配置 JDBC 持久性。 - 联邦消息的批处理
- 如果您的队列上的积压超过本地使用者的可用容量,则任何低优先级联邦消费者都会成为接收消息的候选者。最终,太多消息可能会移到联邦消费者,并导致在其他集群中发生相同的场景,因此消息在代理间移动的结果。
从 7.11.2 开始,您可以将联邦消费者配置为仅在本地队列超过容量时拉取消息的批处理。因此,联邦不会移动超过联邦消费者可以处理的消息,这样可避免消息在代理间移动的情况。
要将联邦消费者配置为拉取消息的批处理,请在联邦消费者的连接 URI 上将 consumerWindowSize
值设置为 0。
tcp://<host>:<port>?consumerWindowSize=0
将 consumerWindowSize
值设置为 0
时,AMQ Broker 使用匹配地址的地址设置中的 defaultConsumerWindowSize
属性的值来确定在代理间移动消息的批处理大小。defaultConsumerWindowSize
属性的默认值为 1048576
字节。
使用此批量操作模式用于活跃代理之间的双向联邦。
有关联邦的更多信息,请参阅配置 AMQ Broker 中的 联邦 地址和队列。
- 代理启动健康检查
- 从 7.11.2 开始,您可以配置启动探测来检查 OpenShift Container Platform 容器中 AMQ Broker 应用程序是否已成功启动。要了解如何配置健康检查,请参阅在 Openshift 上部署 AMQ Broker 中的 配置代理健康检查。
- 限制用于分页的磁盘空间
- 如果将 AMQ Broker 配置为页面信息,您可以限制用于页面传入消息的磁盘空间,以防止分页操作使用过量磁盘空间。如需更多信息,请参阅配置 AMQ Broker 中的特定地址在分页过程中限制磁盘用量。
- 限制用于从分页读取的消息的内存
- 如果将 AMQ Broker 配置为页面信息,您可以在客户端准备好使用消息时限制代理从磁盘传输到内存的消息的内存。如需更多信息,请参阅配置 AMQ Broker 中的将页面消息流控制到内存中。
如果客户端应用程序缺少太多消息待处理确认,代理不会在确认待处理消息前读取页面消息,这会导致代理上出现消息不足。
例如,如果将页面消息传输到内存(默认为 20MB)的限值被访问,则代理会在读取任何更多消息前等待来自客户端的确认。如果同时,客户端在向代理发送确认前等待接收足够消息(由客户端使用的批处理大小决定),代理会耗尽消息。
为避免不足,可以将控制页面消息传输的代理限制增加到内存中,或减少传递消息的数量。您可以通过确保客户端很快提交消息确认,或使用超时和提交确认(不从代理接收更多消息)来减少发送消息的数量。
您可以在 AMQ 管理控制台中看到在队列的 Delivering Count
和 Delivering Bytes
指标中传递消息的编号和大小。
- Log4j 2 日志记录支持
- 从 7.11 开始,AMQ Broker 使用 Log4j 2 日志记录工具,而不是 JBoss Logging 框架来提供消息日志记录。您可以在 OpenShift Container Platform 和 RHEL 平台上自定义 Log4j 2 日志记录配置。
- 更改 Operator 日志记录级别
- 在 OpenShift Container Platform 上的 AMQ Broker 7.11 中,您可以更改默认日志级别,以增加或减少写入 Operator 日志的详细信息。如需更多信息,请参阅在 Openshift 上部署 AMQ Broker 中的更改 Operator 的日志级别。
- 支持 Java 身份验证和授权服务(JAAS)登录模块
- 在 OpenShift Container Platform 上的 AMQ Broker 7.11 中,您可以在 secret 中配置 JAAS 登录模块,而不使用 ActiveMQArtemisSecurity CR 为 AMQ Broker 配置用户身份验证和授权。通过在 secret 中配置 JAAS 登录模块,您可以在属性文件中更新用户和角色信息,而无需重启代理。另外,您可以配置在 CR 中不可配置的登录模块,如 LDAP。如需更多信息,请参阅在 Openshift 上部署 AMQ Broker 中的在 secret 中配置 JAAS 登录模块。
- 限制升级
- 在 OpenShift Container Platform 上的 AMQ Broker 7.11 中,Operator 会自动将代理容器镜像升级到最新的可用版本。您可以为部署配置自定义资源(CR),以防止自动升级,或者只允许自动升级到特定版本或特定代理和 init 容器镜像。
如果要限制自动升级,则必须在 CR 中指定组合的 spec.deploymentPlan.image
和 spec.deploymentPlan.initImage
属性,但不能同时指定 CR 中的 spec.deploymentPlan.
image 和 spec.deploymentPlan.initImage 属性。
如需更多信息,请参阅在 Openshift 上部署 AMQ Broker 中的 限制自动升级。
- 扩展状态报告
在 OpenShift Container Platform 上的 AMQ Broker 7.11 中,Operator 在主代理 CR 中报告的状态信息被扩展为包括:
- CR 内容的有效性。
-
在
brokerProperties
属性中配置的属性应用。 - 将 secret 中的 Java 身份验证和授权服务(JAAS)登录模块文件传播到代理 Pod。
- 部署的代理版本,以及该版本的代理和 init 容器镜像的 URL。
- 将主要、次版本、补丁和安全升级应用到部署的能力。
- 同步镜像支持
- 从 7.11 开始,您可以在代理之间配置同步镜像,以确保消息同时写入镜像中的所有代理卷。通过使用同步镜像,您可以确保已镜像的代理是灾难恢复的最新代理。如需更多信息,请参阅配置 AMQ Broker 中的配置代理连接。
- Pod 中断预算
- 在 OpenShift Container Platform 上的 AMQ Broker 7.11 中,您可以配置 Pod 中断预算,以指定集群中必须同时可用的最少的 Pod 数量,如维护窗口。如需更多信息,请参阅在 OpenShift 上部署 AMQ Broker 中的 配置 Pod 中断预算。
- brokerProperties 配置存储在 mutable secret 中
-
在 OpenShift Container Platform 上的 AMQ Broker 7.11 中,使用 CR 中的
brokerProperties
属性创建的配置存储在 mutable secret 中。可以在不需要代理重启的情况下更新可变 secret。因此,代理定期重新载入配置时应用配置更新,除了特别需要代理重启的任何更新外。 - 控制嵌入式 Web 服务器的操作
-
从 7.11 开始,您可以通过在 ActiveMQServerControl JMX MBean 中使用
stopEmbeddedWebServer
,startEmbeddedWebServer
和restartEmbeddedWebServer
操作为 AMQ Broker 停止和重启嵌入式 Web 服务器。通过使用这些操作,您可以避免在更新 AMQ Broker 的 SSL 证书时重启 AMQ Broker。 - 用于登录到 AMQ 管理控制台的凭证用于发送消息
在之前的 AMQ Broker 版本中,需要在 AMQ Management Console Preferences 页面中指定用户名和密码,以便在 AMQ 管理控制台中发送消息。从 7.11 开始,消息会使用您用来登录到 AMQ 管理控制台的凭据发送。
您可以覆盖默认行为,并指定不同的凭证来发送单个消息。如需更多信息,请参阅 管理 AMQ Broker 中的 向地址 发送信息。
- OpenShift Container Platform 上的 AMQ Broker 已预先配置,以便为 Prometheus 收集指标数据
- 在 OpenShift Container Platform 上的 AMQ Broker 7.11 中,AMQ Broker 容器 Pod 已预先配置,以便 Prometheus Operator Service Monitor 收集指标数据。在以前的版本中,您需要公开 Service Monitor 需要的端口来收集指标数据。
- 为代理容器设置环境变量
-
在 OpenShift Container Platform 上的 AMQ Broker 7.11 中,您可以在传递给每个代理容器的自定义资源(CR)中设置环境变量。例如,您可以添加
TZ
环境变量来设置代理容器的时区。如需更多信息,请参阅在 OpenShift 上部署 AMQ Broker 中的为代理容器设置环境变量。 - OpenShift Container Platform 上的代理转发支持
- 在 OpenShift Container Platform 上的 AMQ Broker 7.11 中,嵌入的 Web 服务器(托管 AMQ 管理控制台)已预先配置,以处理 X-Forwarded 标头。通过处理 X-Forwarded 标头,AMQ 管理控制台可以接收当涉及请求路径时更改或丢失的标头信息。例如,AMQ 管理控制台使用 HTTP,但 OpenShift Container Platform 路由器(一个代理)使用路由器终止的 HTTPS 路由公开 AMQ 管理控制台。从 X-Forwarded 标头中,AMQ 管理控制台可以识别浏览器和路由器之间的连接使用 HTTPS 并切换到 HTTPS 来提供浏览器请求。
- 只有在
brokerProperties
CR 属性中才支持一些重新发送属性 如果 7.8.x 或 7.9.x 部署有在
spec.deploymentPlan.addressSettings.addressSetting
CR 元素中配置的redeliveryDelayMultiplier
或redeliveryCollisionAvoidanceFactor
属性,则在升级到 7.11.x 后,您必须在brokerProperties
CR 属性中配置这些属性。这是必要的,因为这两个属性的数据类型从浮点改为 7.10.0 中的字符串。因此,spec.deploymentPlan.addressSettings.addressSetting
属性中不再支持这些属性。以下示例演示了如何在
brokerProperties
元素中配置这两个属性:spec: ... brokerProperties: - "addressSettings.#.redeliveryMultiplier=2.1" - "addressSettings.#.redeliveryCollisionAvoidanceFactor=1.2" ...
注意在
brokerProperties
属性中,使用redeliveryMultiplier
属性名称而不是spec.deploymentPlan.addressSetting
元素中使用的redeliveryDelayMultiplier
属性名称。- 禁用 XML 外部实体(XXE)处理
-
如果您不需要将代理配置嵌套到
broker.xml
文件包含的独立文件中,您现在可以禁用 XXE 处理来防止 XXE 安全漏洞。红帽建议您尽可能禁用 XXE 处理。如需更多信息,请参阅配置 AMQ Broker 中的 禁用外部 XML 实体(XXE)处理。 - JGroups 5.x
- 7.10.0 使用 JGroups 3.x 前的 AMQ Broker 版本。AMQ Broker 7.11 使用 JGroups 5.x,它与 JGroups 3.x 向后兼容。在两个 JGroup 版本之间更改了一些协议和协议属性,因此您必须在升级到 AMQ Broker 7.11 时更改 JGroups 堆栈配置。
- 提取到特定目录名称的 AMQ Broker 归档内容
-
当您在 Red Hat Enterprise Linux 上提取 AMQ Broker 归档时,存档的内容将提取到当前目录中名为
apache-artemis-2.28.0.redhat-00019
的目录。 - Operator 频道
AMQ Broker Operator (
Red Hat Integration - AMQ Broker for RHEL 8 (Multiarch)
)可用于以下频道:-
7.11.x
- 此频道只为版本 7.11 提供更新,它是一个长期支持(LTS)频道。 -
7.10.x
- 此频道只为版本 7.10 提供更新,它是一个长期支持(LTS)频道。
-
无法通过切换频道来升级 Operator。您必须卸载现有的 Operator,并从适当的频道安装 Operator 的新版本。
要确定要选择的 Operator,请查看 Red Hat Enterprise Linux Container Compatibility Matrix。
- 进入 Prometheus 指标插件的类名称
-
在 AMQ Broker 7.11 中,AMQ Broker 中包含的 Prometheus 指标插件的类名称从
org.apache.activemq.artemis.core.server.metrics.plugins.ArtemisPrometheusMetricsPlugin
改为com.redhat.amq.broker.core.server.metrics.plugins.ArtemisPrometheusMetricsPlugin
。如果在 AMQ Broker 的早期版本中启用了 Prometheus metrics 插件,您必须在升级到 AMQ Broker 7.11 时更新broker.xml
配置文件中的类名称。如需更多信息,请参阅管理 AMQ Broker 中的将代理实例从 7.10.x 升级到 7.11.x。 - 更改了列表Producers API 方法返回的数据,以及列表ProducersInfoAsJSON JMX 方法
-
在 AMQ Broker 7.11 中,以下改进是如何
列出Producers
方法返回的数据,该方法由 AMQ 管理控制台使用:
-
在之前的版本返回的数据中,每个会话会显示一个制作者。因此,如果您使用 Core 协议创建了一个制作者,它会为每个处理程序创建两个会话,则会为每个会话显示单独的制作者。另外,如果您在不从制作者发送消息的情况下创建了制作者,则为制作者返回的地址为空。在 AMQ Broker 7.11 中,
列表Producers 方法返回
由核心协议创建的两个会话的单一制作者。此外,address 列会显示正确的地址,即使您在发送消息之前也是如此。 -
在以前的版本中,当使用匿名制作者使用 Core 或 AMQP 协议向多个地址发送消息时,每个地址会显示生成者。此外,显示的地址是制作者向其发送消息的第一个地址,它类似于发送到单个队列的常规制作者。在 AMQ Broker 7.11 中,当您使用匿名制作者向多个地址发送消息时,会为每个匿名制作者显示一个制作者。此外,该地址没有连接到特定地址,其值为
ANONYMOUS
。
在以前的版本中,listProducersInfoAsJSON
方法提供了特定会话发送到每个队列的消息计数。但是,此方法会错误地返回消息发送到的每个队列的制作者。例如,如果匿名制作者向 1000 个队列发送一条消息,此方法会返回 1000 个制作者。在 AMQ Broker 7.11 中,listProducersInfoAsJSON
方法现在准确返回与 listProducers
方法相同的数据,但采用不同的格式。
在 AMQ Broker 7.11 中,返回以下新指标数据:
消费者
messagesInTransit
-尚未确认的消息数
messagesInTransitSize
- 尚未确认的消息的总大小
messagesDelivered
- 发送的消息数
messagesDeliveredSize
- 发送的消息总量
messagesAcknow
ged - 确认的信息总数
messagesAcknowledgedAwaitingCommit
- 已确认的事务中消息总数,但等待提交
lastDeliveredTime
- 发送的最后一个消息的时间(毫秒)
lastAcknowledgedTime
- 确认最后一次消息的时间(毫秒)
producers
msgSent
- 生成者发送的消息数量
msgSizeSent
- 生成者发送的消息总量
lastProducedMessageID
- 发送的最后一个消息的 ID