二、”工作隊(duì)列”
在第一節(jié)中我們發(fā)送接收消息直接從隊(duì)列中進(jìn)行。這節(jié)中我們會(huì)創(chuàng)建一個(gè)工作隊(duì)列來(lái)分發(fā)處理多個(gè)工作者中的耗時(shí)性任務(wù)。
工作隊(duì)列主要是為了避免進(jìn)行一些必須同步等待的資源密集型的任務(wù)。實(shí)際上我們將這些任務(wù)時(shí)序話稍后分發(fā)完成。我們將某個(gè)任務(wù)封裝成消息然后發(fā)送至隊(duì)列,后臺(tái)運(yùn)行的工作進(jìn)程將這些消息取出然后執(zhí)行這些任務(wù)。當(dāng)你運(yùn)行多個(gè)工作進(jìn)程的時(shí)候,這些任務(wù)也會(huì)在它們之間共享。
前期準(zhǔn)備
上一節(jié)的練習(xí)中我們發(fā)送的是簡(jiǎn)單包含“Hello World!”的消息,這節(jié)我們還發(fā)送字符串不過(guò)用此代表更復(fù)雜的任務(wù),實(shí)際我們這里并沒(méi)有真正的任務(wù),像圖片縮放或pdf文件渲染之類的,這里我們假裝我們很忙(即處理的消息任務(wù)很耗時(shí)),使用time.Sleep函數(shù)實(shí)現(xiàn)。我們用字符串中的”.”符號(hào)的數(shù)量代表任務(wù)的復(fù)雜性,每一個(gè)”.”需要耗時(shí)1s來(lái)執(zhí)行處理。比如:”Hello…”代表該消息處理耗時(shí)3s。
我們稍微修改下上節(jié)中send.go代碼,為了可以在命令行直接發(fā)送任意數(shù)量的消息。該程序?qū)⑷蝿?wù)發(fā)送到我們的隊(duì)列,暫且命名為new_task.go:
body := bodyFrom(os.Args) err = ch.Publish( "", // exchange q.Name, // routing key false,