RabbitMQ工作佇列

2022-04-16 03:49:03 字數 1883 閱讀 8107

工作佇列也叫任務佇列,主要思想就是避免立即執行資源密集型任務,必須等待完成,才能繼續下乙個任務,你可以執行多個工人,佇列裡的工作他們可以共同不重複的完成。

1:佇列優點之一就是能夠輕鬆平行的工作。如果積壓工作,我們可以增加更多的工人。預設情況下,rabbitmq將按順序將每條訊息傳送給下乙個工作者。平均而言工作者將獲得相同的數量訊息。這種分發訊息的方式成為迴圈法。

增加訊息確認:

channel.basicconsume(queue: "task_queue", autoack:

false, consumer: consumer);

3:在訊息確認情況下,工作者死亡(通道關閉,鏈結關閉或tcp鏈結丟失),rabbitmq將理解訊息尚未被完全處理,並將未完全處理的訊息重新排隊,如果有其他工作者同時上線,則會迅速傳送給其他工作者處理,這樣的話即使工作者偶爾死亡,也可以確保沒有任何資訊丟失。

4:如果工作者人沒有訊息確認的話,後果很嚴重。當該工作者退出時,訊息將重新傳遞,但是rabbitmq將會消耗越來越多的記憶體,因為rabbitmq不能釋放未被處理的訊息。

5:訊息的永續性,上面講述了即使工作者死亡,任務也不會丟失。但是如果rabbitmq伺服器掛掉,我們的任務仍然會丟失,如果想要解決該問題則需要做兩件事,我們分別把佇列和訊息標記為持久

。定義隊列為持久的:

channel.queuedeclare(queue: "hello",

durable:

true,

exclusive: false,

autodelete: false,

arguments: null);

注意:該命令本身是正確的,但是如果在此之前已經一定了乙個名為hello的佇列,那麼該設定就不起作用了,因為rabbitmq不允許你使用不同的引數定義乙個已經存在的佇列,並且會向任何嘗試這樣做的程式返回乙個錯誤。有乙個快速的解決辦法就是生命乙個不同名稱的佇列,哈哈哈哈。。。。

這樣的話,及時rabbitmq掛掉或者重新啟動,該佇列也不會丟失,接下來就需要將該佇列裡的訊息標記為持久的了,怎麼標記呢?這樣做:

通過設定

ibasicproperties.setpersistent為

true

var properties = channel.createbasicproperties();

properties.persistent = 

true;

再次注意:將訊息標記為持久的並不能完全保證郵件不會丟失,儘管它告訴rabbitmq將訊息儲存到磁碟,但是當rabbitmq接受訊息並且還沒有儲存訊息時,仍然有乙個很短暫的視窗,它可能只是儲存在快取中,而不是寫入磁碟。永續性保證並不強,但對於我們簡單的任務佇列來說已經足夠了,但是你如果需

要訊息佇列的持久化的強保證,則可以使用 publisher confirms

6:公平分發,你可能注意到排程仍然不能按照我們的要求工作,例如在有兩名工作者的情況下,當所有奇怪資訊都很重或者很輕時,乙個工作人員就會一直忙,另外一名工作人員幾乎很閒,那麼rabbitmq可能並不知道,仍然的均勻傳送訊息。發生這種情況是因為rabbitmq只在訊息進入佇列時排程訊息,它並

沒有考慮工作者未完成的訊息數量。只是盲目地不停把n條訊息分發給n個工作者。為了改變這種行為,我們可以使用basicqos方法個prefetchcount=1設定,這樣設定就是告訴rabbitmq一次不能給乙個工作者多個訊息,換句話來說就是不要像工作者傳送新訊息,直到處理並確認了前乙個訊息。相反它會將

訊息分派給下乙個還不忙的工作人員。

在工作者裡面設定:

channel.basicqos(0,1,false

);

rabbitMQ工作佇列

簡介 傳送耗時的任務給多個工作者,直到任務完成,返回給mq資訊,mq刪除佇列中的訊息。如果沒有收到返回資訊,就斷掉了,mq重新傳送該條資訊 data implode array slice argv,1 if empty data data hello world msg new amqpmessa...

RabbitMQ 工作佇列

rabbitmq是訊息 它接收資訊和 資訊。你可以把他考慮成乙個郵局。當你講郵寄的信放在郵局時,你可以確定郵差先生或者女士會把郵件最終送到你的收件人手中。當然郵局和rabbitmq最大的區別,rabbitmq不接受紙張,它只接收,儲存,二進位制的資料訊息快。下面講一些rabbitmq中的術語 注意 ...

RabbitMQ的工作佇列和路由

工作佇列 working queue 工作佇列這個概念與簡單的傳送 接收訊息的區別就是 接收方接收到訊息後,可能需要花費更長的時間來處理訊息,這個過程就叫乙個work task。幾個概念 分配 多個接收端接收同乙個queue時,如何分配?訊息確認 server端如何確定接收方的work已經對訊息進行...