1. 程式人生 > >分散式系統之分散式中介軟體zeroMQ

分散式系統之分散式中介軟體zeroMQ

zeroMQ,又稱0MQ,是一個非常簡單的通訊庫,它擴充套件了傳統BSD socket能力,提供簡單的基於訊息的通訊。zeroMQ不解析訊息體,沒有序列化能力,或者說你可以使用任何第三方序列化庫比如google的protocol buffer。

iMatix公司,AMQP協議的制定者,在2010年退出了AMQP工作組,其CEO Pieter Hintjens 認為AMQP從根本上就有不可修改的缺陷,太複雜了,目前轉而支援zeroMQ,iMatix 2011年後不再維護其AMQP軟體OpenAMQP。

在zeroMQ的guide中,將現在(將來)的軟體類比人類的大腦,幾萬億個神經元互相之間傳送訊息來完成一些任務,沒有控制點,沒有單點故障。而現實中,軟體和軟體間的互聯極難,非常難以維護和控制。IETF已經建立了很多標準,用來解決這個問題,HTTP是一個非常簡單的解決方案,但是這個解決方案讓問題更加複雜:HTTP鼓勵開發者和架構師將軟體設計為複雜、萬能的中心伺服器和簡陋、愚蠢的客戶端。這造成了現在整個網際網路到處是中心點,難以控制,即使有分散式的P2P架構(skype,bittorrent),也只是些玩具,很少有人使用它們來傳輸資料,解決實際生產問題。

OK,實踐實踐。按照guide上的說明,下面使用zeroMQ做一個簡單的helloworld分散式程式。

首先安裝zeroMQ,從網站上下載當前release版本,然後編譯安裝,需要g++和uuid-dev(在俺的亞馬遜ec2虛擬機器上沒有,現yum安裝,汗。。。)。編譯出來的動靜態庫和標頭檔案預設都放到了/usr/local目錄下的lib和include目錄下。

server程式碼:

#include <zmq.h>
#include <stdio.h>
#include <string.h>

int main()
{
    void *context = zmq_init(1);

    void *s = zmq_socket(context, ZMQ_REP);
    zmq_bind(s, "tcp://*:5555");

    while (1)
    {
        zmq_msg_t msg;
        zmq_msg_init(&msg);
        zmq_recv(s, &msg, 0);
        printf("received hello\n");

        zmq_msg_close(&msg);

        zmq_msg_init_size(&msg, 5);
        memcpy(zmq_msg_data(&msg), "World", 5);
        zmq_send(s, &msg, 0);
        zmq_msg_close(&msg);
    }

    zmq_close(s);
    zmq_term(context);
}

client程式碼:

#include <stdio.h>
#include <string.h>
#include <zmq.h>

int main()
{
    void *ctx = zmq_init(1);
    void *s = zmq_socket(ctx, ZMQ_REQ);
    zmq_msg_t msg;
    char buf[10];

    zmq_connect(s, "tcp://localhost:5555");

    zmq_msg_init_size(&msg, 5);
    memcpy(zmq_msg_data(&msg), "hello", 5);
    zmq_send(s, &msg, 0);
    zmq_msg_close(&msg);

    zmq_msg_init(&msg);
    zmq_recv(s, &msg, 0);
    memcpy(buf, zmq_msg_data(&msg), 5);
    buf[5] = 0;
    printf("%s\n", buf);

    zmq_msg_close(&msg);
    zmq_close(s);
    zmq_term(ctx);
    return 0;
}

Makefile:

all: server client
server: server.c
    gcc -o [email protected] $< -lzmq
client: client.c
    gcc -o [email protected] $< -lzmq

ok,測試通過。解釋一下,客戶端和服務端都是首先初始化一個zmq的context,然後建立一個socket,客戶端建立request型別的,服務端建立reply型別的,服務端bind一個地址,客戶端connect這個地址,然後客戶端傳送一個訊息,服務端收到後迴應一個訊息。

可以看到如下幾點:

0. zeroMQ就是一個通訊庫,提供建立socket,建立連線,監聽埠,傳送訊息,接收訊息的功能。

1. 使用類似URL的字串方式指定一個地址,遠遠比BSD socket的sockaddr好用。

2. context建立時可以指定有多少個I/O執行緒,可以併發進行多個執行緒處理

3. 對於string,不假定有'\0'結束符,便於多種語言進行互動

4. 對於訊息內容,zeroMQ不做任何解析,就是一段長度的位元組流,編解碼由客戶端和服務端自己搞定

5. 最後很有趣的一點,先啟動客戶端,再啟動服務端,程式照樣執行正常,說明在建立連線時,如果被連線的服務端不存在,客戶端會等待並嘗試重連。這一點對分散式系統的容錯性比較有意義。

先到這裡,後續深入分析。

相關推薦

分散式系統分散式中介軟體zeroMQ

zeroMQ,又稱0MQ,是一個非常簡單的通訊庫,它擴充套件了傳統BSD socket能力,提供簡單的基於訊息的通訊。zeroMQ不解析訊息體,沒有序列化能力,或者說你可以使用任何第三方序列化庫比如google的protocol buffer。 iMatix公司,AMQP協

【chenglinhust的專欄】分散式系統 基礎架構 中介軟體系統 安全領域 容器技術 人工智慧

個人簡介 2007.9~2011.7 本科 電腦科學與技術 2011.9~2014.3 碩士 計算機系統結構。目前畢業後一直任職於阿里巴巴雲端計算事業部。聯絡QQ:786071807

java中的分散式應用(二)各類中介軟體中用到的演算法

    為了便於區分分散式系統中用到的各類中介軟體所使用的演算法,這裡記錄了他們的核心演算法,但由於個人能力有限,不涉及演算法實現,有關演算法實現請大家另尋他路,這裡只記錄中介軟體核心演算法以及簡單介

分散式系統資料分片前言2

轉載:https://www.cnblogs.com/xybaby/p/7076731.html 目錄 三種資料分片方式 hash方式: 一致性hash  range based 小結: 分片特徵值的選擇

分散式系統資料分片前言1

轉載:https://www.cnblogs.com/xybaby/p/7076731.html 目錄 寫在前面 帶著問題出發 資料分片 資料冗餘 其他 總結: 正文   很長一段時間,對分散式系統都比較感興趣,也

教你用 redis 實現分散式冪等服務中介軟體

背景 在程式設計領域,冪等性是指對同一個系統,使用同樣的條件,一次請求和重複的多次請求對系統資源的影響是一致的。 在分散式系統裡,client 呼叫 server 提供的服務,由於網路環境的複雜性,呼叫可能有以下幾種情況: server 收到 client 的請求,client 也收到

[原創]分散式系統快取的微觀應用經驗談(三)【資料分片和叢集篇】

分散式系統之快取的微觀應用經驗談(三)【資料分片和叢集篇】 前言   近幾個月一直在忙些瑣事,幾乎年後都沒怎麼閒過。忙忙碌碌中就進入了2018年的秋天了,不得不感嘆時間總是如白駒過隙,也不知道收穫了什麼和失去了什麼。最近稍微休息,買了兩本與技術無關的書,其一是 Yann Martel 寫的《The

[原創]分散式系統快取的微觀應用經驗談(四) 【互動場景篇】

分散式系統之快取的微觀應用經驗談(四) 【互動場景篇】  前言   近幾個月一直在忙些瑣事,幾乎年後都沒怎麼閒過。忙忙碌碌中就進入了2018年的秋天了,不得不感嘆時間總是如白駒過隙,也不知道收穫了什麼和失去了什麼。最近稍微休息,買了兩本與技術無關的書,其一是 Yann Martel 寫的《The

分散式系統CAP和BASE理論

CAP定理 一致性(Consistency) 在分散式環境中,一致性是指資料在多個副本之間是否能夠保持一致性的特性。 可用性(Availability) 可用性是指系統提供的服務必須一直處於可用的狀態,對於使用者的每一個操作請求總是能夠在有限的時間內返回結果。 分割

帶著問題學習分散式系統資料分片

  在前文中,提出了分散式系統(尤其是分散式儲存系統)需要解決的兩個最主要的問題,即資料分片和資料冗餘,下面這個圖片(來源)形象生動的解釋了其概念和區別:      其中資料即A、B屬於資料分片,原始資料被拆分成兩個正交子集分佈在兩個節點上。而資料集C屬於資料冗餘,同一份完整的資料在兩個節點都有儲存。當然

分散式系統資料分片及特徵值的選擇

正文   在前文中,提出了分散式系統(尤其是分散式儲存系統)需要解決的兩個最主要的問題,即資料分片和資料冗餘,下面這個圖片(來源)形象生動的解釋了其概念和區別:      其中資料即A、B屬於資料分片,原始資料被拆分成兩個正交子集分佈在兩個節點上。而資料集C屬於資料冗餘,同一份完整的資料

分散式系統Quorum (NRW)演算法

基於Quorum投票的冗餘控制演算法 Quorom 機制,是一種分散式系統中常用的,用來保證資料冗餘和最終一致性的投票演算法,其主要數學思想來源於鴿巢原理。 在有冗餘資料的分散式儲存系統當中,冗餘資料物件會在不同的機器之間存放多份拷貝。但是同一時刻一個數據物件的多份拷貝只能用於讀或者用於寫。 該演算法可

帶著問題學習分散式系統中心化複製集

  假若我說有三個節點(計算機)要維護同一分資料,如果你對分散式系統並不瞭解,那麼你可能會有什麼問題呢,我想可能有兩個最基本的問題:   為什麼同一份資料要儲存多分?   這些節點資料要一致吧,否則同時從多個節點讀的時候資料不一樣?   第一個問題,為什麼要同一分資料要儲存多分,是因為分散式系統

分散式系統五:程序/執行緒

本博文主要講訴核心作業系統的程序、執行緒等 程序     一個程序由一個執行環境和一個或多個執行緒組成。 執行環境:     資源管理的基本單位,它是一個程序的執行緒所能訪問的由本地核心管理的資源集合,可以提供保護而不被外部執行緒訪問。包含:     1. 一個地址空間:是一組虛擬記憶體的集合,由核心提供,

分散式高可靠訊息中介軟體-Hippo

前言 隨著大資料產品的日漸豐富以及資料應用場景需求的增加,TDBank作為騰訊大資料平臺的資料接入環節的位置也越發顯得重要(見下圖)。截止目前為止TDBank日均接入資料已經超過2W億條每天(約600TB/天),並且資料量還在持續不斷上升。Tube 作為整個資料接入體系的

python爬蟲scrapy中介軟體介紹

一、概述   1.中介軟體的作用           在scrapy執行的整個過程中,對scrapy框架執行的某些步驟做一些適配自己專案的動作.      例如scrapy內建的HttpErrorMiddleware,可以在ht

《大型網站系統與JAVA中介軟體實踐》 第六章 訊息中介軟體

    如何保證一致性                     &

《大型網站系統與JAVA中介軟體實踐》 第五章 資料訪問層

         兩階段提交                 &nbs