一、ActiveMq传输协议
官网地址:http://activemq.apache.org/configuring-version-5-transports.html
1、Tcp协议
activemq默认的传输协议是tcp,在activemq.xml的配置文件中,如下 支持以下协议
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
2、TCP协议
(1):这是默认的Broker配置,TCP的Client监听端口是61616。
(2):在网络传输数据前,必须要序列化数据,消息是通过一个叫wire protocol的来序列化成字节流。默认情况下,ActiveMQ把wire protocol叫做OpenWire,它的目的是促使网络上的效率和数据快速交互。 (3):TCP连接的URI形式:tcp://hostname:port?key=value&key=value
(4):TCP传输的优点
- TCP协议传输可靠性高,稳定性强
- 高效性:字节流方式传递,效率很高
- 有效性、可用性:应用广泛,支持任何平台
3、NIO协议
(1):NIO协议和TCP协议类似,但NIO更侧重于底层的访问操作。它允许开发人员对同一资源有更多的client调用和服务端有更多的负载。
(2):适合使用NIO协议的场景:
- 可能有大量的Client去链接到Broker上,一般情况下,大量的Client去链接Broker是被操作系统的线程数所限制的。因此,NIO的实现比TCP需要更少的线程去运行,所以建议使用NIO协议
- 可能对于Broker有一个很迟钝的网络传输NIO比TCP提供更好的性能
(3):Transport Connector配置示例: <transportConnector name="nio" uri="nio://0.0.0.0:61616?trace=true"/>
4、NIO协议增强
(1)、上述配置就uri以nio开头,表示这个端口使用以tcp协议为基础的nio网络io模型,但是这样的设置方式,只能使这个端口支持openwire协议
(2)、设置该端口即支持openwire协议,又支持其他协议 <transportConnector name="auto" uri="auto://localhost:5671"/> 需注意,此关键字auto 在5.13以后的版本中才有
二、ActiveMq消息持久化方式
官网:http://activemq.apache.org/persistence
博客:https://blog.csdn.net/qq_36761831/article/details/99841388
ActiveMq消息持久化机制方式:JDBC、KahaDB、AMQ、LevelDB、Replicated LevelDB
1、KahaDB:
(1)、基于日志文件的持久性数据库,是自ActiveMQ5.4以来的默认存储机制,可用于任何场景,提高了性能和恢复能力,它是基于文件的本地数据库存储形式。它已针对快速持久性进行了优化。KahaDB使用较少的文件描述符,并提供比其前身AMQ消息存储更快的恢复。
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
(2)、Kahadb目录:
db-7.log 主要用来存数据
db.data 包含了持久化的BTree索引,是消息的索引文件
db.redo 用来进行消息恢复
lock 文件表示当前获得Kahadb读写权限的broker
2、JDBC持久化
(1)、配置
<bean id="activemq-db" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/activemq"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<property name="maxActive" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#activemq-db" createTablesOnStartup="true" />
</persistenceAdapter>
(2)、添加mysql数据库的驱动jar包到activemq/lib的文件夹下 注意:若使用第三方连接池或是连接器(例如c3p0、druid),应同时将其jar包添加到lib文件夹下
(3)、自动创建的三张表
***activemq_msgs:***用于存储消息,Queue和Topic都存储在这个表中
***activemq_acks:***用于存储订阅关系,如果是持久化的Topic,订阅者和服务器的订阅关系在这个表保存
***activemq_lock:***在集群环境中才有用,只有一个Broker可以获得消息,用来记录哪个Broker是当前的Master Broker
3、AMQ()
AMQ是一种文件存储形式,它具有写入速度快和容易恢复的特定,消息存储在一个个文件中,文件的默认大小为32M,当一个存储文件中的消息已经全部被消费,那么这个文件将被标识为可删除,在下一个清除阶段这个文件被删除,AMQ适用于ActiveMQ5.3之前的版本。
4、LevelDB(适用ActiveMq5.8及以上版本)
它和KahaDB很相似,也是基于文件的本地数据库存储形式,但是它提供比KahaDB更快的持久性,但它不再使用自定义B-Tree实现来索引预写日志,而是使用基于LevelDB的索引
从ActiveMq5.9 ,LevelDB已经被弃用,不再被推荐使用
|