2016-01-12 144 views
3

我正在使用MassTransit和RabbitMQ創建一個簡單的發佈者/訂閱者。 出版商具有下面的代碼初始化總線:RabbitMQ消息沒有訂閱者需要多久?

/** create the bus */ 
var bus = Bus.Factory.CreateUsingRabbitMq(cfg => 
{ 
    var host = cfg.Host(new Uri("rabbitmq://localhost/"), h => 
    { 
     h.Username("guest"); 
     h.Password("guest"); 
    }); 
}); 

/** start the bus and publish */ 
bus.Start(); 
bus.Publish<IPersonLogin>(new {FirstName = "John", LastName = "Smith"}); 

與認購人已初始化這個代碼:

var bus = Bus.Factory.CreateUsingRabbitMq(cfg => 
{ 
    var host = cfg.Host(new Uri("rabbitmq://localhost/"), h => 
    { 
     h.Username("guest"); 
     h.Password("guest"); 
    }); 

    cfg.ReceiveEndpoint(host, "person_login", e => 
    { 
     e.Consumer<PersonLoginConsumer>(); 
    }); 
}); 

如果我關機認購併發佈2個消息,該消息是不會丟失,只要訂閱者恢復正常,郵件就會被處理。

所以我的問題是:

  1. 如何確保消息停留在RabbitMQ的隊列,直到一個用戶出現且把它撿起來?
  2. 如果服務器重新啓動並且某些消息沒有被任何訂閱服務器處理,它們會丟失,或者一旦訂閱服務器在重新啓動後生效就會被處理,會發生什麼情況?
  3. 這是確保每一條消息都得到處理或者我應該使用不同策略的正確模式嗎?

回答

4

默認情況下,任何消息坐在隊列將一直保留,直到以下三種情況之一發生:

  1. 該消息被消耗
  2. 消息「生存時間」過期(默認爲長生不老)
  3. 服務器崩潰或重啓

如果你有一個隊列滿的消息,這些消息一般會堅持直到發生這三件事中的一件。希望你能儘快讓你的消費者上網,以便消費和處理消息。

你只會設置,如果你想消息在一段時間後自動刪除生存時間(TTL)(假設他們不消耗第一)

的崩潰......一個消息可以生存如果您將郵件持久保存到磁盤,則會崩潰/重新啓動。不過,如果服務器在將消息從交換機路由到隊列之前崩潰,仍然有可能丟失該消息。

+1

正是我在找@derick – Raffaeu

0

在頭腦之上。

  1. 如果沒有任何訂閱者RabbitMQ不知道應將郵件發送到哪個隊列。然後一條消息將無法傳送(不知道這是否會被移動到錯誤隊列中或被跳過)
  2. 如果交換已經存在,它將被放入已訂閱該事件的消費者的隊列中。因此,您終端託管您的消費者可以完成該消息仍將交付。
  3. 當消息傳遞到隊列中時,消費者將選取消息並對其進行處理。如果在處理消息時發生異常,它將被移至endpoint_error隊列。 (根據您的RetryPolicy)。部署一個修復程序並將您的消息移回到主隊列中,並且將處理消息,就好像沒有任何事情發生一樣。

對常見問題的良好讀取常見的問題的

+0

感謝您的回答,我認爲更多與RabbitMQ相比,MassTransit只是我的運輸公司 – Raffaeu

+0

是的,但MassTransit會創建您的交流和隊列。沒有交換沒有消息路由到隊列。沒有路由消息沒有處理消息。 –

相關問題