天天看點

19-RabbitMQ消息一緻性問題

消息一緻性問題

  • 在使用rabbitmq中,消息的一緻性是非常重要的一個話題。在資料一緻性方面,發送者發送消息出來,在資料一緻性的要求下,我們通常認為必須達到以下條件
  • broker持久化消息
  • publisher知道消息已經成功持久化
  • 首先,我們可以采用事務來解決此問題。每個消息都必須經曆以上兩個步驟,就算一次事務成功。
  • 事務是同步的。是以,如果采用事務,發送性能必然很差。官方給出來的性能是:
19-RabbitMQ消息一緻性問題
  • 異步的方法的效率是事務方法效率的100倍。
  • 我們可以采用異步的方式來解決此問題。publisher發送消息後,不進行等待,而是異步監聽是否成功。這種方式又分為兩種模式,一種是return,另一種是confirm. 前一種是publisher發送到exchange後,異步收到消息。第二種是publisher發送消息到exchange,queue,consumer收到消息後才會收到異步收到消息。可見,第二種方式更加安全可靠。如下所示:
  • 但是,異步也存在些局限性。如果一旦出現broker挂機或者網絡不穩定,broker已經成功接收消息,但是publisher并沒有收到confirm或return.這時,對于publisher來說,隻能重發消息解決問題。而在這裡面,我們會發生重複消息的問題。當然,如果業務類型要求資料一緻性非常高,可以采用低效率的事務型解決方案:引用:​​http://www.rabbitmq.com/blog/2011/02/10/introducing-publisher-confirms/​​