一:Basic的一些屬性,一些方法數據庫
1. 消費端的確認服務器
自動確認: message出隊列的時候就自動確認【broke】 basicget。。。性能
手工確認: message出隊列以後,要應用程序本身去確認是否已經消費完畢,若是consumer拿到message以後,沒有手工確認,這個時候message不會被丟失
void BasicAck(ulong deliveryTag, bool multiple);orm
multiple: true,表示的全部message都會被確認。。。。
手工拒絕: consumer拒絕服務器發送過來的消息。。。rabbitmq
《1》 直接扔了。。。
《2》 給快遞師傅。。。
從新遞送: 【商家補發】 快遞丟單。。。商家只能從新發一次。。。
Basic提供了那些方法來作到這些事情。
//扔掉消息
channel.BasicReject(result.DeliveryTag, false);隊列
//退回消息
channel.BasicReject(result.DeliveryTag, true);事務
//批量退回或刪除,中間的參數 是否批量 true是/false否 (也就是隻一條)
channel.BasicNack(result.DeliveryTag, true, true);ip
//補發消息 true退回到queue中(有可能被其它的consumer接收到)/false只補發給當前的consumer
channel.BasicRecover(true);get
2. 發佈端的確認 手工確認消息是否已經發送到了broke。。。。string
confirm機制。。。
tx機制: 【事務控制】
publish 送message到rabbitmq中,咱們必定要知道,這個消息已經發送成功了。。。。 也就是,rabbitmq
必定要告訴publish,這條消息已經被確認收到。。。
影響性能的,,, confirm機制 < tx機制【最耗費性能】
//發佈確認
channel.ConfirmSelect();
for (int i = 0; i < 10; i++)
{
channel.BasicPublish(string.Empty, "mytest", null, Encoding.UTF8.GetBytes(string.Format("{0} 你好", i)));
}
var isallpublished = channel.WaitForConfirms();
咱們聲明隊列和交換機的時候設置了持久化,而且將隊列和交換機保存到了mnesia數據庫中,可是咱們發佈的消息如何進行持久化?
經過懶隊列 lazy queue 設置lazy queue+ disk,消息放到磁盤到//聲明一個懶隊列channel.QueueDeclare("lazyqueue", true, false, false, new Dictionary<string, object>{ { "x-queue-mode","lazy"}});