文章目录
1. activemq原理
- 生产者通过和activemq建立好的TransportConnection发送消息
- TransportConnection找到对应的RegionBroker
- RegionBroker根据消息类型找到消息对应的区域Region
- Region会找到消息的目的地
- 目的地会判断该消息是否需要持久化
- 将消息发送给对应的订阅者或消费者
- 通过消费者对应的TransportConnection发送消息
2. activemq消息持久化方式
消息持久化会降低消息传递的效率
- AMQ:文件存储,文件大小默认32M
- KahaDB:基于文件的本地数据库存储,速度没有AMQ快,但扩展性强
- JDBC:可以配置数据库的连接,将持久化信息存储到数据库中
- LevelDB:本地数据库储存形式,基于索引
3. JMS的可靠性机制
-
事务性会话
-
创建方式:通过创建session时,第一个参数设置为true,则为事务性会话
Session session=connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
-
消息确认方式:通过
session.commit();
该方法调用后,自动签收 -
重发:未调用
session.commit();
该方法,或者调用session.rollback();
方法消息会被重发
-
-
非事务性会话
-
创建方式:通过创建session时,第一个参数为false,第二个参数分为三类应答模式
Session session=connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); Session session=connection.createSession(Boolean.FALSE, Session.CLIENT_ACKNOWLEDGE); Session session=connection.createSession(Boolean.FALSE, Session.DUPS_OK_ACKNOWLEDGE);
-
AUTO_ACKNOWLEDGE
- 消息确认方式:当receive方法或者onMessage方法返回后,自动签收
- 重发:方法未成功调用的消息会重发
-
CLIENT_ACKNOWLEDGE
- 消息确认方式:通过
textMessage.acknowledge();
该方法调用后,之前收到的消息会被确认 - 重发:未调用
session.commit();
该方法,消息会被重发
- 消息确认方式:通过
-
DUPS_OK_ACKNOWLEDGE
- 消息确认方式:延迟签收与AUTO_ACKNOWLEDGE方式类似,是自动签收,区别在于,会延迟一段时间,批量确认多条消息的签收成功,这也就导致了可能存在客户端实际已经签收,但是由于延迟时间而未被标记签收成功,服务会进行重复消息的发送,所以客户端需要保证客户端能够保证幂等
- 重发:未被自动签收的消息会被重发
-
-
4. activemq的高性能方案
-
静态网络连接:
-
概念:通过配置两个activemq中的broker的tcp连接以及允许消息回流的机制,保证两个activemq之间的消息能够进行消息的流转
-
原理:静态网络连接实际是将brokerA作为一个消费者订阅另一个brokerB的消息,但前提条件是brokerA有该条消息的消费者,这样消息才会被转发到brokerA,而消息回流是防止消息流转后的丢失。
静态网络连接:
消息回流:
-
-
动态网络连接:
- 概念:通过multilcast,配置一个主播的IP地址,所有的Broker都会去连接主播的IP地址
5. activemq的高可用方案
-
zookeeper+activemq:
-
实现方式:
-
配置kahaDB的持久化方式
-
启动zookeeper服务器
-
启动activeMQ
-
-
参数说明:
- directory: levelDB数据文件存储的位置
- replicas:计算公式(replicas/2)+1 , 当replicas的值为2的时候, 最终的结果是2. 表示集群中至少有2台是启动的
- bind: 用来负责slave和master的数据同步的端口和ip
- zkAddress: 表示zk的服务端地址
- hostname:本机ip
-
-
jdbc存储的主从方案
- 通过LOCK锁表的方式实现master/slave
6. activemq与其他mq比较
- Activemq:采用Java实现,相对稳定,版本更新缓慢,支持持久化事务,但并发量支持较差
- RabbitMQ:文档较全,社区活跃,支持事务和持久化
- Kafaka:对高并发支持较好,但对事务和持久化不支持,会出现事件丢失适用于日志和数量统计等场景