20.10. 持久化

20.10.1. 关于 HornetQ 里的持久化

HornetQ 处理自己的持久化。它附带为专有消息用例进行了优化的高性能日志。
HornetQ 日志只使用可配置的文件大小进行附加,它通过单个写入操作来提高性能。它包含一系列文件,开始时都以固定大小预先创建并填充空白内容。当执行服务器操作(add message、delete message、update message 等)时,操作记录会附加到日志后面,直至日志文件已满,此时将使用下一个日志文件。
复杂的垃圾收集算法确定日志文件在所有数据被删除后是否被回收并重用。压缩算法将从日志文件删除无效空间并压缩数据。
日志也完全支持本地和 XA 事务。
日志的主要部分是用 Java 编写的,但和文件系统的交互已经抽象化为不同的可插入实现。HornetQ 附带的两个实现是:
  • Java New I/O (NIO)
    使用标准的 Java NIO 与文件系统交互。这提供了极佳的性能且可以运行在任何装有 Java 6 或更高版本的平台上。
  • Linux Asynchronous IO (AIO)
    使用 Native Code Wrapper 和 Linux Asynchronous IO Library(AIO)进行交互。通过 AIO,HornetQ 在数据已被持久化时接收消息。这避免了对显性同步的需要。AIO 通常会提供比 Java NIO 更好的性能,但它要求 Linux kernel 2.6 或更高的版本以及 libaio 软件包。
    AIO 也要求 ext2、ext3、ext4、jfs 或 xfs 文件系统。
标准的 HornetQ 核心服务器使用下列日志实例:
  • bindings journal
    存储和绑定相关的数据,包括部署在服务器上的队列及其属性。它也存储 ID 序列计数器等数据。绑定日志总是 NIO 日志,因为和消息日志相比它通常具有较低的吞吐量。
    这个日志里的文件的前缀是 hornetq-bindings。每个文件都有一个绑定扩展名。文件大小是1048576 字节,它位于 bindings 文件夹里。
  • JMS journal
    存储所有和 JMS 相关的数据,如任何 JMS 队列、主题或连接工厂以及用于这些资源的 JNDI 绑定。用管理 API 创建的任何 JMS 资源都保存在这个日志里,而用配置文件配置的资源则不会。这个日志只有在使用 JMS 时才会被创建。
  • message journal
    存储所有和消息相关的数据,包括消息本身及 duplicate-id 缓存。在默认情况下,HornetQ 将 AIO 用于这个日志。如果 AIO 不可用,它将自动退回为 NIO。
大型消息是在消息日志之外持久化的。在内存低的环境里,可以配置 HornetQ 将消息页面化到磁盘上。如果不需要持久化,可以配置 HornetQ 不持久化任何数据。