并行存储转发是一种高吞吐量策略,可以让消息消费者跟上消息流的速度。在并行存储和转发的过程中,可能会在消息未持久化到硬盘时,接收到了消息消费的确认信息,所以在这种情况下就不需要再持久化到硬盘了。值得注意得是,如果使用了jms事务,就不能使用并行储存转发。因为并行存储和转发是不保证消息的一致性的。
Queue默认是使用并行存储转发的。当然也是可配置的。主要可配置项如下:
concurrentStoreAndDispatchQueues
concurrentStoreAndDispatchTopics
concurrentStoreAndDispatchTransactions
下面解析快慢两种消费者的情况下,并行存储转发的过程;
慢消费者:
1、producer发送一个消息M到destination
2、broker发送消息M到持久层。持久层中是一些负责写入消息到日志中的线程。
3、同时存储和转发。消息可能被转发给一个或者多个消费者。因为消费者较慢,在收到消息消费的确认信息之前,消息将被持久化到日志文件中。
4、收到消息消费的确认信息。
5、broker通知持久层删除日志文件中的消息。
(KahaDB的可回滚日志中,所以消息不会被直接删除,而是会记录一条信息到日子,表示这条消息已消费完成。等到一个日志文件中所有的消息都被消费完成后,才会删除或者归档这个日志文件)
快消费者:
1、producer发送一个消息M到destination
2、broker发送消息M到持久层。持久层中是一些负责写入消息到日志中的线程。
3、同时进行存储和转发。
4、消费者快速返回了消息消费完成的确认信息。
5、但受到所有消费者返回的确认信息后,便会通知持久层删除该消息。此时前面准备去持久化的消息还被阻塞着,这个时候便不再需要写入到持久层中。直接从内存中删除。
如果你要使KahaDB串行存储和转发,必须明确禁用并行存储转发。禁用Queue、topic、Transactions
<broker brokerName="broker" persistent="true" useShutdownHook="false">
...
<persistenceAdapter>
<kahaDB directory="activemq-data"
journalMaxFileLength="32mb"
concurrentStoreAndDispatchQueues="false"
concurrentStoreAndDispatchTopics="false"
concurrentStoreAndDispatchTransactions="false"
/>
</persistenceAdapter>
</broker>
下图展示串行存储和转发:
1、producer发送一个消息M到broker上的某个destination
2、broker发送消息到持久层。因为并行存储转发已关闭,消息将会被立即写入到日志文件中。
3、消息被分发到一个或多个消费者
4、消费者发送消息消费确认信息到broker
5、当broker收到所有消费者的确认信息后,broker通知持久层删除该消息。
为了避免丢失消息,JMS规范要求broker在发送给producer确认接收信息前把消息持久化。如果使用Jms事务中时,会将事务的相关信息也持久化。默认情况下,KahaDB并未如此配置。如果应用需要避免丢失信息,就需要对KahaDB的配置进行修改:
1、配置并行存储转发为false,使用串行存储转发
2、持久化时使用同步写入。配置enableJournalDiskSyncs为true。
另外,使用事务可以提升持久层的效率。因为事务是批量处理消息的。在事务提交之前,所有的消息都不会写入到message store中的。这样就减少了IO,每次事务提交进行一次IO,而不是每条消息进行一次IO。
- 大小: 9.3 KB
- 大小: 8.8 KB
- 大小: 7.4 KB
分享到:
相关推荐
4. **队列和主题**:在 ActiveMQ 中,Queue 是一种存储和转发机制,而 Topic 更像是广播机制。Queue 中的消息按顺序传递,而 Topic 中的消息可被多个订阅者并行接收。 5. **网络连接和协议**:ActiveMQ 支持多种...
消息队列,或称消息中间件,是一个存储和转发消息的组件。它在消息的传输过程中起到缓冲和临时存储的作用。主要优点包括: 1. **异步处理**:通过消息队列,服务间的通信可以异步进行,提高系统的响应速度。 2. **...
消息队列则是存储和转发这些消息的实体,确保消息被正确地发送和接收,即使发送方和接收方在时间上是不一致的。 JMS的跨平台性是通过其纯Java接口实现的,这意味着任何实现了JMS规范的提供商都可以在不同的操作系统...
- ** broker **:Kafka集群中的节点,负责存储、接收和转发消息。 ### 2. Kafka的工作流程 1. **生产者发送**:生产者将消息发送到指定的主题,可以设置消息的分区策略,如轮询、哈希等。 2. **分区分配**:Kafka...
Broker是Kafka集群中的节点,负责存储和转发消息。多个broker构成高可用的Kafka集群。 ## 2. Kafka的特点 - **高吞吐量**:Kafka通过批量发送消息和零拷贝技术实现了高性能。 - **持久化**:Kafka可以将消息持久化...
5. 代理(Broker):MQ服务器,负责管理消息队列,接收生产者发送的消息并转发给消费者,同时处理持久化、负载均衡和安全性等任务。 6. 路由(Routing):消息从生产者到消费者之间的路径选择,可以通过简单的队列...
服务器在该架构中扮演着消息存储和转发的角色,屏蔽了异常处理、缓冲区管理、异步操作等复杂细节,使通信更加灵活和高效。客户端和服务器之间是双向数据传输,这与ZMQ的管道模式(Push/Pull模式)单向传输的数据流...
6. **broker**:Kafka 集群中的服务器节点,负责存储和转发消息。 Kafka 的核心特性包括: - **高吞吐量**:Kafka 能够在单个集群上实现每秒处理数百万级别的消息。 - **持久性**:消息默认被持久化到磁盘,保证了...
- **Broker(代理)**:Kafka集群中的服务节点,负责消息的存储、处理和转发。 - **Consumer Group(消费组)**:多个Consumer可以组成一个Group,这样同一组内的多个Consumer可以同时消费同一个Topic的消息,但每条...
VHMsg可能提供了更轻量级、低延迟的消息传递机制,而ActiveMQ则作为后端消息队列,负责存储和转发消息,保证了消息的持久性和顺序性。这种组合使得开发者能够在分布式应用中实现灵活、可扩展的消息传递架构,例如,...
与ActiveMQ和Kafka不同,RabbitMQ不需要借助Zookeeper这样的外部协调工具来实现高可用性(HA)方案或存储集群元数据。集群的主要目的是为了提高可靠性,并通过水平扩展增加消息的吞吐量。 RabbitMQ 集群的核心在于...
在Java中,实现消息队列(Message Queue)通信通常涉及使用一些框架或库,如Apache ActiveMQ、RabbitMQ或者Java Message Service(JMS)。这些框架提供API来创建、发送、接收和管理消息。在ResponseQueueReader程序...