Artemis - 内存和日志之间的消息同步
Artemis - Messages Sync Between Memory & Journal
阅读 artemis 文档时了解到 - artemis 将整个当前活动消息存储在内存中,并且可以根据设置将消息卸载到给定 queue/topic 的分页区域,并且 artemis 日志仅附加。
关于这个
- 代理如何以及何时从日志同步消息(仅在重启期间?)
- 它如何识别要从日志中删除的消息(例如:如果日志是仅追加模式,如果持久消息的消费者确认消息,那么代理如何从日志中删除单个消息而不保留索引) .
- 将每条活动消息都保存在内存中,甚至使代理内存不足,这不是对性能的影响吗?为避免这种情况,必须在配置中设置每个 queue/topic 分页设置,否则代理可能会填充所有消息。如有不妥请指正
任何可以解释消息同步的参考资料 link 和这些信息都是有帮助的。尽管 Artemis 文档解释了仅附加模式,但可能是解释这些存储概念的任何 section/article,我可能会遗漏。
默认情况下,持久消息会在代理收到消息后以及代理向客户端发回消息已收到的响应之前保存到磁盘。通过这种方式,客户端可以肯定地知道,如果它收到来自代理的响应,它发送的持久消息已被接收并保存到磁盘。
在broker.xml
中使用NIO
journal-type
时(即默认配置),数据使用java.nio.channels.FileChannel.force(boolean)同步到磁盘。
由于日志在正常操作期间是仅附加的,因此当一条消息被确认时,它实际上并没有从日志中删除。代理只是将删除记录附加到该特定消息的日志中。该消息随后将在“压缩”期间从日志中物理删除。此过程由 broker.xml
中的 journal-compact-min-files
& journal-compact-percentage
参数控制。有关详细信息,请参阅 the documentation。
将消息数据保存在内存中实际上 显着提高了性能 与将其从内存中逐出然后必须稍后从磁盘读回相比。正如您所注意到的,这可能会导致内存消耗问题,这就是代理支持分页、阻塞等的原因。要记住的主要事情是消息代理不是像数据库这样的存储介质。寻呼是一种姑息措施,旨在作为保持代理运行的最后手段。理想情况下,代理应该配置为在没有分页的情况下处理预期的负载(例如,获取更多 RAM,分配更多堆)。换句话说,消息生产和消息消费应该是平衡的。代理旨在让消息流经。它当然可以缓冲消息(可能是数百万,具体取决于配置和硬件)但是当它被迫分页时性能会大幅下降,因为磁盘比 RAM 慢几个数量级。
阅读 artemis 文档时了解到 - artemis 将整个当前活动消息存储在内存中,并且可以根据设置将消息卸载到给定 queue/topic 的分页区域,并且 artemis 日志仅附加。
关于这个
- 代理如何以及何时从日志同步消息(仅在重启期间?)
- 它如何识别要从日志中删除的消息(例如:如果日志是仅追加模式,如果持久消息的消费者确认消息,那么代理如何从日志中删除单个消息而不保留索引) .
- 将每条活动消息都保存在内存中,甚至使代理内存不足,这不是对性能的影响吗?为避免这种情况,必须在配置中设置每个 queue/topic 分页设置,否则代理可能会填充所有消息。如有不妥请指正
任何可以解释消息同步的参考资料 link 和这些信息都是有帮助的。尽管 Artemis 文档解释了仅附加模式,但可能是解释这些存储概念的任何 section/article,我可能会遗漏。
默认情况下,持久消息会在代理收到消息后以及代理向客户端发回消息已收到的响应之前保存到磁盘。通过这种方式,客户端可以肯定地知道,如果它收到来自代理的响应,它发送的持久消息已被接收并保存到磁盘。
在broker.xml
中使用NIO
journal-type
时(即默认配置),数据使用java.nio.channels.FileChannel.force(boolean)同步到磁盘。
由于日志在正常操作期间是仅附加的,因此当一条消息被确认时,它实际上并没有从日志中删除。代理只是将删除记录附加到该特定消息的日志中。该消息随后将在“压缩”期间从日志中物理删除。此过程由 broker.xml
中的 journal-compact-min-files
& journal-compact-percentage
参数控制。有关详细信息,请参阅 the documentation。
将消息数据保存在内存中实际上 显着提高了性能 与将其从内存中逐出然后必须稍后从磁盘读回相比。正如您所注意到的,这可能会导致内存消耗问题,这就是代理支持分页、阻塞等的原因。要记住的主要事情是消息代理不是像数据库这样的存储介质。寻呼是一种姑息措施,旨在作为保持代理运行的最后手段。理想情况下,代理应该配置为在没有分页的情况下处理预期的负载(例如,获取更多 RAM,分配更多堆)。换句话说,消息生产和消息消费应该是平衡的。代理旨在让消息流经。它当然可以缓冲消息(可能是数百万,具体取决于配置和硬件)但是当它被迫分页时性能会大幅下降,因为磁盘比 RAM 慢几个数量级。