做網(wǎng)站開發(fā)的集團品牌策劃案例
背景
已知rabbitmq和kafka作為消息中間件來給程序之間增加異步消息傳遞功能,這兩個中間件都是專業(yè)的,功能也很強,但是有的時候過于復雜,對于只有一組消費者的消息隊列,使用Redis 就可以輕松搞定。
異步消息隊列
讀者可以思考一下他的幾種數(shù)據(jù)結(jié)構(gòu)哪種更適合,string,hash,set,zset,list?
是的很明顯list',使用rpush/lpush進隊列,rpop/lpop出隊列
隊列空了怎么辦
消費者重復快速從隊列中消費,那么隊列很快就會空,那么就會重復pop操作。浪費生命的空輪詢,拉高無用的能耗,通常的解決方案就是讓消費線程睡一會,一般1s就夠了。
但是又有新問題,如果消費者數(shù)量過多,睡眠時間綜合起來就太多了,縮短睡眠時間?但還是有別的方案,阻塞讀
blpop brpop? ?b前綴是blocking 阻塞
?阻塞讀是隊列為空時會立刻進入休眠狀態(tài),一旦數(shù)據(jù)來了就立即喚醒,基本沒有延遲。
看起來是不是完美無缺,但是如果斷開鏈接呢?
線程一直阻塞的話,Redis鏈接閑置的話,服務器會關(guān)閉它,并拋出異常。
延時隊列的實現(xiàn)
redis中一種特殊的數(shù)據(jù)結(jié)構(gòu),zset,消息序列化成一個字符串作為zset的value,消息的到期時間作為他們的score,用多個線程輪詢zset獲取到期的任務處理。(多個線程保證可用,一個線程掛了還有其他的)