ZeroMQ使用學習記錄(轉)
ZMQ簡介
ZMQ(?MQ、ZeroMQ, 0MQ)看起來像是一套嵌入式的網絡鏈接庫,但工作起來更像是一個並發式的框架。它提供的套接字可以在多種協議中傳輸消息,如線程間、進程間、TCP、廣播等。你可以使用套接字構建多對多的連接模式,如扇出、發布-訂閱、任務分發、請求-應答等。ZMQ的快速足以勝任集群應用產品。它的異步I/O機制讓你能夠構建多核應用程序,完成異步消息處理任務。ZMQ有著多語言支持,並能在幾乎所有的操作系統上運行。ZMQ是iMatix公司的產品,以LGPL開源協議發布。
主要有下列三種模式
1.Request-Reply模式:請求響應模式
客戶端在請求後,服務端必須回響應
server:
1 #!/usr/bin/python 2 #-*-coding:utf-8-*- 3 import time 4 import zmq 5 6 context = zmq.Context() 7 socket = context.socket(zmq.REP) 8 socket.bind("tcp://*:5555") 9 10 while True: 11 message = socket.recv() 12 print message 13 #time.sleep(1) 14 socket.send("server response!")
client:
1 #!/usr/bin/python 2 #-*-coding:utf-8-*- 3 4 import zmq 5 import sys 6 7 context = zmq.Context() 8 socket = context.socket(zmq.REQ) 9 socket.connect("tcp://localhost:5555") 10 11 while(True): 12 data = raw_input("input your data:") 13 if data == ‘q‘: 14 sys.exit() 15 16 socket.send(data) 17 18 response = socket.recv(); 19 print response
2.Publish-Subscribe模式:發布訂閱模式
廣播所有client,沒有隊列緩存,斷開連接數據將永遠丟失。client可以進行數據過濾。
server:
1 #!/usr/bin/python 2 #-*-coding:utf-8-*- 3 4 import zmq 5 context = zmq.Context() 6 socket = context.socket(zmq.PUB) 7 socket.bind("tcp://127.0.0.1:5000") 8 while True: 9 msg = raw_input(‘input your data:‘) 10 socket.send(msg)
client:
1 #!/usr/bin/python 2 #-*-coding:utf-8-*- 3 4 import time 5 import zmq 6 context = zmq.Context() 7 socket = context.socket(zmq.SUB) 8 socket.connect("tcp://127.0.0.1:5000")
#此處進行過濾,socket.setsockopt(zmq.SUBSCRIBE, "A")表示只接收信息中頭部為A的信息,其他的省略 9 socket.setsockopt(zmq.SUBSCRIBE,‘‘) 10 while True: 11 print socket.recv()
關於發布-訂閱模式的幾點說明:
- 訂閱者可以連接多個發布者,輪流接收消息;
- 如果發布者沒有訂閱者與之相連,那它發送的消息將直接被丟棄;
- 如果你使用TCP協議,那當訂閱者處理速度過慢時,消息會在發布者處堆積。以後我們會討論如何使用閾值(HWM)來保護發布者。
- 在目前版本的ZMQ中,消息的過濾是在訂閱者處進行的。也就是說,發布者會向訂閱者發送所有的消息,訂閱者會將未訂閱的消息丟棄。
3.Parallel Pipeline模式:管道模式
由三部分組成,push進行數據推送,work進行數據緩存,pull進行數據競爭獲取處理。區別於Publish-Subscribe存在一個數據緩存和處理負載。
當連接被斷開,數據不會丟失,重連後數據繼續發送到對端。
server:
1 #!/usr/bin/python 2 #-*-coding:utf-8-*- 3 4 import zmq 5 6 context = zmq.Context() 7 8 socket = context.socket(zmq.PULL) 9 socket.bind(‘tcp://*:5558‘) 10 11 while True: 12 data = socket.recv() 13 print data
work:
1 #!/usr/bin/python 2 #-*-coding:utf-8-*- 3 4 import zmq 5 6 context = zmq.Context() 7 8 recive = context.socket(zmq.PULL) 9 recive.connect(‘tcp://127.0.0.1:5557‘) 10 11 sender = context.socket(zmq.PUSH) 12 sender.connect(‘tcp://127.0.0.1:5558‘) 13 14 while True: 15 data = recive.recv() 16 sender.send(data)
client:
1 #!/usr/bin/python 2 #-*-coding:utf-8-*- 3 4 import zmq 5 import time 6 7 context = zmq.Context() 8 socket = context.socket(zmq.PUSH) 9 10 socket.bind(‘tcp://*:5557‘) 11 12 while True: 13 data = raw_input(‘input your data:‘) 14 socket.send(data)
轉自http://www.cnblogs.com/binchen-china/p/5643531.html
按個人理解簡要描述下三種模式的區別,應答模式就是普通的socket套接字請求回應,發布訂閱模式可以對服務器的信息進行過濾,管道模式通過一個第三方來存儲客戶端發送,服務器端接受的數據,提供一個緩存的作用。彌補了廣播訂閱模式在客戶端無法收到下線到再次上線之間服務器端的數據的缺陷。
ZeroMQ使用學習記錄(轉)