一. 應(yīng)用場(chǎng)景
- 在web后端服務(wù)的交互中很多場(chǎng)景上游和下游處理的時(shí)間不匹配却嗡,比如上游處理的快在验,下游處理的慢。這時(shí)候就需要隊(duì)列服務(wù)來(lái)緩沖服務(wù)以達(dá)到更高的吞吐率(扛過(guò)高峰)
- 延遲處理請(qǐng)求,比如:延遲添加用戶獎(jiǎng)勵(lì)者春,延遲寫(xiě)入mysql等等。邏輯可以只關(guān)注主流程即返回清女。
二. 我們現(xiàn)在的解決方案-beanstalk隊(duì)列服務(wù)
項(xiàng)目介紹
http://kr.github.io/beanstalkd/協(xié)議介紹
https://raw.githubusercontent.com/kr/beanstalkd/master/doc/protocol.txtBeanstalkd設(shè)計(jì)里面的核心概念:
job:
一個(gè)需要異步處理的任務(wù)钱烟,是Beanstalkd中的基本單元,需要放在一個(gè)tube中。tube:
一個(gè)有名的任務(wù)隊(duì)列拴袭,用來(lái)存儲(chǔ)統(tǒng)一類型的job读第,是producer和consumer操作的對(duì)象。producer:
Job的生產(chǎn)者拥刻,通過(guò)put命令來(lái)將一個(gè)job放到一個(gè)tube中怜瞒。consumer:
Job的消費(fèi)者,通過(guò)reserve/release/bury/delete命令來(lái)獲取job或改變job的狀態(tài)般哼。-
job生命周期:
job狀態(tài)轉(zhuǎn)移圖 一個(gè)典型的使用流程:** 延遲發(fā)放用戶獎(jiǎng)勵(lì) **
1)上游put job 并帶有delay設(shè)置(delay n秒后在進(jìn)入ready隊(duì)列)
2)job進(jìn)入ready狀態(tài)吴汪,下游使用reserve接口取得job內(nèi)容,并使job進(jìn)入reserved狀態(tài)蒸眠。
3)如果job在RRT時(shí)間內(nèi)處理完成漾橙,則下游直接調(diào)用delete,刪除該job黔宛,表示處理正常完成近刘。如果job在RRT時(shí)間沒(méi)有處理完成,該job會(huì)自動(dòng)變?yōu)閞eady狀態(tài),以供其他的下游worker使用臀晃。
4)注意:3)中會(huì)有可能1個(gè)job被多個(gè)work處理多次的問(wèn)題觉渴,如果要嚴(yán)格限制job被執(zhí)行一次或者失敗,則可以在2)步驟后由下游直接調(diào)用bury接口將job置為buried狀態(tài)徽惋,這樣其只會(huì)被一個(gè)下游獲取并執(zhí)行案淋。集群化方案
開(kāi)源的beanstalk是單機(jī)版本的隊(duì)列,集群化需要自己維護(hù)险绘。
上游寫(xiě)入客戶端需要做負(fù)載均衡和分組的工作(一致性hash)踢京。
下游讀取客戶端需要線性掃描讀取每個(gè)隊(duì)列并讀取。這里面有個(gè)問(wèn)題就是:原來(lái)beanstalk設(shè)置的讀取超時(shí)時(shí)間宦棺,會(huì)在現(xiàn)有的策略中放大N倍瓣距。
監(jiān)控和輔助工具
- 重點(diǎn)關(guān)注如下數(shù)據(jù)項(xiàng)
總體的
bmq.cmd-release
the cumulative number of release commands
bmq.current-connections
the number of currently open connections
bmq.job-timeouts
the cumulative count of times a job has timed out
bmq.total-jobs
the cumulative count of jobs created in this tube in the current beanstalkd process
tube的
bmq.current-jobs-delayed
the number of delayed jobs in this tube
bmq.current-jobs-ready
the number of jobs in the ready queue in this tube
bmq.current-jobs-reserved
the number of jobs reserved by all clients in this tube
bmq.current-jobs-urgent
the number of ready jobs with priority < 1024 in this tube
- 輔助工具
phpBeanstalkdAdmin
系統(tǒng)性能數(shù)據(jù)
系統(tǒng)穩(wěn)定性
- 當(dāng)開(kāi)啟-b啟動(dòng)持久化后,其會(huì)將binlog每隔N秒(N可配置為0)刷入到硬盤(pán)代咸,類似redis的aof持久化方式
系統(tǒng)容量
- 依賴內(nèi)存大小(持久化只是把binlog刷到硬盤(pán))
系統(tǒng)性能
- 可以保守認(rèn)為job 的body size小于1k時(shí)蹈丸,qps可以到put 10k,reserve+delete 9k
- 單 server 最大 put 速度
client 開(kāi) 50 進(jìn)程呐芥,每進(jìn)程寫(xiě)入 10k 條 “00”逻杖,用時(shí) 36s,平均 13800/s - 單 server 最大 reserve + delete 速度
client 開(kāi) 50 進(jìn)程思瘟,每進(jìn)程 10k 條荸百,用時(shí) 52s,平均 9600/s