異步任務(wù)與消息隊(duì)列
同步任務(wù):一定要等任務(wù)執(zhí)行完了客们,得到結(jié)果管挟,才執(zhí)行下一個(gè)任務(wù)蟹地。
異步任務(wù):不用等任務(wù)執(zhí)行完李茫,直接執(zhí)行下一個(gè)任務(wù)沸手。
異步任務(wù)最簡(jiǎn)單可以用異步線程實(shí)現(xiàn)狰贯,golang 中可以用goroutine實(shí)現(xiàn)劫瞳,但受時(shí)間和不確定因素限制呕童,進(jìn)程有可能超時(shí)崔赌、退出或者被殺死意蛀,消息隊(duì)列可以定義任何時(shí)間的延遲耸别,幾天都可以。異步線程县钥、goroutine只是單機(jī)的實(shí)現(xiàn)秀姐,消息隊(duì)列是分布式的,可以跨語(yǔ)言夸系統(tǒng)若贮。消息隊(duì)列是獨(dú)立的省有,跨線程概念的,實(shí)現(xiàn)跨主機(jī)的分布式并發(fā)兜看。
消息隊(duì)列實(shí)現(xiàn)分布式的異步任務(wù)锥咸,利用分布式架構(gòu),實(shí)現(xiàn)可擴(kuò)展性细移,高性能等搏予,解決異構(gòu)系統(tǒng)通信,實(shí)現(xiàn)服務(wù)間的解耦弧轧。
消息系統(tǒng)類型
- Streaming的適合log日志批量寫入雪侥,強(qiáng)調(diào)性能。
- Queque隊(duì)列強(qiáng)調(diào)可靠性精绎,保證消息的正確傳達(dá)與處理速缨,強(qiáng)調(diào)task概念。
NSQ學(xué)習(xí)
NSQ是消息隊(duì)列的一種實(shí)現(xiàn)代乃,采用producer/consumer基于訂閱的模式旬牲,開(kāi)源、設(shè)計(jì)簡(jiǎn)單搁吓、架構(gòu)容易理解原茅,從而debug問(wèn)題變得簡(jiǎn)單明確,
因?yàn)镹SQ簡(jiǎn)單堕仔,可以通過(guò)NSQ了解和入門消息隊(duì)列擂橘,知道什么是消息隊(duì)列,消息隊(duì)列的基本概念和基本實(shí)現(xiàn)摩骨。
通過(guò)學(xué)習(xí)NSQ源代碼通贞,可以深入對(duì)go語(yǔ)言的理解。NSQ實(shí)際基于goroutine管道模式恼五,傳出過(guò)程:將goroutine chan 中傳遞message對(duì)象根據(jù)NSQ傳輸協(xié)議轉(zhuǎn)換成http tcp流中的frame二級(jí)制形式昌罩,傳入過(guò)程:通過(guò)http tcp 管道scream流讀寫解析消息,轉(zhuǎn)換到內(nèi)部go routine chan 消息灾馒,
峡迷,這樣就實(shí)現(xiàn)跨機(jī)器的網(wǎng)絡(luò)傳輸,從而實(shí)現(xiàn)分布式隊(duì)列。
t.memoryMsgChan = make(chan *Message, ctx.nsqd.getOpts().MemQueueSize)
NSQ可以定義內(nèi)存隊(duì)列的大谢娓恪(通過(guò)golang chan 方式 ),超過(guò)了直接落盤傅物,為了可靠性可以將內(nèi)存隊(duì)列長(zhǎng)度定義為零夯辖,讓所有消息直接落盤。
NSQ隊(duì)列實(shí)現(xiàn)通俗理解
領(lǐng)導(dǎo)負(fù)責(zé)布置任務(wù)董饰,把一個(gè)個(gè)任務(wù)放入隊(duì)列中蒿褂,個(gè)人負(fù)責(zé)完成任務(wù),從隊(duì)列中取出任務(wù)卒暂,任務(wù)完成后啄栓,給領(lǐng)導(dǎo)一個(gè)反饋(ACK)任務(wù)就被從隊(duì)列中刪除。重試過(guò)程相當(dāng)于也祠,一次任務(wù)搞不定(出錯(cuò)了)會(huì)被重新放進(jìn)任務(wù)隊(duì)列昙楚,但是會(huì)給你一個(gè)緩沖時(shí)間,等間隔預(yù)定義規(guī)則的時(shí)間再把任務(wù)發(fā)給你诈嘿。
NSQ分布式設(shè)計(jì)
NSQ分布式實(shí)現(xiàn)簡(jiǎn)單堪旧,不依賴第三方組件,不依賴于復(fù)雜算法奖亚。
具體實(shí)現(xiàn):consumer動(dòng)態(tài)訂閱全部的nsqd淳梦,可以從任何nsqd接收指定topic指定channal的消息,這樣不管從哪個(gè)nsqd發(fā)的消息都能收到昔字,某個(gè)nsqd掛了不影響使用(可用性爆袍,producer前可以掛loadblancer,或者通過(guò)主機(jī)池庫(kù)(如:隨機(jī)選擇主機(jī)ip)作郭,均勻向不同主機(jī)的不同nsqd發(fā)布消息陨囊,實(shí)現(xiàn)負(fù)載均衡,簡(jiǎn)單理解就是一個(gè)反過(guò)來(lái)的多http server加loadblancer的模型所坯。
NSQ特性
NSQ支持消息的壓縮
NSQ消息本身沒(méi)有順序
NSQ可以實(shí)現(xiàn)topic channel暫停
NSQ提供了簡(jiǎn)單的web ui谆扎,實(shí)現(xiàn)了可視化。
消息隊(duì)列分兩種一種push 一種pull芹助。
NSQ采用推的方式堂湖,通過(guò)ready inflight狀態(tài)來(lái)限流。
NSQ使用擴(kuò)展
通過(guò)nsq_to_file状土,用某個(gè)channel通過(guò)文件備份消息无蜂,可以配置類似log的Rotation周期。
通過(guò)nsq_to_nsq 把一個(gè)nsq群集的消息同步轉(zhuǎn)發(fā)到另一個(gè)nsq群集中蒙谓,實(shí)現(xiàn)擴(kuò)展斥季。