上一遍演示了遠程結果返回的示例,可是有一個沒有提到,就是correlation id,這個是個什麼東東呢?python
假設有多個計算節點,控制中心開啓多個線程,往這些計算節點發送數字,要求計算結果並返回,可是控制中心只開啓了一個隊列,全部線程都是從這個隊列裏獲取消息,每一個線程如何肯定收到的消息就是該線程對應的呢?這個就是correlation id的用處了。correlation翻譯成中文就是相互關聯,也表達了這個意思。服務器
correlation id運行原理:控制中心發送計算請求時設置correlation id,然後計算節點將計算結果,連同接收到的correlation id一塊兒返回,這樣控制中心就能經過correlation id來標識請求。其實correlation id也能夠理解爲請求的惟一標識碼。app
示例內容:控制中心開啓多個線程,每一個線程都發起一次計算請求,經過correlation id,每一個線程都能準確收到相應的計算結果。性能
compute.py代碼分析fetch
和上面一篇相比,只需修改一個地方:將計算結果發送回控制中心時,增長參數correlation_id的設定,該參數的值實際上是從控制中心發送過來的,這裏只是再次發送回去。代碼以下:ui
1spa 2線程 3翻譯 4code 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
center.py代碼分析
控制中心代碼稍微複雜些,其中比較關鍵的有三個地方:
代碼以下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
|
筆者開啓了兩個終端,來運行compute.py,開啓一個終端來運行center.py,最後結果輸出截圖以下:
python使用rabbitmq多節點結果返回圖示
能夠看到雖然獲取的結果不是順序輸出,可是結果和源數據都是對應的。
這邊示例的作法就是建立一個隊列,使用correlation id來標識每次請求。也有作法能夠不使用correlation id,就是每請求一次,就建立一個臨時隊列,不過這樣太消耗性能了,官方也不推薦這麼作。