1. 程式人生 > >zeromq使用模式實驗總結

zeromq使用模式實驗總結

message gui 要求 inf img socket amp 服務端 blank

zeromq:官網 安裝 demo及各語言綁定 golang綁定

實驗環境:win10 x64/centos6 x86 zeromq4.0.6

zmq三種模式:push/pull、pub/sub、req/resp

一、push/pull模式:

技術分享圖片

A程序PUSH代碼如下:

import zmq
import time
context = zmq.Context()

sender = context.socket(zmq.PUSH)
sender.bind("tcp://*:5557")

for task_nbr in range(1000):

    workload = 
task2---+str(task_nbr) sender.send_string(u%s % workload) time.sleep(0.1)

B程序PULL代碼如下:

import time
import zmq

context = zmq.Context()

receiver = context.socket(zmq.PULL)
receiver.connect("tcp://localhost:5557")

while True:

    s = receiver.recv()
    time.sleep(1)

A程序準備發送1000個task任務,完事退出;B程序一直pull。

A先啟動,此時push會一直阻塞,直到有一個pull連接,task才發出,假如中途B掛掉,A也繼續進入阻塞,B再次上線,pull開始從上次A阻塞時的任務拉取。假如A掛掉,task任務發送中斷,則B一直pull到A掛前發出的任務為止,這時候A再重啟上線,則是另一回事了,任務for循環又重新開始,B繼續。

B先啟動,A後啟動,場景和以上A先啟動一樣。

push一端具有負載均衡功能,pull一端可以多啟動幾個實例,均衡執行task,若中途pull一端掛掉,則push自動把任務分發到其他pull上。

二、 pub/sub模式

技術分享圖片

A程序代碼如下:

pub_Queue = Queue.Queue()
context 
= zmq.Context() publisher = context.socket(zmq.PUB) publisher.bind("tcp://*:5557") while True: publisher.send_string(msg)

BCD代碼如下:

 context    = zmq.Context()
 subscriber = context.socket(zmq.SUB)
 subscriber.connect("tcp://*:5557")
 subscriber.setsockopt(zmq.SUBSCRIBE, "2")

 while True:
       
       contents = subscriber.recv()
       print("%s" % contents)

A pub端通過sub端subscriber.setsockopt(zmq.SUBSCRIBE, "2")的“2”過濾信息,sub端可以訂閱多個。遠程公網使用該模式,需要pub端定期維持心跳包,比如半分鐘pub一條信息。

三、req/resp模式

技術分享圖片

A程序代碼如下:

import zmq

context = zmq.Context()

socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")

for request in range(10):
    socket.send(b"Hello")

    message = socket.recv()
    print "Received reply %s [ %s ]" % (request, message)

B程序代碼如下:

import time
import zmq

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")

while True:
    message = socket.recv()

    time.sleep(1)

    socket.send(b"World")

可以沒有先後啟動順序,假如A先啟動,阻塞;假如B先啟動,等待請求接入。

過程中,假如A掛掉,再啟動,可以繼續請求應答;而假如時B服務端掛掉再重啟,則A客戶端已經連不上了,阻塞。情形和以上幾種模式一樣的。

總結:

以上是通過官網python bind的源碼做的實驗。雖然不要求客戶端/服務端的先後啟動次序,但是中途若是服務端掛掉再啟動,就是另一種情況了。在表現形式上來說,似乎此時的c/s線路不再是掛掉之前的,而是服務端又啟動了一條線路一樣。這個時候,就需要客戶端去檢測判斷服務端狀態,以確定重連機制。到底是不是這樣呢?需要深入zeromq的代碼一看究竟了!

zeromq使用模式實驗總結