Message Queue中的推与拉(转)
Message Queue的設計和實現(7)
http://mp.weixin.qq.com/s/zQdDBAHu1UgJJzxH2eCHgQ
?
數據發送中的推與拉。
?
?
當MQ要把數據給消費者的時候,就涉及到數據的傳遞方式。一種是MQ主動的將數據推給消費者;而另一種,則是消費者主動去拉取。兩種方式各有優缺,我們就一個個的來講。(無非就是在愛情中誰主動的問題^_^)
?
推模式
?
推模式很明顯,主動方應該是MQ。在實現的時候卻有兩種方式。
?
1、MQ知道消費者的IP和端口,主動發起連接,推送數據。
?
這種方式是最容易想到和實現的。socket在connect的時候,需要IP:Port。只要這兩個數據存在了,MQ就很輕松的將數據推送出去。但是,問題來了,怎么知道IP和Port。
?
這里有兩種方式:
?
A、MQ存儲有所有消費者的列表。就是手動或者半自動的將所有消費者的列表配置到MQ中。這種方式實現簡單,但是靈活性太差,擴展性不好;
?
B、消費者自動注冊到MQ。當消費者啟動以后,調用MQ提供的regist方法,自動將自己的IP和Port提交到MQ。注冊成功后,MQ將信息放入發送meta數據中,進行推送。
?
第二種方式擴展性比第一種好很多,但是復雜性也相對比第一種要大一些。
?
2、消費者主動連接到MQ,再由MQ進行信息推送。
?
這種方式的實現必須采用長連接的方式。即:消費者主動connect到MQ,然后兩者維持連接不斷開。當有數據到來時,MQ利用這個已有的長連接,將對應的數據推送到消費者。
?
這種方式實現的難度比較高,涉及到長連接維持,以及連接的存活管理。而且如果后端有大量的消費者的話,MQ會消耗比較多的連接資源。
?
以上聊的是推的模式。這種模式及時性非常好,數據一到達,立馬可以push到消費者,基本沒有延遲。但是實現復雜度和靈活性會稍微麻煩一些。
?
拉模式
?
這種模式就比較簡單,就是消費者主動。每次由消費者主動去獲取信息。不論長短連接都可以。MQ也不用維持連接狀態和消費者信息,只要你來獲取,我就把數據給你。
?
這種方式的好處在于實現非常簡單,MQ無負擔,不用記錄消費者的信息。如果服務掛掉或者重啟,也不用擔心消費者信息狀態丟失。因為他自己會來主動獲取。
?
不足之處在于有可能存在短暫延遲。
?
在實現的時候,也可以有改進。比如,消費者去MQ拉取數據,如果拉取后沒有數據,可以停留一定時間(比如:100毫秒)再去拉取。如果拉取有數據,則不用停留,直接拉取。拉的時候也可以走批量拉取,避免數據堆積。
?
總的來講,推拉模式都是可行的,實現復雜度其實也都還好,大家可以根據自身業務的特點來定制這兩種模式。
轉載于:https://www.cnblogs.com/bluestorm/p/6675447.html
總結
以上是生活随笔為你收集整理的Message Queue中的推与拉(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bootstrap --- 在 moda
- 下一篇: [bzoj2456]mode