消息一緻性問題
- 在使用rabbitmq中,消息的一緻性是非常重要的一個話題。在資料一緻性方面,發送者發送消息出來,在資料一緻性的要求下,我們通常認為必須達到以下條件
- broker持久化消息
- publisher知道消息已經成功持久化
- 首先,我們可以采用事務來解決此問題。每個消息都必須經曆以上兩個步驟,就算一次事務成功。
- 事務是同步的。是以,如果采用事務,發送性能必然很差。官方給出來的性能是:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiQDOxEzX3xCZlhXam9VbsUmepNXZy9CXwJWZ3xCdh1mcvZ2Lc1zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwIzX39GZhh2csATMflHLwEzX4xSZz91ZsAzMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xiNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL3gTO4cTYlVWNyQGM1ADNzYzX4EjNxADM4AzLcBTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
- 異步的方法的效率是事務方法效率的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/