[C++]合理的設計和使用訊息佇列

來源:互聯網
上載者:User

  生產者消費者問題,是永遠的經典.

  單純讓多個線程去競爭,佔有資源然後處理,會讓系統的複雜度變得相當複雜,並且整個系統的並發也很難控制.為了讓系統簡單化,流暢化,引入訊息佇列,而且這樣,系統更具有相當高的輸送量.因為做的事情簡單而有效.

  根據具體業務的不同,個人(認為)把訊息佇列分為1:1模型,還有就是N:M模型的.

  如果消費者的消費能力非常高.個人認為就應該使用1:1的隊列.這種隊列足夠簡單,可以進行各種最佳化,比如避免動態記憶體分配,鎖最佳化,使用lock-free等.這樣可以讓主迴圈的等待時間降到最低,使其可以專心致志進行各種邏輯處理.

  有時,有些商務邏輯,不是很在乎時許,允許比較小的時間誤差,而且消費能力很強的化,也是可以使用1:1的隊列,不過生產者變成了n個,消費者還是一個.:-D 當然這種情境,不是非常多.

  這邊給出一個lock free的message queue.

  如果消費者的消費能力比較差,還有一些業務,比如金錢相關的,比如資料庫存檔相關的,而且這樣的系統,想要提高輸送量,就只能使用N:M的模型.只不過這邊把lock-free換成了mutex,雖然mutex有可能會陷入到核心,不過只要臨界區足夠小,操作足夠輕量級,效率還是蠻高的.一般的系統,都不會在這邊有瓶頸.

  這邊給出一個blocking queue的實現.

消費速度\時序 關心 不關心
消費速度慢 blocking blocking
消費速度快

1:1 lock free 

N:M blcoking

lock free

  其實很多業務,1:1的就足夠快了.

  PS: 其實N:M的lock free queue也是可以實現的,不過需要用到cas. fecth and add使不能實現n個並發的.另外,cas實現訊息佇列的複雜性相當高,收益也不是非常有效(在CPU核心數較多的情況下),故放棄了實現多並發的lock free隊列.

  另外不關心時序,不是意味著一點都不關心,而是允許有一定的誤差,比如10ms.

  本來還想貼代碼,想想算了,代碼在github上開源了,可以自己去看實現.

  https://github.com/egmkang/green_turtle/blob/master/green_turtle/blocking_queue.h

  https://github.com/egmkang/green_turtle/blob/master/green_turtle/message_queue.h

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.