golang使用rabbitmq(二)工作佇列

2021-09-24 06:31:24 字數 1746 閱讀 1943

在helloworld那一章講了乙個簡單的乙個生產者乙個消費者的模型,但生產系統中很多時候是多個生產者或者多個消費者同時處理的。

body :=

bodyfrom

(os.args)

err = ch.

publish(""

, q.name,

false

,false

, amqp.publishing

)

bodyfrom

func

bodyfrom

(args [

]string

)string

return

"default"

}

msgs, err := ch.

consume

(q.name,"",

true

,false

,false

,false

,nil

)failonerror

(err,

"failed to register a consumer")go

func()

}()

預設情況下訊息會迴圈分發到消費者

當消費者的autoack為true時,一旦收到訊息就會直接把該訊息設定為刪除狀態,如果訊息的處理時間之內,消費者掛掉了那麼這條訊息就會丟失掉。

rabbitmq支援訊息ack機制,將autoack設為false,當處理完畢再手動觸發ack操作。如果處理訊息的過程中掛掉了,那麼這條訊息就會分發給其他都消費者。

msgs, err := ch.

consume

(q.name,"",

false

,false

,false

,false

,nil

)failonerror

(err,

"failed to register a consumer")go

func()

}()

之前說的是消費者掛掉不會丟失訊息的解決方法,那麼如果mq掛掉呢,如果保證mq掛掉都不會丟失訊息,那麼就是訊息永續性做到事情。

訊息永續性分為兩步

佇列的永續性

將佇列設為持久的,當mq重啟的時候不會丟失佇列

q, err := ch.

queuedeclare

("workqueue"

,true

,false

,false

,false

,nil

)

訊息的永續性

發布訊息時,設定訊息為持久的

err = ch.

publish(""

, q.name,

false

,false

, amqp.publishing

)

迴圈分配方式只能做到平均分配,每個消費者乙個一次分配,但是平均不一定就是公平,比如有的消費者所在的伺服器資源較差的情況下,平均肯定是不合理的,為了做到公平那麼使用如下設定即可

err = ch.

qos(1,

0,false

)

這段**的意思是最多同時處理乙個,多了先別發給我。

mac 使用docker 安裝 rabbitmq

專案要用到rabbitmq 官網說brew install 但是brew update就半天都不成功,突然想起了docker,以前用過一點點,就試著來了一下 docker search rabbitmq management docker pull rabbitmq management docke...

CentOS 使用yum安裝rabbitmq

rabbitmq erlang版本要求 rabbitmq erlang name rabbitmq erlang baseurl gpgcheck 1 gpgkey repo gpgcheck 0 enabled 1 然後執行 sudo yum install erlang 即可安裝 執行 erl ...

erlang jcl遠端除錯 rabbitmq

job control mode jcl in which jobs can be started,stopped,detached or connected.only the current job can communicate with the shell.通過jcl,我們可以遠端接入乙個er...