1 安全認證
ActiveMQ
提供了安全認證。 就是用戶名密碼登錄規則
。 ActiveMQ
如果需要使用安全認 證 的 話 , 必 須 在 activemq
的 核 心 配 置 文 件 中 開 啓 安 全 配 置 。
1.1 添加插件
配 置 文 件 就 是conf/activemq.xml
在 conf/activemq.xml
配置文件的 broker
標籤中增加下述內容:
<jaasAuthenticationPlugin configuration="activemq" />
指定了使用JAAS
插件管理權限,至於configuration="activemq"
是在login.conf
文件裏定義的<authorizationEntry topic="名字" read="用戶組名" write="用戶組名" admin="用戶組名"/>
指定了具體的Topic/Queue
與用戶組的授權關係<authorizationEntry topic="ActiveMQ.Advisory.>" read="admins" write="admins" admin="admins"/>
這個是必須的配置, 不能少
<plugins>
<!-- use JAAS to authenticate using the login.config file on the classpath to
configure JAAS -->
<!-- 添加 jaas 認證插件 activemq 在 login.config 裏面定義,詳細見 login.config-->
<jaasAuthenticationPlugin configuration="activemq" />
<!-- lets configure a destination based authorization mechanism -->
<authorizationPlugin>
<map>
<authorizationMap>
<authorizationEntries>
<!-- 這裏面的大於號是指所有的連接,不管是consumer還是provider都需要認證,其後是 讀寫管理的權限,其中 admins是用戶組的名字 -->
<authorizationEntry topic=">" read="admins" write="admins" admin="admins" />
<authorizationEntry queue=">" read="admins" write="admins" admin="admins" />
<!-- 此處的ActiveMQ.Advisory.>大於號之前是指的系統級別的 -->
<authorizationEntry topic="ActiveMQ.Advisory.>" read="admins" write="admins" admin="admins"/>
<authorizationEntry queue="ActiveMQ.Advisory.>" read="admins" write="admins" admin="admins"/>
</authorizationEntries>
</authorizationMap>
</map>
</authorizationPlugin>
</plugins>
1.2 其他配置
開啓認證後, 認證使用的用戶信息由其他配置文件提供:conf/login.config
activemq {
org.apache.activemq.jaas.PropertiesLoginModule required
org.apache.activemq.jaas.properties.user="users.properties"
org.apache.activemq.jaas.properties.group="groups.properties";
};
user
代表用戶信息配置文件, group
代表用戶組信息配置文件。 尋址路徑爲相對當前配置文件所在位置開始尋址。
conf/users.properties
#用戶名=密碼
admin=admin
conf/groups.properties
#用戶組名=用戶名, 用戶名(多個用戶名用逗號分隔開來)
admins=admin
1.3 開啓效果
因爲只配置了admin
,因此當使用guest
時在java中
就無法通過此用戶訪問服務器了,就算訪問網頁管理網站也是隻能用admin
,而不能用guest
2 ActiveMQ的持久化
ActiveMQ
中, 持久化是指對消息數據的持久化。 在 ActiveMQ
中, 默認的消息是保存在內存中的。 當內存容量不足的時候, 或ActiveMQ
正在關閉的時候, 會將內存中的未處理的消息持久化到磁盤中。
具體的持久化策略由配置文件中的具體配置決定
ActiveMQ
的默認存儲策略是 kahadb
。 如果使用 JDBC
作爲持久化策略, 則會將所有的需要持久化的消息保存到數據庫中。
所有的持久化配置都在 conf/activemq.xml
中配置, 配置信息都在 broker
(代理) 標籤內部定義。
2.1 kahadb方式
kahadb
方式是 ActiveMQ
默認的持久化策略。 kahadb
是一個文件型數據庫。
是使用內存+文件
保證數據的持久化的。 kahadb
可以限制每個數據文件的大小。 不代表總計數據容量。
<persistenceAdapter>
<!-- directory:保存數據的目錄; journalMaxFileLength:保存消息的文件大小 -->
<kahaDB directory="${activemq.data}/kahadb" journalMaxFileLength="16mb"/>
</persistenceAdapter>
特性是:
- 日誌形式存儲消息;
- 消息索引以
B-Tree
結構存儲, 可以快速更新; - 完全支持
JMS
事務; - 支持多種恢復機制;
2.2 AMQ 方式
AMQ
方式只適用於 5.3
版本之前。
AMQ
也是一個文件型數據庫, 消息信息最終是存儲在文件中。 內存中也會有緩存數據。
<persistenceAdapter>
<!-- directory:保存數據的目錄 ; maxFileLength:保存消息的文件大小 -->
<amqPersistenceAdapter directory="${activemq.data}/amq" maxFileLength="32mb"/>
</persistenceAdapter>
AMQ
優點:
- 性能高於
JDBC
, 寫入消息時, 會將消息寫入日誌文件, 由於是順序追加寫, 性能很高。爲了提升性能, 創建消息主鍵索引
, 並且提供緩存機制, 進一步提升性能。 - 每個日誌文件的大小都是有限制的(默認
32m
, 可自行配置)。當超過這個大小, 系統會重新建立一個文件。 當所有的消息都消費完成, 系統會刪除這個文件或者歸檔。
AMQ
缺點: AMQ Message
會爲每一個Destination
創建一個索引, 如果使用了大量的Queue
, 索引文件的大小會佔用很多磁盤空間。- 且由於索引巨大, 一旦
Broker
(ActiveMQ
應用實例) 崩潰, 重建索引的速度會非常慢。 - 雖然
AMQ
性能略高於Kaha DB
方式, 但是由於其重建索引時間過長, 而且索引文件佔用磁盤空間過大, 所以已經不推薦使用。
2.3 JDBC持久化方式
ActiveMQ
將數據持久化到數據庫中。 不指定具體的數據庫。 可以使用任意的數據庫中。
以下以使用 MySQL
數據庫爲例
下述文件爲 activemq.xml
配置文件部分內容
- 首先定義一個
mysql-ds
的MySQL
數據源, 然後在<broker>
標籤中的persistenceAdapter
節點中配置jdbcPersistenceAdapter
並且引用剛纔定義的數據源。 dataSource
指定持久化數據庫的bean
,createTablesOnStartup
是否在啓動的時候創建數據表, 默認值是true
, 這樣每次啓動都會去創建數據表了, 一般是第一次啓動的時候設置爲true
, 之後改成false
,如果要反覆重啓的話就要改爲false
- 在
<broker>
標籤之外配置<bean>
標籤 - 在
activemq
的lib
目錄裏面增加連接數據庫的jar包
<broker brokerName="test-broker" persistent="true" xmlns="http://activemq.apache.org/schema/core">
<persistenceAdapter>
<!-- 此處的true或false要特別注意 -->
<jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="false"/>
</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>
配置成功後, 需要在數據庫中創建對應的 database
, 否則無法訪問。 表格ActiveMQ
可以自動創建。
activemq_msgs
用於存儲消息, Queue
和 Topic
都存儲在這個表中:
ID
: 自增的數據庫主鍵CONTAINER
: 消息的Destination
MSGID_PROD
: 消息發送者客戶端的主鍵MSG_SEQ
: 是發送消息的順序,MSGID_PROD+MSG_SEQ
可以組成JMS
的MessageID
EXPIRATION
: 消息的過期時間, 存儲的是從1970-01-01
到現在的毫秒數MSG
: 消息本體的Java
序列化對象的二進制數據PRIORITY
: 優先級, 從0-9
, 數值越大優先級越高
activemq_acks
用於存儲訂閱關係。 如果是持久化 Topic
, 訂閱者和服務器的訂閱關係在這個表保存:
主要的數據庫字段如下:
CONTAINER
: 消息的Destination
SUB_DEST
: 如果是使用Static
集羣, 這個字段會有集羣其他系統的信息CLIENT_ID
: 每個訂閱者都必須有一個唯一的客戶端ID
用以區分SUB_NAME
: 訂閱者名稱SELECTOR
: 選擇器, 可以選擇只消費滿足條件的消息。 條件可以用自定義屬性實現,可支持多屬性AND
和OR
操作LAST_ACKED_ID
: 記錄消費過的消息的ID
。
表 activemq_lock
在集羣環境中才有用, 只有一個Broker
可以獲得消息, 稱爲Master Broker
,其他的只能作爲備份等待 Master Broker
不可用, 纔可能成爲下一個 Master Broker
。這個表用於記錄哪個 Broker
是當前的Master Broker
。
只有在消息必須保證有效, 且絕對不能丟失的時候。 使用JDBC
存儲策略。
如果消息可以容忍丟失, 或使用集羣/主備模式保證數據安全的時候, 建議使用levelDB
或 Kahadb