1. 協(xié)議中的數(shù)據(jù)結(jié)構(gòu)
nanomsg定義3種數(shù)據(jù)結(jié)構(gòu)nn_dist、nn_hash和nn_priolist,來保存nn_pipe(實(shí)際上就是nn_pipebase)。有了它們,就可以按不同的順序訪問它們包括的nn_pipe。
1.1 nn_dist
nn_dist直接包括一個(gè)普通的列表nn_list。
將nn_pipe包裹在nn_dist_data的派生類實(shí)例中,就可以保存在nn_dist中。其中的nn_pipe順序訪問。

1.2 nn_hash
nn_hash是一個(gè)hash列表。它的array成員是一組nn_list,可以根據(jù)nn_list_item的key值將它保存到其中一個(gè)nn_list中。
將nn_pip包裹在nn_hash_item的派生類實(shí)例中,并賦予nn_pipe唯一的key,就可以將它保存在nn_hash中。其中的nn_pipe根據(jù)key快速訪問。

1.3 nn_priolist
nn_priolist的成員slots[]是一組nn_priolist_slot,而nn_priolist_slot包括一個(gè)nn_list。可以根據(jù)nn_list_item的優(yōu)先值將它保存在對應(yīng)的nn_priolist_slot實(shí)例中。在nn_priolist中,nn_priolist_slot是按優(yōu)先值排序的(實(shí)際上priority對應(yīng)的就是slots[priority-1])。
將連接的nn_pipe被包裹在nn_priolist_data的派生類實(shí)例中,并給nn_pipe一個(gè)優(yōu)先值,就可以將它保存在nn_priolist中。其中的nn_pipe按優(yōu)先級訪問,高優(yōu)先級的先訪問,高優(yōu)先級的被移除了,才輪到低優(yōu)先級的。
為了快速確定當(dāng)前最高優(yōu)先級的nn_pipe,nn_priolist_data將優(yōu)先值保存在priority成員中。

2. 協(xié)議
2.1 xpub/xsub
在PUB端創(chuàng)建nn_xpub對象。

nn_xpub可以發(fā)送消息給多個(gè)SUB端。
nn_xpub用nn_dist保存nn_pipe。發(fā)送消息時(shí),nn_xpub依次遍歷其中的nn_pipe并發(fā)送。
在SUB端創(chuàng)建nn_xsub對象。

nn_xsub可以從多個(gè)PUB端接收消息。
nn_xsub用nn_fq保存nn_pipe, nn_fq內(nèi)部包括nn_priolist。調(diào)用者通過socket選項(xiàng)指定nn_pipe的優(yōu)先值。
接收消息時(shí),nn_xsub優(yōu)先從優(yōu)先級高的nn_pipe接收。優(yōu)先級高的nn_pipe沒有消息了,才輪到優(yōu)先級低的。
nn_xsub的nn_trie成員是一個(gè)前綴樹,用來保存過濾條件。調(diào)用者可以通過socket選項(xiàng)指定這個(gè)條件。接收消息時(shí),如果不匹配條件,則消息被丟棄。
2.2 xreq/xrep
在RESPOND端創(chuàng)建nn_xrep對象。

nn_xrep可以響應(yīng)多個(gè)REQUEST端的請求。
nn_xrep用nn_hash保存nn_pipe用于發(fā)送。nn_xrep用一個(gè)單調(diào)遞增值給nn_pipe設(shè)置key,key的初值是隨機(jī)產(chǎn)生的。
nn_xrep用nn_fq保存nn_pipe用于接收,nn_fq中包括nn_priolist。 接收消息時(shí),nn_xsub按照優(yōu)先級順序接收,這點(diǎn)與xsub的用法相同。不同的是,nn_xrep還要有消息回應(yīng)。nn_xrep把nn_pipe的key值保存消息頭中,返回給調(diào)用者。調(diào)用者發(fā)送回應(yīng)消息時(shí)應(yīng)該附帶這個(gè)key,nn_xrep從中解析出key后,就可以在nn_hash中找到相應(yīng)的nn_pipe發(fā)送消息了。
在REQUEST端創(chuàng)建nn_xreq對象。

nn_xrep可以向多個(gè)RESPOND端發(fā)送請求。
nn_xrep將nn_pipe保存在nn_lb用于發(fā)送,同時(shí)也保存在nn_fq用于接收。 nn_lb和nn_fq都是nn_priolist。調(diào)用者可以對nn_pipe的發(fā)送方向和接收方向分別設(shè)置優(yōu)先級。
發(fā)送請求消息時(shí),nn_xrep優(yōu)先向優(yōu)先級高的nn_pipe發(fā)送。優(yōu)先級高的nn_pipe發(fā)送空間滿了,才輪到優(yōu)先級低的。
接收回應(yīng)消息時(shí),nn_xrep優(yōu)先從優(yōu)先級高的nn_pipe接收。優(yōu)先級高的nn_pipe沒有消息了,才輪到優(yōu)先級低的。
2.3 xsurveyor/xrespondent
在RESPONDENT端創(chuàng)建nn_xrespondent。

nn_xrespondent可以響應(yīng)多個(gè)SURVEYOR的問詢請求。
nn_xrespondent將nn_pipe保存在nn_hash中用于發(fā)送。nn_xrespondent用一個(gè)單調(diào)遞增值給nn_pipe設(shè)置key,key的初值是隨機(jī)產(chǎn)生的。
nn_xrespondent將nn_pipe保存在nn_fq中用于接收。接收消息時(shí),nn_xresondent按照優(yōu)先級順序接收。nn_xrespondent要發(fā)送回應(yīng)消息。nn_xrespondent把nn_pipe的key值保存消息頭中,返回給調(diào)用者。調(diào)用者發(fā)送回應(yīng)消息時(shí)應(yīng)該附帶這個(gè)key,nn_xrespondent從中解析出key后,就可以在nn_hash中找到相應(yīng)的nn_pipe發(fā)送消息了。
在SURVEYOR端創(chuàng)建nn_xsurveyor。

nn_xsurveyor可以向多個(gè)xrespondent問詢。
nn_xsurveyor將nn_pipe保存在nn_dist中用于發(fā)送。發(fā)送時(shí),nn_xresondent向所有nn_pipe依次發(fā)送詢問消息。
nn_xsurveyor將nn_pipe保存在nn_fq中用于接收。接收時(shí),nn_xsurveyor優(yōu)先從優(yōu)先級高的nn_pipe接收。優(yōu)先級高的nn_pipe沒有消息了,才輪到優(yōu)先級低的。
2.4 pipeline
nanomsg直接支持的協(xié)議是nn_xpull和nn_xpush協(xié)議。要構(gòu)造pipeline,調(diào)用者需要組合nn_xpull和nn_xpush。pipeline起點(diǎn)需要一個(gè)xpush,終點(diǎn)需要一個(gè)nn_xpull,中間的節(jié)點(diǎn)則組合xpull和xpush各一個(gè)。
在PUSH端創(chuàng)建nn_xpush。

nn_xpush可以向多個(gè)PULL端推送消息。
nn_xpush將nn_pipe保存在nn_lb中用于發(fā)送,nn_lb包括nn_priolist。
發(fā)送消息時(shí),nn_xpush優(yōu)先向優(yōu)先級高的nn_pipe發(fā)送。優(yōu)先級高的nn_pipe發(fā)送空間滿了,才輪到優(yōu)先級低的。
在PULL端創(chuàng)建nn_xpull。

nn_xpull可以從多個(gè)PUSH端接收消息。
nn_xpull將nn_pipe保存在nn_fq中用于接收。 nn_lb包括nn_priolist。
接收消息時(shí),nn_xpull優(yōu)先從優(yōu)先級高的nn_pipe接收。優(yōu)先級高的nn_pipe沒有消息了,才輪到優(yōu)先級低的。
相關(guān)鏈接
nanomsg 1.1.5 源代碼分析 (一)
nanomsg 1.1.5 源代碼分析 (二)
nanomsg 1.1.5 源代碼分析 (三)
nanomsg 1.1.5 源代碼分析 (四)