天天看点

ActiveMq高级(传输协议、消息持久化)

一、ActiveMq传输协议

官网地址:http://activemq.apache.org/configuring-version-5-transports.html

1、Tcp协议

activemq默认的传输协议是tcp,在activemq.xml的配置文件中,如下

支持以下协议

<transportConnectors>
    <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
    <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高级(传输协议、消息持久化)

二、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目录:

ActiveMq高级(传输协议、消息持久化)

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高级(传输协议、消息持久化)

***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已经被弃用,不再被推荐使用

继续阅读