ZeroMQ
套接字通信
傳統(tǒng)Socket編程:所謂套接字(Socket)饶深,就是對網(wǎng)絡中不同主機上的應用進程之間進行雙向通信的端點的抽象酬核。一個套接字就是網(wǎng)絡上進程通信的一端庆捺,提供了應用層進程利用網(wǎng)絡協(xié)議交換數(shù)據(jù)的機制榨汤。從所處的地位來講军掂,套接字上聯(lián)應用進程轮蜕,下聯(lián)網(wǎng)絡協(xié)議棧,是應用程序通過網(wǎng)絡協(xié)議進行通信的接口蝗锥,是應用程序與網(wǎng)絡協(xié)議棧進行交互的接口
- 1.流套接字(SOCK_STREAM):用于提供面向連接跃洛、可靠的數(shù)據(jù)傳輸服務。使用TCP協(xié)議终议。
- 2.數(shù)據(jù)報套接字(SOCK_DGRAM):提供一種無連接的服務汇竭。使用UDP協(xié)議。
- 3.原始套接字(SOCK_RAW):原始套接字與標準套接字(標準套接字指的是前面介紹的流套接字和數(shù)據(jù)報套接字)的區(qū)別在于:原始套接字可以讀寫內(nèi)核沒有處理的IP數(shù)據(jù)包穴张,而流套接字只能讀取TCP協(xié)議的數(shù)據(jù)细燎,數(shù)據(jù)報套接字只能讀取UDP協(xié)議的數(shù)據(jù)。因此皂甘,如果要訪問其他協(xié)議發(fā)送的數(shù)據(jù)必須使用原始套接玻驻。
ZMQ
ZMQ與Socket的區(qū)別是:普通的socket是端到端的(1:1的關系),而ZMQ卻是可以N:M 的關系偿枕,人們對BSD套接字的了解較多的是點對點的連接璧瞬,點對點連接需要顯式地建立連接户辫、銷毀連接、選擇協(xié)議(TCP/UDP)和處理錯誤等嗤锉,而ZMQ屏蔽了這些細節(jié)渔欢,讓你的網(wǎng)絡編程更為簡單。ZMQ用于node與node間的通信档冬,node可以是主機或者是進程膘茎。
ZMQ優(yōu)點:輕量級,跨語言性能好酷誓,時延低披坏。
ZMQ缺點:只是一個網(wǎng)絡庫,不支持持久化盐数。
三種模式
應答模式
將一組服務端和一組客戶端相連棒拂,用于遠程過程調(diào)用或任務分發(fā)。
這里使用請求-應答模式實現(xiàn)一個簡單的hello world程序玫氢。
和普通的socket通信一樣帚屉,需要一個客戶端和一個服務器⊙浚客戶端發(fā)送hello攻旦,服務器收到hello后回應world
使用REQ-REP套接字發(fā)送和接受消息是需要遵循一定規(guī)律的∩荩客戶端首先使用zmq_send()發(fā)送消息牢屋,再用zmq_recv()接收,如此循環(huán)槽袄。如果打亂了這個順序(如連續(xù)發(fā)送兩次)則會報錯烙无。類似地,服務端必須先進行接收遍尺,后進行發(fā)送截酷。
發(fā)布訂閱模式
將一組發(fā)布者和一組訂閱者相連,用于數(shù)據(jù)分發(fā)乾戏。
發(fā)布/訂閱模式實現(xiàn)了單向數(shù)據(jù)分發(fā)迂苛,服務端將事件發(fā)送給一組客戶端。
PUB-SUB套接字組合是異步的鼓择≡植浚客戶端在一個循環(huán)體中使用recv ()接收消息,如果向SUB套接字發(fā)送消息則會報錯惯退;類似地,服務端可以不斷地使用send ()發(fā)送消息从藤,但不能再PUB套接字上使用recv ()催跪。
關于PUB-SUB套接字锁蠕,還有一點需要注意:你無法得知SUB是何時開始接收消息的。就算你先打開了SUB套接字懊蒸,后打開PUB發(fā)送消息荣倾,這時SUB還是會丟失一些消息的,因為建立連接是需要一些時間的骑丸。很少舌仍,但并不是零。解決此問題需要在PUB端加入sleep通危。
- 訂閱者可以連接多個發(fā)布者铸豁,輪流接收消息;
- 如果發(fā)布者沒有訂閱者與之相連菊碟,那它發(fā)送的消息將直接被丟棄节芥;
- 如果你使用TCP協(xié)議,那當訂閱者處理速度過慢時逆害,消息會在發(fā)布者處堆積头镊。可以使用閾值(HWM)來保護發(fā)布者魄幕。
- 從ZeroMQ v3.x開始相艇,當使用(tcp:// or ipc://)連接協(xié)議時,消息的過濾在發(fā)布端纯陨,使用epgm://時坛芽,在訂閱端過濾。在ZeroMQ v2.x中队丝,所有消息的過濾是在訂閱者處進行的靡馁。也就是說,發(fā)布者會向訂閱者發(fā)送所有的消息机久,訂閱者會將未訂閱的消息丟棄臭墨。
基于分布式處理(平行管道模式、推拉模式)
- worker上游和任務分發(fā)器相連膘盖,下游和結果收集器相連胧弛,這就意味著你可以開啟任意多個worker。但若worker是綁定至端點的侠畔,而非連接至端點结缚,那我們就需要準備更多的端點,并配置任務分發(fā)器和結果收集器软棺。所以說红竭,任務分發(fā)器和結果收集器是這個網(wǎng)絡結構中較為穩(wěn)定的部分,因此應該由它們綁定至端點,而非worker茵宪,因為它們較為動態(tài)最冰。
- 我們需要做一些同步的工作,等待worker全部啟動之后再分發(fā)任務稀火。這點在ZMQ中很重要暖哨,且不易解決。連接套接字的動作會耗費一定的時間凰狞,因此當一組worker連接到端點篇裁,第一個worker連接成功時,它會一下收到很多任務赡若。所以說达布,如果我們不進行同步,那這些任務根本就不會被并行地執(zhí)行斩熊。
- 任務分發(fā)器使用PUSH套接字向worker均勻地分發(fā)任務(假設所有的worker都已經(jīng)連接上了)往枣,數(shù)據(jù)在所有連接的節(jié)點之間進行輪詢,這種機制稱為負載均衡粉渠。
- 結果收集器的PULL套接字會均勻地從worker處收集消息分冈,這種機制稱為公平隊列。