每個consumer可能需要一段時間才能處理完收到的資料。如果在這個過程中,consumer出錯了,異常退出了,而資料還沒有處理完成,那麼 非常不幸,這段資料就丟失了。
如果乙個consumer異常退出了,它處理的資料能夠被另外的consumer處理,這樣資料在這種情況下就不會丟失了(注意是這種情況下)。
為了保證資料不被丟失,rabbitmq支援訊息確認機制,即acknowledgments。為了保證資料能被正確處理而不僅僅是被consumer收到,那麼我們不能採用no-ack。而應該是在處理完資料後傳送ack。
在處理資料後傳送的ack,就是告訴rabbitmq資料已經被接收,處理完成,rabbitmq可以去安全的刪除它了。
如果consumer退出了但是沒有傳送ack,那麼rabbitmq就會把這個message傳送到下乙個consumer。這樣就保證了在consumer異常退出的情況下資料也不會丟失。
這裡並沒有用到超時機制。rabbitmq僅僅通過consumer的連線中斷來確認該message並沒有被正確處理。
也就是說,rabbitmq給了consumer足夠長的時間來做資料處理。
這樣即使你通過ctr-c中斷了recieve.cs,那麼message也不會丟失了,它會被分發到下乙個consumer。
如果忘記了ack,那麼後果很嚴重。當consumer退出時,message會重新分發。然後rabbitmq會占用越來越多的記憶體,由於 rabbitmq會長時間執行,因此這個「記憶體洩漏」是致命的。
去除錯這種錯誤,可以通過一下命令列印un-acked messages.
如果連線沒有斷開應用要通知伺服器讓訊息重新傳送:
可以通過channel.nack(message)來讓不通過的訊息再次進入訊息佇列。
if(body==』hello world3!』)else{
console.log(『ack』);
chnl.ack(msg);
RabbitMQ訊息佇列 ACK機制
如果乙個consumer異常退出了,它處理的資料能夠被另外的consumer處理,這樣資料在這種情況下就不會丟失了 注意是這種情況下 為了保證資料不被丟失,rabbitmq支援訊息確認機制,即acknowledgments。為了保證資料能被正確處理而不僅僅是被consumer收到,那麼我們不能採用n...
RabbitMQ訊息佇列 ACK機制
如果乙個consumer異常退出了,它處理的資料能夠被另外的consumer處理,這樣資料在這種情況下就不會丟失了 注意是這種情況下 為了保證資料不被丟失,rabbitmq支援訊息確認機制,即acknowledgments。為了保證資料能被正確處理而不僅僅是被consumer收到,那麼我們不能採用n...
RabbitMQ訊息應答 ack機制
執行乙個任務可能需要花費幾秒鐘,你可能會擔心如果乙個消費者在執行任務過程中掛掉了。一旦rabbitmq將訊息分發給了消費者,就會從記憶體中刪除。在這種情況下,如果正在執行任務的消費者宕機,會丟失正在處理的訊息和分發給這個消費者但尚未處理的訊息。但是,我們不想丟失任何任務,如果有乙個消費者掛掉了,那麼...