ActiveMQ 的存储:

ActiveMQ 在 queue 中存储 Message 时,采用先进先出顺序(FIFO)存储。同一时间一个消息被分派给单个消费者,且只有当 Message 被消费并确认时,它才能从存储中删除。

对于持久化订阅者来说,每个消费者获得 Message 的副本。为了节省存储空间,Provider 仅存储消息的一个副本。持久化订阅者维护了指向下一个 Message 的指针,并将其副本分派给消费者。以这种方式实现消息存储,因为每个持久化订阅者可能以不同的速率消费 Message,或者它们可能不是全部同时运行。此外,因每个 Message 可能存在多个消费者,所以在它被成功地传递给所有持久化订阅者之前,不能从存储中删除。

表格形式展现

消息类型 是否持久化 是否有Durable订阅者(持久) 消费者延迟启动时,消息是否保留 Broker重启时,消息是否保留
Queue N - Y N
Queue Y - Y Y
Topic N N N N
Topic N Y Y N
Topic Y N N N
Topic Y Y Y Y

ActiveMQ 常用的存储方式

1.KahaDB

ActiveMQ 5.3 版本起的默认存储方式。KahaDB存储是一个基于文件的快速存储消息,设计目标是易于使用且尽可能快。它使用基于文件的消息数据库意味着没有第三方数据库的先决条件。

要启用 KahaDB 存储,需要在 activemq.xml 中进行以下配置:

1
2
3
4
5
<broker brokerName="broker" persistent="true" useShutdownHook="false">
        <persistenceAdapter>
                <kahaDB directory="${activemq.data}/kahadb" journalMaxFileLength="16mb"/>
        </persistenceAdapter>
</broker>

2.AMQ

与 KahaDB 存储一样,AMQ存储使用户能够快速启动和运行,因为它不依赖于第三方数据库。AMQ 消息存储库是可靠持久性和高性能索引的事务日志组合,当消息吞吐量是应用程序的主要需求时,该存储是最佳选择。但因为它为每个索引使用两个分开的文件,并且每个 Destination 都有一个索引,所以当你打算在代理中使用数千个队列的时候,不应该使用它。

1
2
3
4
5
6
7
8
<persistenceAdapter>
        <amqPersistenceAdapter
                directory="${activemq.data}/kahadb"
                syncOnWrite="true"
                indexPageSize="16kb"
                indexMaxBinSize="100"
                maxFileLength="10mb" />
</persistenceAdapter>

3.JDBC

选择关系型数据库,通常的原因是企业已经具备了管理关系型数据的专长,但是它在性能上绝对不优于上述消息存储实现。事实是,许多企业使用关系数据库作为存储,是因为他们更愿意充分利用这些数据库资源。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<beans>
        <broker brokerName="test-broker" persistent="true" xmlns="http://activemq.apache.org/schema/core">
                <persistenceAdapter>
                        <jdbcPersistenceAdapter dataSource="#mysql-ds"/>
                </persistenceAdapter>
        </broker>
        <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://localhost/activemq?relaxAutoCommit=true"/>
                <property name="username" value="activemq"/>
                <property name="password" value="activemq"/>
                <property name="maxActive" value="200"/>
                <property name="poolPreparedStatements" value="true"/>
        </bean>
</beans>

4.内存存储

内存消息存储器将所有持久消息保存在内存中。在仅存储有限数量 Message 的情况下,内存消息存储会很有用,因为 Message 通常会被快速消耗。在 activemq.xml 中将 broker 元素上的 persistent 属性设置为 false 即可。

1
2
3
4
5
<broker brokerName="test-broker" persistent="false" xmlns="http://activemq.apache.org/schema/core">
        <transportConnectors>
                <transportConnector uri="tcp://localhost:61635"/>
        </transportConnectors>
</broker>

讲讲 ActiveMQ 的部署模式

1.单例模式

这个就不啰嗦了,略过。

2.无共享主从模式

这是最简单的 Provider 高可用性的方案,主从节点分别存储 Message。从节点需要配置为连接到主节点,并且需要特殊配置其状态。

所有消息命令(消息,确认,订阅,事务等)都从主节点复制到从节点,这种复制发生在主节点对其接收的任何命令生效之前。并且,当主节点收到持久消息,会等待从节点完成消息的处理(通常是持久化到存储),然后再自己完成消息的处理(如持久化到存储)后,再返回对 Producer 的回执。

从节点不启动任何传输,也不能接受任何客户端或网络连接,除非主节点失效。当主节点失效后,从节点自动成为主节点,并且开启传输并接受连接。这是,使用 failover 传输的客户端就会连接到该新主节点。

Broker 连接配置如下:

1
failover://(tcp://masterhost:61616,tcp://slavehost:61616)?randomize=false

但是,这种部署模式有一些限制,

  • 主节点只会在从节点连接到主节点时复制其活动状态,因此当从节点没有连接上主节点之前,任何主节点处理的 Message 或者消息确认都会在主节点失效后丢失。不过你可以通过在主节点设置 waitForSlave 来避免,这样就强制主节点在没有任何一个从节点连接上的情况下接受连接。
  • 就是主节点只能有一个从节点,并且从节点不允许再有其他从节点。
  • 把正在运行的单例配置成无共享主从,或者配置新的从节点时,你都要停止当前服务,修改配置后再重启才能生效。

在可以接受一些故障停机时间的情况下,可以使用该模式。

从节点配置:

1
2
3
<services>
        <masterConnector remoteURI="tcp://remotehost:62001" userName="Rob" password="Davies"/>
</services>

此外,可以配置 shutdownOnMasterFailure 项,表示主节点失效后安全关闭,保证没有消息丢失,允许管理员维护一个新的从节点。

3.共享存储主从模式

允许多个代理共享存储,但任意时刻只有一个是活动的。这种情况下,当主节点失效时,无需人工干预来维护应用的完整性。另外一个好处就是没有从节点数的限制。

有两种细分模式:

(1)基于数据库

它会获取一个表上的排它锁,以确保没有其他 ActiveMQ 代理可以同时访问数据库。其他未获得锁的代理则处于轮询状态,就会被当做是从节点,不会开启传输也不会接受连接。


(2)基于文件系统

需要获取分布式共享文件锁,linux 系统下推荐用 GFS2。            

看到这些干货,成小胖欣喜若狂一边听一边记,等老王讲完后他还没记完。而老王则趁机喝了杯铁观音润润嗓子。

在记录完老王所讲的部署模式后,成小胖也不好意思再让老王继续讲下去了,毕竟他知道老王常年加班腰间盘突出,不能长时间站着。

“王哥您坐着休息下,我再给您讲讲我所理解的 ActiveMQ 的网络连接,中不中?”

“中。没事儿,我身体好着呢~”老王知道成小胖担心他的腰,但他还是那个倔脾气。成小胖也不敢多耽误时间,立马开讲。

1.代理网络

支持将 ActiveMQ 消息代理链接到不同拓扑,这就是被人们熟知的代理网络。

ActiveMQ 网络使用存储和转发的概念,其中消息总是存储在本地代理中,然后通过网络转发到另一个代理。            

当连接建立后,远程代理将把包含其所有持久和活动消费者目的地的信息传递给本地代理,本地代理根据信息决定远程代理感兴趣的 Message 并将它发送给远程代理。

如果希望网络是双向的,您可以使用网络连接器将远程代理配置为指向本地代理,或将网络连接器配置为双工,以便双向发送消息。

1
2
3
4
5
6
7
8
<networkConnectors>
        <networkConnector uri="static://(tcp://backoffice:61617)"
                              name="bridge"
                              duplex="true"
                              conduitSubscriptions="true"
                              decreaseNetworkConsumerPriority="false">
        </networkConnector>
</networkConnectors>

注意,配置的顺序很重要:

1.网络连接——需要在消息存储前建立好连接,对应 networkConnectors 元素
2.消息存储——需要在传输前配置好,对应 persistenceAdapter 元素
3.消息传输——最后配置,对应 transportConnectors 元素

2.网络发现

(1)动态发现

使用多播来支持网络动态发现。配置如下:

1
2
3
<networkConnectors>
    <networkConnector uri="multicast://default"/>
</networkConnectors>

其中,multicast:// 中的默认名称表示该代理所属的组。因此使用此方式时,强烈推荐你使用一个独特的组名,避免你的代理连接到其他不相关代理。

(2)静态发现

静态发现接受代理 URI 列表,并将尝试按列表中确定的顺序连接到远程代理。

1
2
3
<networkConnectors>
    <networkConnector uri="static:(tcp://remote-master:61617,tcp://remote-slave:61617)"/>
</networkConnectors>

相关配置如下:

  • initialReconnectDelay:默认值1000,表示尝试连接前的时延。
  • maxReconnectDelay:默认值30000,表示连接失败后到重新建立连接之间的时延,仅在 useExponentialBackOff 启用时生效。
  • useExponentialBackOff:默认值 true,如果启用,表示每次失败后增加重建连接的时延。
  • backOffMultiplier:默认值2,表示启用 useExponentialBackOff 后每次的时延增量需要注意的是,网络连接将始终尝试建立到远程代理的连接。

需要注意的是,网络连接将始终尝试建立到远程代理的连接。

(3)多连接场景           

当网络负载高时,使用多连接很有意义。但是你需要确保不会重复传递消息,这可以通过过滤器来实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<networkConnectors>
    <networkConnector uri="static://(tcp://remotehost:61617)"
                              name="queues_only"
                              duplex="true"
        <excludedDestinations>
            <topic physicalName=">"/>
        </excludedDestinations>
    </networkConnector>
    <networkConnector uri="static://(tcp://remotehost:61617)"
                              name="topics_only"
                              duplex="true"
        <excludedDestinations>
            <queue physicalName=">"/>
        </excludedDestinations>
    </networkConnector>
</networkConnectors>

讲完后成小胖如释重负,因为上面这些知识点虽然看起来很少,但他却花了很多时间看了很多英文资料,同时反复实践才理解透的呢。

在成小胖讲的这段时间,老王一直坐在转椅上,这会儿他的腰也舒服了很多。老王站起来拍了拍成小胖的肩膀:“这个知识点虽然理解起来有点晦涩,但是你解释得还是挺不错的。通过今天的交流,可以看出你对 ActiveMQ 的基础知识有了不错的掌握,今后呢还是要多加深入实践,这样才能使用它提供高质量的服务。”

老王的手机突然响了,是要去开会了:“今天就到这儿吧,我有个会议要参加。”

“好,谢谢王哥的耐心指导。希望你多注意身体。”

老王鬼魅的一笑:“嗯,放心吧,隔壁有对年轻人刚结婚,听Ta们说最近想要个小baby,所以我肯定会保养好自己的身体的。”

成小胖:“……”

“哈哈,开玩笑的!”

“……”

10

相关文章

  • 消息中间件收录集
  • Java消息队列-Spring整合ActiveMq
  • ActiveMQ + ZooKeeper 集群高可用配置
  • Spring+Log4j+ActiveMQ实现远程记录日志——实战+分析
  • Sping+ActiveMQ整合
  • ActiveMQ简述
  • Netty那点事(1)概述
  • 跟我学Spring3(13.3):测试之集成测试
  • Java调优经验谈
  • 与Service实现双向通信(上)

发表评论

Name*
邮箱*
网站 (请以 http://开头)

(*) 表示必填项

提交评论

3 条评论

  1. abao
    2018/01/04 下午 6:17

    有点像小说,哈哈哈哈哈

     0  0

    回复

  2. yang
    2018/01/25 下午 12:34

    像是在讲故事,过程很不错

     2  0

    回复

  3. YL Jerry
    2018/03/02 下午 3:54

    感觉是来搞笑的

     0  3

    回复

« Spring Boot & Spring MVC 异常处理的N种方法
zookeeper 入门系列 – 理论基础 – zab 协议 »

  • 本周热门文章
  • 本月热门
  • 热门标签

0如何定位那些SQL产生了大量的redo...

1使用FastBootWeixin框架快速开发...

2跨平台长连接组件设计及可插拔改造

3MyBatis 解析 XML 标签及占...

4一次非典型性 Redis 阻塞总结

5谈谈 JDK8 中的字符串拼接

6基于Multiple treatment的营销评估...

7Java日志框架:slf4j作用及其实现原...

8基于接口设计与编程

9从 Spring Cloud 看一个微服务...

0Transaction 在 Controller 层...

1JDK 10 的 109 项新特性

2在 Java 8 中避免 Null 检查

3Java 8 和 Java 9 中并发工具...

4通向架构师的道路(第二十二天)万能框架spri...

5MySQL分页优化中的“INNER...

6Java 虚拟机 6:内存溢出和内存泄露、并行和并发、...

7如何定位那些SQL产生了大量的redo...

820 个使用 Java CompletableFutu...

9Spring AOP 的实现机制

android23days Android开发 AOP APIArrayList ConcurrentHashMap Eclipse GCGuava Hadoop HashMap HashSet HBaseHibernate IntelliJ io Java java8 java 8Java9 Java NIO Java编程入门 JDBC JDK JMXJPA Jsoup JUnit JVM Lambda log4j mavenMybatis mysql Netty nio oracle ORM redisRESTful Scala Servlet Socket solr Springspringboot spring boot Spring MVCSpringMVC Spring Security SSH Stringsynchronized TestNG ThreadLocal Tomcatvolatile Web Service Zookeeper 事务 内存管理分布式 动态代理 单元测试 反射 垃圾回收 基础技术 多线程 字符串 字节码 并发 并发编程序列化 异常 异常处理 性能 性能优化 性能调优 教程 数据结构 日志 架构 架构师 死锁 泛型 注解 测试 游戏 源码分析 算法 线程 线程池 缓存 自动化测试 虚拟机 设计模式 资讯 集合 面试 面试题

最新评论

  • Re: Java垃圾回收机制
    Hi,请到伯乐在线的小组发帖提问,支持微信登录。链接是: http://group.jobbole....唐尤华
  • Re: Java垃圾回收机制
    String str = new String(\"hello\");SoftReference sr ...qiaolin
  • Re: Java垃圾回收机制
    Object aobj = new Object ( ) ;Object bobj = new Ob...qiaolin
  • Re: Transaction 在 Controller...
    受教了,感谢分享马俊
  • Re: 如何定位那些SQL产生了大量的re...
    受教了,加油!www.wuliaokankan.cn
  • Re: Java8系列之重新认识HashMap
    是我发错了哈...才发现屈定
  • Re: 在 Java 8 中避免 Null ...
    没有if判断简单直观www.wuliaokankan.cn
  • Re: JDK 10 的 109 项新特性
    我还在用8www.wuliaokankan.cn

ActiveMQ相关存储介绍相关推荐

  1. 后端技术:消息队列MQ/JMS/Kafka相关知识介绍

    ?今天给大家分享消息队列MQ/JMS/Kafka相关知识介绍 1.消息队列介绍 首先举个收快递的栗子,传统的收快递,快递小哥把我们的快递送到我们的手里.他需要什么条件嗯? 快递小哥有时间送, 我们有时 ...

  2. MySQL8.0内存相关参数介绍

    MySQL8.0内存相关参数介绍 首先我们给出MySQL内存使用的计算公式: MySQL理论上使用的内存 = 全局共享内存 + max_connections×线程独享内存. 也就是:innodb_b ...

  3. 内存问题排查手段及相关文件介绍

    [-] 内存问题排查手段及相关文件介绍重点 1 procsysvmmin_free_kbytes 2 procsysvmdrop_caches 3 procsysrq-trigger 31对echo ...

  4. syslog 向内存中缓存_内存问题排查手段及相关文件介绍

    5. 内存问题排查手段及相关文件介绍[重点] 对于内存问题排查,或者OOM问题排查,一般会涉及到如下文件,下面将如下文件的分析和设置介绍一下,这也是本文档的重点,后面排查内存信息还是要根据这些文件信息 ...

  5. 设计模式相关内容介绍

    1.设计模式相关内容介绍 1.1. 设计模式概述 创建型模式--------买建筑材料 用于描述------怎样创建对象,它的主要特点是----------将对象的创建与使用分离,这样可以降低系统的耦 ...

  6. 矛盾集合体——static的相关用法介绍

     矛盾集合体--static的相关用法介绍 矛盾集合体--static的相关用法介绍 静态变量(static variable)这个名字听起来就很矛盾,又是"静态"但又是&qu ...

  7. 单机存储系统可靠性及相关技术介绍

    一.存储系统可靠性的影响因素 单机存储系统包括存储硬件和存储软件.存储硬件又包含存储介质.存储控制器.设备固件:存储软件栈层次则更为复杂,以Linux为例包括:存储设备驱动层. 块设备层(Block ...

  8. 中移物联技术总监肖青:中移物联网eSIM相关进展介绍

    2016年7月6日,"eSIM技术与创新峰会-破局与布局"在北京新世纪日航酒店举行,通信世界网对本次会议进行全程直播.中移物联网有限公司企业合作部高级技术总监兼副总经理肖青发表了以 ...

  9. Linux安全关机命令以及相关命令介绍

    Linux安全关机命令以及相关命令介绍 致新手运维师 作为一名Linux运维师,应该明白Linux服务器运行时关机的正确方法,有助于我们在工作的时候不至于造成一些必要的损失.当然,Linux服务器作为 ...

最新文章

  1. 2017软件工程实践第二次作业(数独)
  2. easyui panel 默认折叠 右上角按钮
  3. Qt中的QStackedLayout
  4. 设计模式之控制反转和依赖注入的使用小结
  5. .net数据源控件绑定mysql_数据源控件与数据绑定控件的进一步简单讨论(1)
  6. LeetCode 836. 矩形重叠
  7. 习题1.8 二分查找 (20 分) 数据结构练习
  8. Windows Azure 革新 – TFS集成(WAWS第2部分)
  9. 读书笔记∣《世界是数字的》知识点整理
  10. 洛谷P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值)
  11. python余弦定理求角_余弦定理计算文章相似度
  12. UG10.0如何导出CAD图
  13. 数字图像处理-冈萨雷斯(学习笔记)
  14. get请求中文乱码问题解决
  15. 边缘检测之Sobel算子Prewitt算子
  16. 交换机端口详细配置Trunk
  17. ubuntu系统无wifi适配器 找不到wifi问题解决
  18. c++面试常见题·Part 1 基础
  19. 交换机原理_交换机工作原理解析
  20. Python Scrapy 上传图片到FastDfs(py3fdfs)

热门文章

  1. 带进度的文件复制 - 回复 冷风无泪 的问题
  2. MSSQL返回季度开始月和某月是第几季度
  3. codeforces 1097 Hello 2019
  4. Visual Studio Code支持JUnit
  5. N个富文本编辑器/基于Web的HTML编辑器
  6. 随机生成 字体大小--转
  7. 现代软件工程讲义 11 项目管理 - 事后诸葛亮会议
  8. Apple Mac OS X每日一技巧025:小学算术好的快帮我⋯把Spotlight当计算器,结果杯具了...
  9. 【发现】iframe 放入 Updatepanel 中没有作用,整页总要闪烁一次的解决办法
  10. android图片编解码architecture