2019独角兽企业重金招聘Python工程师标准>>>

消息的持久化策略分析

  • 消息持久性对于可靠消息传递来说是一种比较好的方法,
  • 即时发送者和接受者不是同时在线或者消息中心在发送者发送消息后宕机了,在消息中心重启后仍然可以将消息发送出去。
  • 消息持久性的原理很简单,
    • 就是在发送消息出去后,消息中心首先将消息存储在本地文件、内存或者远程数据库,
    • 然后把消息发送给接受者,
    • 发送成功后再把消息从存储中删除,失败则继续尝试。
  • 接下来我们来了解一下消息在broker上的持久化存储实现方式

持久化存储支持类型

  • ActiveMQ支持多种不同的持久化方式,主要有以下几种,不过,无论使用哪种持久化方式,消息的存储逻辑都是一致的。
  • Ø KahaDB存储(默认存储方式)
  • Ø JDBC存储
  • Ø Memory存储
  • Ø LevelDB存储
  • Ø JDBC With ActiveMQ Journal

KahaDB存储

  • KahaDB是目前默认的存储方式,可用于任何场景,提高了性能和恢复能力。

    • 消息存储使用一个事务日志和仅仅用一个索引文件来存储它所有的地址。
  • KahaDB是一个专门针对消息持久化的解决方案,它对典型的消息使用模式进行了优化。
    • 在Kaha中,数据被追加到data logs中
    • 当不再需要log文件中的数据的时候,log文件会被丢弃。

KahaDB的配置方式

<persistenceAdapter><kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>

KahaDB的存储原理

  • 在data/kahadb这个目录下,会生成四个文件:

Ø db.data 它是消息的索引文件,本质上是B-Tree(B树),使用B-Tree作为索引指向db-*.log里面存储的消息
Ø db.redo 用来进行消息恢复
Ø db-*.log 存储消息内容。

  • 新的数据以APPEND的方式追加到日志文件末尾。
  • 属于顺序写入,因此消息存储是比较快的。
  • 默认是32M,达到阀值会自动递增

Ø lock文件 锁,表示当前获得kahadb读写权限的broker

JDBC存储

  • 使用JDBC持久化方式,数据库会创建3个表:activemq_msgs,activemq_acks和activemq_lock。
  • ACTIVEMQ_MSGS 消息表,queue和topic都存在这个表中
  • ACTIVEMQ_ACKS 存储持久订阅的信息和最后一个持久订阅接收的消息ID
  • ACTIVEMQ_LOCKS 锁表,用来确保某一时刻,只能有一个ActiveMQ broker实例来访问数据库

JDBC存储实践

<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="# MySQL-DS " createTablesOnStartup="true" />
</persistenceAdapter>
  • dataSource指定持久化数据库的bean,
  • createTablesOnStartup是否在启动的时候创建数据表,默认值是true,
    • 这样每次启动都会去创建数据表了,
    • 一般是第一次启动的时候设置为true,之后改成false

Mysql持久化Bean配置

<bean id="Mysql-DS" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://192.168.11.156:3306/activemq?relaxAutoCommit=true"/><property name="username" value="root"/><property name="password" value="root"/>
</bean>

添加Jar包依赖

LevelDB存储

  • LevelDB持久化性能高于KahaDB,虽然目前默认的持久化方式仍然是KahaDB。
  • 并且,在ActiveMQ 5.9版本提供了基于LevelDB和Zookeeper的数据复制方式,用于Master-slave方式的首选数据复制方案。
  • 不过,据ActiveMQ官网对LevelDB的表述:LevelDB官方建议使用以及不再支持,推荐使用的是KahaDB
<persistenceAdapter><levelDBdirectory="activemq-data"/>
</persistenceAdapter>

Memory 消息存储

  • 基于内存的消息存储,内存消息存储主要是存储所有的持久化的消息在内存中。
  • persistent=”false”,表示不设置持久化存储,直接存储到内存中
<beans><broker brokerName="test-broker" persistent="false"xmlns="http://activemq.apache.org/schema/core"><transportConnectors><transportConnector uri="tcp://localhost:61635"/></transportConnectors> </broker>
</beans>

JDBC Message store with ActiveMQ Journal

  • 这种方式克服了JDBC Store的不足,JDBC每次消息过来,都需要去写库和读库。
  • ActiveMQ Journal,使用高速缓存写入技术,大大提高了性能。
  • 当消费者的消费速度能够及时跟上生产者消息的生产速度时,journal文件能够大大减少需要写入到DB中的消息。
    • 举个例子,生产者生产了1000条消息,这1000条消息会保存到journal文件,
    • 如果消费者的消费速度很快的情况下,在journal文件还没有同步到DB之前,消费者已经消费了90%的以上的消息,
    • 那么这个时候只需要同步剩余的10%的消息到DB。
  • 如果消费者的消费速度很慢,这个时候journal文件可以使消息以批量方式写到DB。
    • Ø 将原来的标签注释掉
    • Ø 添加如下标签
    • Ø 在服务端循环发送消息。可以看到数据是延迟同步到数据库的
<persistenceFactory><journalPersistenceAdapterFactory dataSource="#Mysql-DS" dataDirectory="activemqdata"/>
</persistenceFactory>

转载于:https://my.oschina.net/u/3847203/blog/2989537

分布式消息通信ActiveMQ原理-持久化策略-笔记相关推荐

  1. activemq原理 java_分布式消息通信ActiveMQ原理-持久化策略-笔记

    消息的持久化策略分析 消息持久性对于可靠消息传递来说是一种比较好的方法, 即时发送者和接受者不是同时在线或者消息中心在发送者发送消息后宕机了,在消息中心重启后仍然可以将消息发送出去. 消息持久性的原理 ...

  2. 分布式消息通信ActiveMQ原理 分析一

    本章知识点: 1. 持久化消息和非持久化消息的发送策略2. 消息的持久化方案及实践3. 消费端消费消息的原理 持久化消息与非持久化消息的发送策略 消息同步发送和异步发送 同步发送过程中,发送者发送一条 ...

  3. 分布式消息通信ActiveMQ原理-消费消息策略-笔记

    2019独角兽企业重金招聘Python工程师标准>>> 消息消费流程图 消费端消费消息的原理 我们通过上一节课的讲解,知道有两种方法可以接收消息, 一种是使用同步阻塞的Message ...

  4. 分布式消息通信 ActiveMQ 原理 分析二

    本章重点: 1. unconsumedMessage 源码分析 2. 消费端的 PrefetchSize 3. 消息的确认过程 4. 消息重发机制 5. ActiveMQ 多节点高性能方案 消息消费流 ...

  5. 分布式专题-分布式消息通信之ActiveMQ03-ActiveMQ原理分析(下)

    目录导航 前言 unconsumedMessage源码分析 异步分发的流程 同步分发的流程 消费端的PrefetchSize及优化 原理剖析 prefetchSize 的设置方法 总结 消息的确认过程 ...

  6. 分布式专题-分布式消息通信之ActiveMQ02-ActiveMQ原理分析(上)

    目录导航 前言 持久化消息和非持久化消息的发送策略 消息同步发送和异步发送 消息的发送原理分析图解 消息发送的流程图 ProducerWindowSize的含义 消息发送的源码分析 持久化消息和非持久 ...

  7. 阿里分布式开放消息服务(ONS)原理与实践——笔记整理

    1.MQ场景     1)订单异步解耦     2)解决分布式事务问题     3)应用于聊天平台     4)大规模机器的Cache同步     5)MySQL BinLog订阅数据分发 2.ONS ...

  8. 浅谈消息队列的原理及优势

    什么是消息队列 这样的场景你一定不陌生:小王到M记点餐之后,服务员给了他一个号牌,并让他在柜台桌子前方等待叫号取餐.每个人都按照自己付款拿到的号牌顺序排队等叫号.即使店里人再多,也不会显得没有秩序. ...

  9. ActiveMQ消息的持久化策略

    持久化消息和非持久化消息的存储原理: 正常情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的.能够存储的最大消息数据在${ActiveMQ_HOME}/conf/activemq.xml ...

最新文章

  1. php access token缓存,微信小程序PHP 生成access_token存入缓存
  2. 允许使用抽象类类型 isearchboxinfo 的对象_final关键字、抽象类以及接口
  3. 数据库 - mysql内置功能
  4. py2.7+pyqt4开发端口检测工具
  5. android 微信缩小通话界面_安卓如何做出微信那样的界面仿微信“我”的界面2/5...
  6. oracle-扫盲贴:存储过程实现增删改查
  7. Centos7用yum安装完mysql后没有mysqld的问题(mysql中三个包都装过了)
  8. 计算平均成绩,科目数未知
  9. 【杂项】VScode中C C++代码美化工具Uncrustify配置详解
  10. python 键盘输入负数_python输入负数
  11. 不要做全职UP主,除非你非常有钱
  12. 服务器自带软件怎么样卸载,告别卸载软件难 四大方法轻松搞定
  13. 基于Javaweb和阿里云服务器的用户管理平台
  14. 阿里云的免费云虚拟主机
  15. Fio 命令生产环境测试
  16. python判断正数和负数教案_正数和负数教学设计
  17. 一文讲透:质量管理的历史
  18. 计算机文化基础西安航空学院知到答案,HBsAg阳性,抗-HBe阳性,抗-HBc阳性,表明...
  19. 《智能制造》赵亚波《工业控制计算机》2002年15卷第3期
  20. 【2021最新版】JVM面试题总结(87道题含答案解析)

热门文章

  1. vue一二级联动清空二级数据_【周一实用技巧】二级联动还不够,自动更新才最牛。Excel 2013利用数据验证条件制作一级、二级联动和自动更新下拉列表...
  2. OVS DPDK--virtqueue(十七)
  3. OVS 添加端口流程(二十九)
  4. leetcode算法题--爬楼梯
  5. 上高职业技术学校计算机学几年,上高职业技术学校2021年有哪些专业
  6. 如何使WINCE启动时自动运行应用程序
  7. 【初探移动前端开发02】移动设备的页面
  8. MySQL复制类型介绍
  9. IPv6相比IPv4在那些方面做出了改进?IPv4 to IPv6过渡的三种tunnel技术各自的特性...
  10. 多线程共享内存的问题