zeromq使用模式實驗總結
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使用模式實驗總結