4.5. 配置消息持久性
默认情况下,AMQ Broker 不会持久保留(即存储)消息数据。AMQ Broker 有两个选项用于持久性消息数据:
- 在日志中保留消息.如果您启用持久性,这是保留消息的默认方法。基于日志的持久性是一种高性能选项,可将消息写入到文件系统中的日志中。
- 持久保留数据库中的消息.此选项使用 Java 数据库连接(JDBC)连接,将消息持久化到您选择的数据库。
有关 AMQ Broker 支持哪些数据库和网络文件系统的当前信息,请参阅红帽客户门户网站中的 Red Hat AMQ 7 支持的配置。
4.5.1. 配置基于日志的持久性 复制链接链接已复制到粘贴板!
当您启用持久性时,消息默认保留在日志文件中。
流程
-
编辑用于代理部署的
ActiveMQArtemis
自定义资源(CR)。 将
persistenceEnabled
属性设置为true
。例如:spec: ... deploymentPlan: persistenceEnabled: true ...
spec: ... deploymentPlan: persistenceEnabled: true ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 保存 CR。
4.5.2. 配置数据库持久性 复制链接链接已复制到粘贴板!
您可以使用 Java 数据库连接(JDBC)连接将 AMQ Broker 配置为持久保留数据库中的消息。
当您将消息数据存储在数据库中时,代理使用 Java 数据库连接(JDBC)连接将消息和绑定数据存储在数据库表中。表中的数据使用 AMQ Broker 日志编码进行编码。有关支持的数据库的详情,请参考红帽客户门户网站中的 Red Hat AMQ 7 支持的配置。
管理员可能会选择根据组织更广泛的 IT 基础架构要求将消息数据存储在数据库中。但是,使用数据库可能会对消息传递系统的性能造成负面影响。具体来说,通过 JDBC 将消息传递数据写入数据库表可为代理造成显著的性能开销。
前提条件
- 用于 AMQ Broker 的专用数据库。
- 代理在运行时为代理提供所需的 JDBC 驱动程序 JAR 文件。有关如何在运行时将 JAR 文件提供给代理的详情,请参考 第 4.4 节 “添加第三方 JAR 文件”。
-
部署只有一个代理实例。为确保部署具有单一代理实例,请确保
deployment.size
属性不在ActiveMQArtemis
自定义资源(CR)中。当 CR 中省略deployment.size
属性时,会部署单个代理实例。
流程
-
编辑用于代理部署的
ActiveMQArtemis
自定义资源(CR)。 使用
brokerProperties
属性启用 JDBC 数据库持久性。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - storeConfiguration
-
指定
DATABASE
值,以将消息持久化到 JDBC 数据库。 - storeConfiguration.jdbcDriverClassName
JDBC 数据库驱动程序的完全限定域名。例如,
org.postgresql.Driver
。有关支持的数据库的详情,请参考红帽客户门户网站中的 Red Hat AMQ 7 支持的配置。
- storeConfiguration.jdbcConnectionUrl
您的数据库服务器的完整 JDBC 连接 URL,包括数据库名称和所有配置参数。例如:
jdbc:postgresql://postgresql-service.default.svc.cluster.local:5432/postgres?user=postgres&password=postgres
在示例中,数据库名称为
postgres
。- HAPolicyConfiguration
-
设置为
SHARED_STORE_PRIMARY
,以确保代理使用 JDBC 租期锁定来防止多个代理并行访问数据库表。如果错误地部署了第二个代理实例,租期锁定会阻止第二个代理写入数据库。
(可选)根据需要更改以下属性的默认值:
- storeConfiguration.jdbcNetworkTimeout
- JDBC 网络连接超时,以毫秒为单位。默认值为 20000 毫秒。
- storeConfiguration.jdbcLockRenewPeriod
-
当前 JDBC 锁定的续订周期的长度(以毫秒为单位)。当这个时间过后,代理可以续订锁定。设置一个比
storeConfiguration.jdbcLockExpiration
值小多次的值,为代理提供足够时间来扩展租期的值,并为代理提供在连接问题时尝试续订锁定的时间。默认值为 2000 毫秒。 - storeConfiguration.jdbcLockExpiration
-
以毫秒为单位,当前 JDBC 锁定被视为拥有(即获取或续订),即使
storeConfiguration.jdbcLockRenewPeriod
的值已经过。代理定期尝试根据storeConfiguration.jdbcLockRenewPeriod
的值定期更新它拥有的锁定。例如,如果代理无法更新锁定,例如因为连接问题,代理会持续尝试续订锁定,直到storeConfiguration.jdbcLockExpiration
的值被传递,因为锁定上次成功获取或更新。上述续订行为的一个例外是在另一个代理获取锁定时。如果数据库管理系统(DBMS)和代理之间存在时间对齐,或者对垃圾回收有较长的暂停,会出现这种情况。在这种情况下,最初拥有锁定的代理会考虑锁定丢失,且不会尝试更新它。如果 JDBC 锁定尚未由当前在过期时间后拥有它的代理更新,则另一个代理可以建立 JDBC 锁定。默认值为 20000 毫秒。 - storeConfiguration.jdbcJournalSyncPeriod
- 代理日志与 JDBC 同步的时间(以毫秒为单位)。默认值为 5 毫秒。
- storeConfiguration.jdbcMaxPageSizeBytes
- 当 AMQ Broker 将消息保留到 JDBC 数据库时,每个页面文件的最大大小(以字节为单位)。默认值为 102400,即 100KB。您指定的值还支持字节表示法,如 "K" "MB" 和 "GB"。
- 保存 CR。