一個(gè)消息隊(duì)列
消息隊(duì)列的模式
1.?簡(jiǎn)單模式:當(dāng)客戶端(生產(chǎn)者)將消息寫入到消息隊(duì)列中時(shí),消息隊(duì)列中消息的數(shù)量加1,消費(fèi)者實(shí)時(shí)監(jiān)聽消息隊(duì)列,當(dāng)隊(duì)列中有消息時(shí),則獲取消息,之后執(zhí)行業(yè)務(wù)邏輯,同時(shí)消息隊(duì)列的消息數(shù)量減1。

2.?工作模式:由一個(gè)生產(chǎn)者負(fù)責(zé)消息寫入隊(duì)列,但是如果只有一個(gè)消費(fèi)者負(fù)責(zé)消費(fèi),可能會(huì)造成消息的積壓,所以準(zhǔn)備多個(gè)消費(fèi)者共同消費(fèi)一個(gè)隊(duì)列中的消息。

3.?發(fā)布/訂閱模式(Publish/Subscribe):一個(gè)生產(chǎn)者發(fā)送的消息會(huì)被多個(gè)消費(fèi)者獲取,每個(gè)消費(fèi)者得到的消息是一樣的,這點(diǎn)不同于工作模式比如微信公眾號(hào),不同的人訂閱同一個(gè)公眾號(hào),收到的消息都是一樣的。

發(fā)布訂閱模式的消息隊(duì)列具體實(shí)現(xiàn)
一個(gè)topic(可認(rèn)為成公眾號(hào))只產(chǎn)生一種類型的消息,topicName(公眾號(hào)名字)用來(lái)標(biāo)識(shí)公眾號(hào),具有唯一性。訂閱某一個(gè)公眾號(hào)的所有訂閱者們都具有相同的topicName,每個(gè)topic包含一個(gè)成員變量set來(lái)存儲(chǔ)它們的全部訂閱者。整體的框架圖如下:

1)消息處理函數(shù)的類型抽象:M:消息類型參數(shù)化。?T:消息處理類類型參數(shù)化。
2)消息處理線程的類型抽象:一個(gè)消息處理線程監(jiān)聽一個(gè)消息隊(duì)列,不斷從消息隊(duì)列中取出消息到臨時(shí)隊(duì)列,然后調(diào)用傳遞進(jìn)來(lái)的消息處理類的成員函數(shù)進(jìn)行處理。
3)消費(fèi)者類型抽象:每個(gè)訂閱者(Subscriber)需要知道自己訂閱了什么公眾號(hào)(topicName)。有消息提醒時(shí)就去瀏覽信息(消息處理線程)。
4)生產(chǎn)者類型抽象:用 topicName 來(lái)表示一個(gè)公眾號(hào),一個(gè)公眾號(hào)只可以產(chǎn)生一種類型的消息,可以有很多個(gè)人(Subscriber)進(jìn)行訂閱,成員變量包含一個(gè)set來(lái)存儲(chǔ)所有的訂閱者。當(dāng)有消息產(chǎn)生的時(shí)候,每個(gè)訂閱者者都會(huì)收到相同的消息。
5)訂閱流程類型抽象:
消息隊(duì)列使用