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 ...
- 保存 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 数据库持久性。例如:spec: ... brokerProperties: - storeConfiguration=DATABASE - storeConfiguration.jdbcDriverClassName=<class name> - storeConfiguration.jdbcConnectionUrl=jdbc:<URL> - HAPolicyConfiguration=SHARED_STORE_PRIMARY ...
- 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 值小于
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。