zeromq使用模式實驗總結

2022-03-12 16:54:20 字數 2972 閱讀 3660

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各模式總結

zeromq基本的模式有三種 請求 應答 訂閱 分發 管道 請求應答模式中,應答端必須先啟動,不然請求端無法連線到應答端,rep req 這兩個套接字的非阻塞版本,叫做xreq和xrep.這些 擴充套件的請求 應答 套接字允許你通過中介軟體擴充套件請求 應答模型 訂閱 分發模式,無先後啟動問題,pu...

ZeroMQ 推拉模式

推拉模式,push傳送,send。pull方接收,recv。push可以和多個pull建立連線,push傳送的資料被順序傳送給pull方。比如你push和三個pull建立連線,分別是a,b,c。push傳送的第一資料會給a,第二資料會給b,第三個資料給c,第四個資料給a。一直這麼迴圈。推拉模式可分為...

zeromq 模式說的很地道

2013 10 20 20 59 fq 瀏覽815次 2013 10 20 22 08 提問者採納 很早就聽說了zeromq 這個專案,當時不太在意.後來同事kasicass 對這個專案做了研究和分享 開始重視起這個專案來.1 libevent封裝了對網路i o,訊號,定時器等的處理,可以基於它之上...