當前位置:首頁 » 服務存儲 » mq客戶端需要持久化存儲嗎
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

mq客戶端需要持久化存儲嗎

發布時間: 2022-07-25 05:17:56

A. spring 集成activitymq持久化文件怎麼設置

ActiveMQ另問題要軟體能掛掉掛掉怕怕掛掉信息給丟所本節析幾種持久化式:

、持久化文件
ActiveMQ默認支持種式要發消息設置消息持久化

打安裝目錄配置文件:

D:\ActiveMQ\apache-activemq\conf\activemq.xml越80行發現默認配置項:

注意使用kahaDB基於文件支持事務消息存儲器靠高性能擴展消息存儲器

設計初衷使用簡單並盡能快KahaDB索引使用transaction log並且所destination使用index測試表明:用於產環境支持1萬active connection每connection獨立queue該表現已經足矣應付部需求

再發送消息候改變第二參數:

MsgDeliveryMode.Persistent

Message保存式2種
PERSISTENT:保存磁碟consumer消費message刪除
NON_PERSISTENT:保存內存消費message清除
注意:堆積消息太能導致內存溢

打產者端發送消息:

wps30F4.tmp

啟消費者端同管理界面查看:

wps3105.tmp

發現消息等待沒持久化ActiveMQ宕機重啟消息丟失我現修改文件持久化重啟ActiveMQ消費者仍能夠收消息

wps3106.tmp

二、持久化資料庫
我支持Mysql例先載mysql-connector-java-5.1.34-bin.jar包放:

D:\ActiveMQ\apache-activemq\lib目錄

打並修改配置文件:

復制代碼
<beans
xmlns=""
xmlns:xsi=""
xsi:schemaLocation=" /spring-beans.xsd
/activemq-core.xsd">

file:${activemq.conf}/credentials.properties

<bean id="logQuery" class="org.fusesource.insight.log.log4j.Log4jLogQuery"
lazy-init="false" scope="singleton"
init-method="start" destroy-method="stop">

<!--
The element is used to configure the ActiveMQ broker.
-->

<!-- The is used to prevent
slow topic consumers to block procers and affect other consumers
by limiting the number of messages that are retained
For more information, see:

-->

<!--
The managementContext is used to configure how ActiveMQ is exposed in
JMX. By default, ActiveMQ uses the MBean server that is started by
the JVM. For more information, see:

-->

<!--
Configure message persistence for the broker. The default persistence
mechanism is the KahaDB store (identified by the kahaDB tag).
For more information, see:

-->

<!--
The systemUsage controls the maximum amount of space the broker will
use before disabling caching and/or slowing down procers. For more information, see:

-->

<!--
The transport connectors expose ActiveMQ over a given protocol to
clients and other brokers. For more information, see:

-->

<!--
Enable web consoles, REST and Ajax APIs and demos
The web consoles requires by default login, you can disable this in the jetty.xml file

Take a look at ${ACTIVEMQ_HOME}/conf/jetty.xml for more details
-->

J

B. 如何實現activemq的topic的持久訂閱

持久訂閱,就要記錄消費者的名字了。
張三說,我是張三,有饅頭給我留著,我回來拿;
李四說,我是李四,有饅頭給我留著,我回來拿;
參考例子如下:
// 創建connection
connection = connectionFactory.createConnection();
connection.setClientID("bbb"); //持久訂閱需要設置這個。
connection.start();

// 創建session
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);

// 創建destination
Topic topic = session.createTopic("userSyncTopic"); //Topic名稱

//MessageConsumer consumer = session.createConsumer(topic); //普通訂閱
MessageConsumer consumer = session.createDurableSubscriber(topic,"bbb"); //持久訂閱

C. activemq 實現消息持久化到資料庫的時候。這個我做到了。消息是保存到表中了。但是重新啟動activemq之後,

隊列在程序執行連接的時候會自動創建,不會應該使用的

D. activemq 持久消息和不持久的區別

持久傳輸和非持久傳輸最大的區別是:採用持久傳輸時,傳輸的消息會保存到磁碟中(messages are persisted to disk/database),即「存儲轉發」方式。先把消息存儲到磁碟中,然後再將消息「轉發」給訂閱者。
採用非持久傳輸時,發送的消息不會存儲到磁碟中。
採用持久傳輸時,當Borker宕機 恢復後,消息還在。採用非持久傳輸,Borker宕機重啟後,消息丟失。比如,當生產者將消息投遞給Broker後,Broker將該消息存儲到磁碟中,在Broker將消息發送給Subscriber之前,Broker宕機了,如果採用持久傳輸,Broker重啟後,從磁碟中讀出消息再傳遞給Subscriber;如果採用非持久傳輸,這條消息就丟失了。

E. rabbitmq消息真的可以持久化嗎

可以,它默認會持久化到本地磁碟。所以數據不會丟失。1453857833 Windows C++ 超級簡單封裝,一個發送介面,一個接收介面,數據用vector<string>存放數據

F. rabbitmq保證消息不丟失

  1. 我是在網上粘貼復制的。

  2. mq原則

數據不能多,也不能少,不能多是說消息不能重復消費,這個我們上一節已解決;不能少,就是說不能丟失數據。如果mq傳遞的是非常核心的消息,支撐核心的業務,那麼這種場景是一定不能丟失數據的。

2.丟失數據場景

丟數據一般分為兩種,一種是mq把消息丟了,一種就是消費時將消息丟了。下面從rabbitmq和kafka分別說一下,丟失數據的場景,
(1)rabbitmq
A:生產者弄丟了數據生產者將數據發送到rabbitmq的時候,可能在傳輸過程中因為網路等問題而將數據弄丟了。
B:rabbitmq自己丟了數據如果沒有開啟rabbitmq的持久化,那麼rabbitmq一旦重啟,那麼數據就丟了。所依必須開啟持久化將消息持久化到磁碟,這樣就算rabbitmq掛了,恢復之後會自動讀取之前存儲的數據,一般數據不會丟失。除非極其罕見的情況,rabbitmq還沒來得及持久化自己就掛了,這樣可能導致一部分數據丟失。
C:消費端弄丟了數據主要是因為消費者消費時,剛消費到,還沒有處理,結果消費者就掛了,這樣你重啟之後,rabbitmq就認為你已經消費過了,然後就丟了數據。


3.如何防止消息丟失

(1)rabbitmqA:生產者丟失消息①:可以選擇使用rabbitmq提供是事物功能,就是生產者在發送數據之前開啟事物,然後發送消息,如果消息沒有成功被rabbitmq接收到,那麼生產者會受到異常報錯,這時就可以回滾事物,然後嘗試重新發送;如果收到了消息,那麼就可以提交事物

channel.txSelect();//開啟事物try{//發送消息}catch(Exection e){channel.txRollback();//回滾事物//重新提交}復制代碼

缺點:rabbitmq事物已開啟,就會變為同步阻塞操作,生產者會阻塞等待是否發送成功,太耗性能會造成吞吐量的下降。

②:可以開啟confirm模式。在生產者哪裡設置開啟了confirm模式之後,每次寫的消息都會分配一個唯一的id,然後如何寫入了rabbitmq之中,rabbitmq會給你回傳一個ack消息,告訴你這個消息發送OK了;如果rabbitmq沒能處理這個消息,會回調你一個nack介面,告訴你這個消息失敗了,你可以進行重試。而且你可以結合這個機制知道自己在內存里維護每個消息的id,如果超過一定時間還沒接收到這個消息的回調,那麼你可以進行重發。

//開啟confirmchannel.confirm();//發送成功回調public void ack(String messageId){}// 發送失敗回調public void nack(String messageId){//重發該消息}復制代碼

二者不同事務機制是同步的,你提交了一個事物之後會阻塞住,但是confirm機制是非同步的,發送消息之後可以接著發送下一個消息,然後rabbitmq會回調告知成功與否。 一般在生產者這塊避免丟失,都是用confirm機制。
B:rabbitmq自己弄丟了數據設置消息持久化到磁碟。設置持久化有兩個步驟:
①創建queue的時候將其設置為持久化的,這樣就可以保證rabbitmq持久化queue的元數據,但是不會持久化queue裡面的數據。
②發送消息的時候講消息的deliveryMode設置為2,這樣消息就會被設為持久化方式,此時rabbitmq就會將消息持久化到磁碟上。 必須要同時開啟這兩個才可以。

而且持久化可以跟生產的confirm機制配合起來,只有消息持久化到了磁碟之後,才會通知生產者ack,這樣就算是在持久化之前rabbitmq掛了,數據丟了,生產者收不到ack回調也會進行消息重發。
C:消費者弄丟了數據使用rabbitmq提供的ack機制,首先關閉rabbitmq的自動ack,然後每次在確保處理完這個消息之後,在代碼裏手動調用ack。這樣就可以避免消息還沒有處理完就ack。

G. 用java代碼如何設置activemq消息持久化到資料庫中

ActiveMQ持久化消息的二種方式;
1、持久化為文件
這個裝ActiveMQ時默認就是這種,只要設置消息為持久化就可以了。涉及到的配置和代碼有:
<persistenceAdapter>
<kahaDB directory="${activemq.base}/data/kahadb"/>
</persistenceAdapter>
procer.Send(request, MsgDeliveryMode.Persistent, level, TimeSpan.MinValue);

2、持久化為MySql
首先需要把MySql的驅動放到ActiveMQ的Lib目錄下,我用的文件名字是:mysql-connector-java-5.0.4-bin.jar
接下來修改配置文件
<persistenceAdapter>
<jdbcPersistenceAdapter dataDirectory="${activemq.base}/data" dataSource="#derby-ds"/>
</persistenceAdapter>
在配置文件中的broker節點外增加
<bean id="derby-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>
從配置中可以看出資料庫的名稱是activemq,需要手動在MySql中增加這個庫。
然後重新啟動消息隊列,會發現多了3張表
1:activemq_acks
2:activemq_lock
3:activemq_msgs

H. activeMQ能不能配置多個實例的負載均衡,並只連接一個MySQL,將消息持久化存入到一個資料庫中

ActiveMQ持久化消息的二種方式;1、持久化為文件這個裝ActiveMQ時默認就是這種,只要設置消息為持久化就可以了。涉及到的配置和代碼有:procer.Send(request,MsgDeliveryMode.Persistent,level,TimeSpan.MinValue);2、持久化為MySql首先需要

I. activemq 怎麼處理持久化

如果消息是持久化的,activemq收到消息後會存儲在持久性cursor中。對於非持久化消息,會存儲在File Cursor中。從名稱上File Cursor是持久性cursor,實際上activemq把FilePendingMessageCursor作為非持久性cursor。
File Cursor首先在內存中保存消息的引用,如果內存使用量達到上限,那麼會把消息引用保存到臨時文件中,這樣就不會因為有大量消息沒有被消費而導致OOM。
當消息consumer啟動時,mq收到消息會激活broker上的DurableTopicSubscrition,該subscription會檢查當前的消息cursor里是否有消息,如果有就會dispatch這些消息,這樣consumer就能收到之前發送的消息了。轉載,僅供參考。

J. activemq 可以持久化多長時間

如果persist=true會一直保存,server重啟也不會丟失,除非被消費。