Kafka惠啄,ActiveMQ,RabbitMQ等消息隊(duì)列使用的場(chǎng)景介紹

作者:cws1214

blog.csdn.net/cws1214/article/details/52922267

一任内、前言

消息隊(duì)列中間件是分布式系統(tǒng)中重要的組件撵渡,主要解決應(yīng)用耦合,異步消息死嗦,流量削鋒等問(wèn)題

實(shí)現(xiàn)高性能趋距,高可用,可伸縮和最終一致性架構(gòu)

使用較多的消息隊(duì)列有ActiveMQ越除,RabbitMQ节腐,ZeroMQ外盯,Kafka,MetaMQ翼雀,RocketMQ

二饱苟、消息隊(duì)列應(yīng)用場(chǎng)景

以下介紹消息隊(duì)列在實(shí)際應(yīng)用中常用的使用場(chǎng)景。異步處理锅纺,應(yīng)用解耦掷空,流量削鋒和消息通訊四個(gè)場(chǎng)景

2.1異步處理

場(chǎng)景說(shuō)明:用戶注冊(cè)后,需要發(fā)注冊(cè)郵件和注冊(cè)短信囤锉。傳統(tǒng)的做法有兩種 1.串行的方式坦弟;2.并行方式

(1)串行方式:將注冊(cè)信息寫入數(shù)據(jù)庫(kù)成功后,發(fā)送注冊(cè)郵件官地,再發(fā)送注冊(cè)短信酿傍。以上三個(gè)任務(wù)全部完成后,返回給客戶端

image

(2)并行方式:將注冊(cè)信息寫入數(shù)據(jù)庫(kù)成功后驱入,發(fā)送注冊(cè)郵件的同時(shí)赤炒,發(fā)送注冊(cè)短信。以上三個(gè)任務(wù)完成后亏较,返回給客戶端莺褒。與串行的差別是,并行的方式可以提高處理的時(shí)間

image.png

假設(shè)三個(gè)業(yè)務(wù)節(jié)點(diǎn)每個(gè)使用50毫秒鐘雪情,不考慮網(wǎng)絡(luò)等其他開銷遵岩,則串行方式的時(shí)間是150毫秒,并行的時(shí)間可能是100毫秒巡通。

因?yàn)镃PU在單位時(shí)間內(nèi)處理的請(qǐng)求數(shù)是一定的尘执,假設(shè)CPU1秒內(nèi)吞吐量是100次。則串行方式1秒內(nèi)CPU可處理的請(qǐng)求量是7次(1000/150)宴凉。并行方式處理的請(qǐng)求量是10次(1000/100)

小結(jié):如以上案例描述誊锭,傳統(tǒng)的方式系統(tǒng)的性能(并發(fā)量,吞吐量弥锄,響應(yīng)時(shí)間)會(huì)有瓶頸丧靡。如何解決這個(gè)問(wèn)題呢?

引入消息隊(duì)列籽暇,將不是必須的業(yè)務(wù)邏輯温治,異步處理。改造后的架構(gòu)如下:

按照以上約定图仓,用戶的響應(yīng)時(shí)間相當(dāng)于是注冊(cè)信息寫入數(shù)據(jù)庫(kù)的時(shí)間,也就是50毫秒但绕。注冊(cè)郵件救崔,發(fā)送短信寫入消息隊(duì)列后惶看,直接返回,因此寫入消息隊(duì)列的速度很快六孵,基本可以忽略纬黎,因此用戶的響應(yīng)時(shí)間可能是50毫秒。因此架構(gòu)改變后劫窒,系統(tǒng)的吞吐量提高到每秒20 QPS本今。比串行提高了3倍,比并行提高了兩倍

2.2應(yīng)用解耦

場(chǎng)景說(shuō)明:用戶下單后主巍,訂單系統(tǒng)需要通知庫(kù)存系統(tǒng)冠息。傳統(tǒng)的做法是,訂單系統(tǒng)調(diào)用庫(kù)存系統(tǒng)的接口孕索。如下圖

image.png

傳統(tǒng)模式的缺點(diǎn):

  • 假如庫(kù)存系統(tǒng)無(wú)法訪問(wèn)逛艰,則訂單減庫(kù)存將失敗,從而導(dǎo)致訂單失敗

  • 訂單系統(tǒng)與庫(kù)存系統(tǒng)耦合

如何解決以上問(wèn)題呢搞旭?引入應(yīng)用消息隊(duì)列后的方案散怖,如下圖:

image
  • 訂單系統(tǒng):用戶下單后,訂單系統(tǒng)完成持久化處理肄渗,將消息寫入消息隊(duì)列镇眷,返回用戶訂單下單成功

  • 庫(kù)存系統(tǒng):訂閱下單的消息,采用拉/推的方式翎嫡,獲取下單信息欠动,庫(kù)存系統(tǒng)根據(jù)下單信息,進(jìn)行庫(kù)存操作

假如:在下單時(shí)庫(kù)存系統(tǒng)不能正常使用钝的。也不影響正常下單翁垂,因?yàn)橄聠魏螅唵蜗到y(tǒng)寫入消息隊(duì)列就不再關(guān)心其他的后續(xù)操作了硝桩。實(shí)現(xiàn)訂單系統(tǒng)與庫(kù)存系統(tǒng)的應(yīng)用解耦

2.3流量削鋒

流量削鋒也是消息隊(duì)列中的常用場(chǎng)景沿猜,一般在秒殺或團(tuán)搶活動(dòng)中使用廣泛

應(yīng)用場(chǎng)景:秒殺活動(dòng),一般會(huì)因?yàn)榱髁窟^(guò)大碗脊,導(dǎo)致流量暴增啼肩,應(yīng)用掛掉。為解決這個(gè)問(wèn)題衙伶,一般需要在應(yīng)用前端加入消息隊(duì)列祈坠。

1.可以控制活動(dòng)的人數(shù)

2.可以緩解短時(shí)間內(nèi)高流量壓垮應(yīng)用

image

3.用戶的請(qǐng)求,服務(wù)器接收后矢劲,首先寫入消息隊(duì)列赦拘。假如消息隊(duì)列長(zhǎng)度超過(guò)最大數(shù)量,則直接拋棄用戶請(qǐng)求或跳轉(zhuǎn)到錯(cuò)誤頁(yè)面

4.秒殺業(yè)務(wù)根據(jù)消息隊(duì)列中的請(qǐng)求信息芬沉,再做后續(xù)處理

2.4日志處理

日志處理是指將消息隊(duì)列用在日志處理中躺同,比如Kafka的應(yīng)用阁猜,解決大量日志傳輸?shù)膯?wèn)題。架構(gòu)簡(jiǎn)化如下

image
  • 日志采集客戶端蹋艺,負(fù)責(zé)日志數(shù)據(jù)采集剃袍,定時(shí)寫入Kafka隊(duì)列

  • Kafka消息隊(duì)列,負(fù)責(zé)日志數(shù)據(jù)的接收捎谨,存儲(chǔ)和轉(zhuǎn)發(fā)

  • 日志處理應(yīng)用:訂閱并消費(fèi)kafka隊(duì)列中的日志數(shù)據(jù)

以下是新浪kafka日志處理應(yīng)用案例:

image
  • Kafka:接收用戶日志的消息隊(duì)列

  • Logstash:做日志解析民效,統(tǒng)一成JSON輸出給Elasticsearch

  • Elasticsearch:實(shí)時(shí)日志分析服務(wù)的核心技術(shù),一個(gè)schemaless涛救,實(shí)時(shí)的數(shù)據(jù)存儲(chǔ)服務(wù)畏邢,通過(guò)index組織數(shù)據(jù),兼具強(qiáng)大的搜索和統(tǒng)計(jì)功能

  • Kibana:基于Elasticsearch的數(shù)據(jù)可視化組件州叠,超強(qiáng)的數(shù)據(jù)可視化能力是眾多公司選擇ELK stack的重要原因

2.5消息通訊

消息通訊是指棵红,消息隊(duì)列一般都內(nèi)置了高效的通信機(jī)制,因此也可以用在純的消息通訊咧栗。比如實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)消息隊(duì)列逆甜,或者聊天室等

點(diǎn)對(duì)點(diǎn)通訊:

image

客戶端A和客戶端B使用同一隊(duì)列,進(jìn)行消息通訊致板。

聊天室通訊:

image

客戶端A交煞,客戶端B,客戶端N訂閱同一主題斟或,進(jìn)行消息發(fā)布和接收素征。實(shí)現(xiàn)類似聊天室效果。

以上實(shí)際是消息隊(duì)列的兩種消息模式萝挤,點(diǎn)對(duì)點(diǎn)或發(fā)布訂閱模式御毅。模型為示意圖,供參考怜珍。

三端蛆、消息中間件示例

3.1電商系統(tǒng)

image

消息隊(duì)列采用高可用,可持久化的消息中間件酥泛。比如Active MQ今豆,Rabbit MQ,Rocket Mq柔袁。

  • 應(yīng)用將主干邏輯處理完成后呆躲,寫入消息隊(duì)列。消息發(fā)送是否成功可以開啟消息的確認(rèn)模式捶索。(消息隊(duì)列返回消息接收成功狀態(tài)后插掂,應(yīng)用再返回,這樣保障消息的完整性)

  • 擴(kuò)展流程(發(fā)短信,配送處理)訂閱隊(duì)列消息辅甥。采用推或拉的方式獲取消息并處理箩祥。

  • 消息將應(yīng)用解耦的同時(shí),帶來(lái)了數(shù)據(jù)一致性問(wèn)題肆氓,可以采用最終一致性方式解決。比如主數(shù)據(jù)寫入數(shù)據(jù)庫(kù)底瓣,擴(kuò)展應(yīng)用根據(jù)消息隊(duì)列谢揪,并結(jié)合數(shù)據(jù)庫(kù)方式實(shí)現(xiàn)基于消息隊(duì)列的后續(xù)處理。

3.2日志收集系統(tǒng)

image

分為Zookeeper注冊(cè)中心捐凭,日志收集客戶端拨扶,Kafka集群和Storm集群(OtherApp)四部分組成。

  • Zookeeper注冊(cè)中心茁肠,提出負(fù)載均衡和地址查找服務(wù)

  • 日志收集客戶端患民,用于采集應(yīng)用系統(tǒng)的日志,并將數(shù)據(jù)推送到kafka隊(duì)列

  • Kafka集群:接收垦梆,路由匹颤,存儲(chǔ),轉(zhuǎn)發(fā)等消息處理

  • Storm集群:與OtherApp處于同一級(jí)別托猩,采用拉的方式消費(fèi)隊(duì)列中的數(shù)據(jù)

四印蓖、JMS消息服務(wù)

講消息隊(duì)列就不得不提JMS 。JMS(JAVA Message Service,java消息服務(wù))API是一個(gè)消息服務(wù)的標(biāo)準(zhǔn)/規(guī)范京腥,允許應(yīng)用程序組件基于JavaEE平臺(tái)創(chuàng)建赦肃、發(fā)送、接收和讀取消息公浪。它使分布式通信耦合度更低他宛,消息服務(wù)更加可靠以及異步性。

在EJB架構(gòu)中欠气,有消息bean可以無(wú)縫的與JM消息服務(wù)集成厅各。在J2EE架構(gòu)模式中,有消息服務(wù)者模式晃琳,用于實(shí)現(xiàn)消息與應(yīng)用直接的解耦讯检。

4.1消息模型

在JMS標(biāo)準(zhǔn)中,有兩種消息模型P2P(Point to Point),Publish/Subscribe(Pub/Sub)卫旱。

4.1.1 P2P模式

image

P2P模式包含三個(gè)角色:消息隊(duì)列(Queue)人灼,發(fā)送者(Sender),接收者(Receiver)顾翼。每個(gè)消息都被發(fā)送到一個(gè)特定的隊(duì)列投放,接收者從隊(duì)列中獲取消息。隊(duì)列保留著消息适贸,直到他們被消費(fèi)或超時(shí)灸芳。

P2P的特點(diǎn)

  • 每個(gè)消息只有一個(gè)消費(fèi)者(Consumer)(即一旦被消費(fèi)涝桅,消息就不再在消息隊(duì)列中)

  • 發(fā)送者和接收者之間在時(shí)間上沒(méi)有依賴性,也就是說(shuō)當(dāng)發(fā)送者發(fā)送了消息之后烙样,不管接收者有沒(méi)有正在運(yùn)行冯遂,它不會(huì)影響到消息被發(fā)送到隊(duì)列

  • 接收者在成功接收消息之后需向隊(duì)列應(yīng)答成功

如果希望發(fā)送的每個(gè)消息都會(huì)被成功處理的話,那么需要P2P模式谒获。(架構(gòu)KKQ:466097527蛤肌,歡迎加入)

4.1.2 Pub/sub模式

image

包含三個(gè)角色主題(Topic),發(fā)布者(Publisher)批狱,訂閱者(Subscriber) 多個(gè)發(fā)布者將消息發(fā)送到Topic,系統(tǒng)將這些消息傳遞給多個(gè)訂閱者裸准。

Pub/Sub的特點(diǎn)

  • 每個(gè)消息可以有多個(gè)消費(fèi)者

  • 發(fā)布者和訂閱者之間有時(shí)間上的依賴性。針對(duì)某個(gè)主題(Topic)的訂閱者赔硫,它必須創(chuàng)建一個(gè)訂閱者之后炒俱,才能消費(fèi)發(fā)布者的消息

  • 為了消費(fèi)消息,訂閱者必須保持運(yùn)行的狀態(tài)

為了緩和這樣嚴(yán)格的時(shí)間相關(guān)性爪膊,JMS允許訂閱者創(chuàng)建一個(gè)可持久化的訂閱权悟。這樣,即使訂閱者沒(méi)有被激活(運(yùn)行)推盛,它也能接收到發(fā)布者的消息羊壹。

如果希望發(fā)送的消息可以不被做任何處理棺弊、或者只被一個(gè)消息者處理、或者可以被多個(gè)消費(fèi)者處理的話,那么可以采用Pub/Sub模型分衫。

4.2消息消費(fèi)

在JMS中伟阔,消息的產(chǎn)生和消費(fèi)都是異步的良拼。對(duì)于消費(fèi)來(lái)說(shuō)僵驰,JMS的消息者可以通過(guò)兩種方式來(lái)消費(fèi)消息。

(1)同步

訂閱者或接收者通過(guò)receive方法來(lái)接收消息控嗜,receive方法在接收到消息之前(或超時(shí)之前)將一直阻塞茧彤;

(2)異步

訂閱者或接收者可以注冊(cè)為一個(gè)消息監(jiān)聽器。當(dāng)消息到達(dá)之后疆栏,系統(tǒng)自動(dòng)調(diào)用監(jiān)聽器的onMessage方法曾掂。

JNDI:Java命名和目錄接口,是一種標(biāo)準(zhǔn)的Java命名系統(tǒng)接口”诙ィ可以在網(wǎng)絡(luò)上查找和訪問(wèn)服務(wù)珠洗。通過(guò)指定一個(gè)資源名稱,該名稱對(duì)應(yīng)于數(shù)據(jù)庫(kù)或命名服務(wù)中的一個(gè)記錄若专,同時(shí)返回資源連接建立所必須的信息许蓖。

JNDI在JMS中起到查找和訪問(wèn)發(fā)送目標(biāo)或消息來(lái)源的作用。

4.3JMS編程模型

(1) ConnectionFactory

創(chuàng)建Connection對(duì)象的工廠,針對(duì)兩種不同的jms消息模型膊爪,分別有QueueConnectionFactory和TopicConnectionFactory兩種自阱。可以通過(guò)JNDI來(lái)查找ConnectionFactory對(duì)象米酬。

(2) Destination

Destination的意思是消息生產(chǎn)者的消息發(fā)送目標(biāo)或者說(shuō)消息消費(fèi)者的消息來(lái)源沛豌。對(duì)于消息生產(chǎn)者來(lái)說(shuō),它的Destination是某個(gè)隊(duì)列(Queue)或某個(gè)主題(Topic);對(duì)于消息消費(fèi)者來(lái)說(shuō)赃额,它的Destination也是某個(gè)隊(duì)列或主題(即消息來(lái)源)琼懊。

所以,Destination實(shí)際上就是兩種類型的對(duì)象:Queue爬早、Topic可以通過(guò)JNDI來(lái)查找Destination。

(3) Connection

Connection表示在客戶端和JMS系統(tǒng)之間建立的鏈接(對(duì)TCP/IP socket的包裝)启妹。Connection可以產(chǎn)生一個(gè)或多個(gè)Session筛严。跟ConnectionFactory一樣,Connection也有兩種類型:QueueConnection和TopicConnection饶米。

(4) Session

Session是操作消息的接口桨啃。可以通過(guò)session創(chuàng)建生產(chǎn)者檬输、消費(fèi)者照瘾、消息等。Session提供了事務(wù)的功能丧慈。當(dāng)需要使用session發(fā)送/接收多個(gè)消息時(shí)析命,可以將這些發(fā)送/接收動(dòng)作放到一個(gè)事務(wù)中。同樣逃默,也分QueueSession和TopicSession鹃愤。

(5) 消息的生產(chǎn)者

消息生產(chǎn)者由Session創(chuàng)建,并用于將消息發(fā)送到Destination完域。同樣软吐,消息生產(chǎn)者分兩種類型:QueueSender和TopicPublisher∫魉埃可以調(diào)用消息生產(chǎn)者的方法(send或publish方法)發(fā)送消息凹耙。

(6) 消息消費(fèi)者

消息消費(fèi)者由Session創(chuàng)建,用于接收被發(fā)送到Destination的消息肠仪。兩種類型:QueueReceiver和TopicSubscriber肖抱。可分別通過(guò)session的createReceiver(Queue)或createSubscriber(Topic)來(lái)創(chuàng)建异旧。當(dāng)然虐沥,也可以session的creatDurableSubscriber方法來(lái)創(chuàng)建持久化的訂閱者。

(7) MessageListener

消息監(jiān)聽器。如果注冊(cè)了消息監(jiān)聽器欲险,一旦消息到達(dá)镐依,將自動(dòng)調(diào)用監(jiān)聽器的onMessage方法。EJB中的MDB(Message-Driven Bean)就是一種MessageListener天试。

深入學(xué)習(xí)JMS對(duì)掌握J(rèn)AVA架構(gòu)槐壳,EJB架構(gòu)有很好的幫助,消息中間件也是大型分布式系統(tǒng)必須的組件喜每。本次分享主要做全局性介紹务唐,具體的深入需要大家學(xué)習(xí),實(shí)踐带兜,總結(jié)枫笛,領(lǐng)會(huì)。

五刚照、常用消息隊(duì)列

一般商用的容器刑巧,比如WebLogic,JBoss无畔,都支持JMS標(biāo)準(zhǔn)啊楚,開發(fā)上很方便。但免費(fèi)的比如Tomcat浑彰,Jetty等則需要使用第三方的消息中間件恭理。本部分內(nèi)容介紹常用的消息中間件(Active MQ,Rabbit MQ,Zero MQ,Kafka)以及他們的特點(diǎn)郭变。

5.1 ActiveMQ

ActiveMQ 是Apache出品颜价,最流行的,能力強(qiáng)勁的開源消息總線诉濒。ActiveMQ 是一個(gè)完全支持JMS1.1和J2EE 1.4規(guī)范的 JMS Provider實(shí)現(xiàn)拍嵌,盡管JMS規(guī)范出臺(tái)已經(jīng)是很久的事情了,但是JMS在當(dāng)今的J2EE應(yīng)用中間仍然扮演著特殊的地位循诉。

ActiveMQ特性如下:

  1. 多種語(yǔ)言和協(xié)議編寫客戶端横辆。語(yǔ)言: Java,C,C++,C#,Ruby,Perl,Python,PHP。應(yīng)用協(xié)議:OpenWire,Stomp REST,WS Notification,XMPP,AMQP

  2. 完全支持JMS1.1和J2EE 1.4規(guī)范 (持久化茄猫,XA消息狈蚤,事務(wù))

  3. 對(duì)Spring的支持,ActiveMQ可以很容易內(nèi)嵌到使用Spring的系統(tǒng)里面去划纽,而且也支持Spring2.0的特性

  4. 通過(guò)了常見J2EE服務(wù)器(如 Geronimo,JBoss 4,GlassFish,WebLogic)的測(cè)試脆侮,其中通過(guò)JCA 1.5 resource adaptors的配置,可以讓ActiveMQ可以自動(dòng)的部署到任何兼容J2EE 1.4 商業(yè)服務(wù)器上

  5. 支持多種傳送協(xié)議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA

  6. 支持通過(guò)JDBC和journal提供高速的消息持久化

  7. 從設(shè)計(jì)上保證了高性能的集群勇劣,客戶端-服務(wù)器幻捏,點(diǎn)對(duì)點(diǎn)

  8. 支持Ajax

  9. 支持與Axis的整合

  10. 可以很容易得調(diào)用內(nèi)嵌JMS provider,進(jìn)行測(cè)試

5.2 RabbitMQ

RabbitMQ是流行的開源消息隊(duì)列系統(tǒng)篡九,用erlang語(yǔ)言開發(fā)谐岁。RabbitMQ是AMQP(高級(jí)消息隊(duì)列協(xié)議)的標(biāo)準(zhǔn)實(shí)現(xiàn)。支持多種客戶端榛臼,如:Python伊佃、Ruby、.NET沛善、Java航揉、JMS、C、PHP胀葱、ActionScript、XMPP笙蒙、STOMP等抵屿,支持AJAX,持久化艇搀。用于在分布式系統(tǒng)中存儲(chǔ)轉(zhuǎn)發(fā)消息尿扯,在易用性、擴(kuò)展性焰雕、高可用性等方面表現(xiàn)不俗衷笋。

結(jié)構(gòu)圖如下:

image

幾個(gè)重要概念:

  • Broker:簡(jiǎn)單來(lái)說(shuō)就是消息隊(duì)列服務(wù)器實(shí)體。

  • Exchange:消息交換機(jī)矩屁,它指定消息按什么規(guī)則辟宗,路由到哪個(gè)隊(duì)列。

  • Queue:消息隊(duì)列載體吝秕,每個(gè)消息都會(huì)被投入到一個(gè)或多個(gè)隊(duì)列泊脐。

  • Binding:綁定,它的作用就是把exchange和queue按照路由規(guī)則綁定起來(lái)烁峭。

  • Routing Key:路由關(guān)鍵字容客,exchange根據(jù)這個(gè)關(guān)鍵字進(jìn)行消息投遞秕铛。

  • vhost:虛擬主機(jī),一個(gè)broker里可以開設(shè)多個(gè)vhost缩挑,用作不同用戶的權(quán)限分離但两。

  • producer:消息生產(chǎn)者,就是投遞消息的程序调煎。

  • consumer:消息消費(fèi)者镜遣,就是接受消息的程序。

  • channel:消息通道士袄,在客戶端的每個(gè)連接里悲关,可建立多個(gè)channel,每個(gè)channel代表一個(gè)會(huì)話任務(wù)娄柳。

消息隊(duì)列的使用過(guò)程寓辱,如下:

  • 客戶端連接到消息隊(duì)列服務(wù)器,打開一個(gè)channel赤拒。

  • 客戶端聲明一個(gè)exchange秫筏,并設(shè)置相關(guān)屬性。

  • 客戶端聲明一個(gè)queue挎挖,并設(shè)置相關(guān)屬性这敬。

  • 客戶端使用routing key,在exchange和queue之間建立好綁定關(guān)系蕉朵。

  • 客戶端投遞消息到exchange崔涂。

exchange接收到消息后,就根據(jù)消息的key和已經(jīng)設(shè)置的binding始衅,進(jìn)行消息路由冷蚂,將消息投遞到一個(gè)或多個(gè)隊(duì)列里。

5.3 ZeroMQ

號(hào)稱史上最快的消息隊(duì)列汛闸,它實(shí)際類似于Socket的一系列接口蝙茶,他跟Socket的區(qū)別是:普通的socket是端到端的(1:1的關(guān)系),而ZMQ卻是可以N:M 的關(guān)系诸老,人們對(duì)BSD套接字的了解較多的是點(diǎn)對(duì)點(diǎn)的連接隆夯,點(diǎn)對(duì)點(diǎn)連接需要顯式地建立連接、銷毀連接别伏、選擇協(xié)議(TCP/UDP)和處理錯(cuò)誤等吮廉,而ZMQ屏蔽了這些細(xì)節(jié),讓你的網(wǎng)絡(luò)編程更為簡(jiǎn)單畸肆。ZMQ用于node與node間的通信宦芦,node可以是主機(jī)或者是進(jìn)程。

引用官方的說(shuō)法:“ZMQ(以下ZeroMQ簡(jiǎn)稱ZMQ)是一個(gè)簡(jiǎn)單好用的傳輸層轴脐,像框架一樣的一個(gè)socket library调卑,他使得Socket編程更加簡(jiǎn)單抡砂、簡(jiǎn)潔和性能更高。是一個(gè)消息處理隊(duì)列庫(kù)恬涧,可在多個(gè)線程注益、內(nèi)核和主機(jī)盒之間彈性伸縮。ZMQ的明確目標(biāo)是“成為標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議棧的一部分溯捆,之后進(jìn)入Linux內(nèi)核”〕笊Γ現(xiàn)在還未看到它們的成功。但是提揍,它無(wú)疑是極具前景的啤月、并且是人們更加需要的“傳統(tǒng)”BSD套接字之上的一 層封裝。ZMQ讓編寫高性能網(wǎng)絡(luò)應(yīng)用程序極為簡(jiǎn)單和有趣劳跃』阎伲”

特點(diǎn)是:

  • 高性能,非持久化

  • 跨平臺(tái):支持Linux刨仑、Windows郑诺、OS X等

  • 多語(yǔ)言支持;C杉武、C++辙诞、Java、.NET轻抱、Python等30多種開發(fā)語(yǔ)言

  • 可單獨(dú)部署或集成到應(yīng)用中使用

  • 可作為Socket通信庫(kù)使用

與RabbitMQ相比飞涂,ZMQ并不像是一個(gè)傳統(tǒng)意義上的消息隊(duì)列服務(wù)器,事實(shí)上十拣,它也根本不是一個(gè)服務(wù)器封拧,更像一個(gè)底層的網(wǎng)絡(luò)通訊庫(kù)志鹃,在Socket API之上做了一層封裝夭问,將網(wǎng)絡(luò)通訊、進(jìn)程通訊和線程通訊抽象為統(tǒng)一的API接口曹铃。支持“Request-Reply “缰趋,”Publisher-Subscriber“,”Parallel Pipeline”三種基本模型和擴(kuò)展模型陕见。

ZeroMQ高性能設(shè)計(jì)要點(diǎn):

1秘血、無(wú)鎖的隊(duì)列模型

對(duì)于跨線程間的交互(用戶端和session)之間的數(shù)據(jù)交換通道pipe,采用無(wú)鎖的隊(duì)列算法CAS评甜;在pipe兩端注冊(cè)有異步事件灰粮,在讀或者寫消息到pipe的時(shí),會(huì)自動(dòng)觸發(fā)讀寫事件忍坷。

2粘舟、批量處理的算法

對(duì)于傳統(tǒng)的消息處理熔脂,每個(gè)消息在發(fā)送和接收的時(shí)候,都需要系統(tǒng)的調(diào)用柑肴,這樣對(duì)于大量的消息霞揉,系統(tǒng)的開銷比較大,zeroMQ對(duì)于批量的消息晰骑,進(jìn)行了適應(yīng)性的優(yōu)化适秩,可以批量的接收和發(fā)送消息。

3硕舆、多核下的線程綁定秽荞,無(wú)須CPU切換

區(qū)別于傳統(tǒng)的多線程并發(fā)模式,信號(hào)量或者臨界區(qū)岗宣, zeroMQ充分利用多核的優(yōu)勢(shì)蚂会,每個(gè)核綁定運(yùn)行一個(gè)工作者線程,避免多線程之間的CPU切換開銷耗式。

5.4 Kafka

Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng)胁住,它可以處理消費(fèi)者規(guī)模的網(wǎng)站中的所有動(dòng)作流數(shù)據(jù)。這種動(dòng)作(網(wǎng)頁(yè)瀏覽刊咳,搜索和其他用戶的行動(dòng))是在現(xiàn)代網(wǎng)絡(luò)上的許多社會(huì)功能的一個(gè)關(guān)鍵因素彪见。

這些數(shù)據(jù)通常是由于吞吐量的要求而通過(guò)處理日志和日志聚合來(lái)解決。對(duì)于像Hadoop的一樣的日志數(shù)據(jù)和離線分析系統(tǒng)娱挨,但又要求實(shí)時(shí)處理的限制余指,這是一個(gè)可行的解決方案。Kafka的目的是通過(guò)Hadoop的并行加載機(jī)制來(lái)統(tǒng)一線上和離線的消息處理跷坝,也是為了通過(guò)集群機(jī)來(lái)提供實(shí)時(shí)的消費(fèi)酵镜。

Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),有如下特性:

  • 通過(guò)O(1)的磁盤數(shù)據(jù)結(jié)構(gòu)提供消息的持久化柴钻,這種結(jié)構(gòu)對(duì)于即使數(shù)以TB的消息存儲(chǔ)也能夠保持長(zhǎng)時(shí)間的穩(wěn)定性能淮韭。(文件追加的方式寫入數(shù)據(jù),過(guò)期的數(shù)據(jù)定期刪除)

  • 高吞吐量:即使是非常普通的硬件Kafka也可以支持每秒數(shù)百萬(wàn)的消息

  • 支持通過(guò)Kafka服務(wù)器和消費(fèi)機(jī)集群來(lái)分區(qū)消息

  • 支持Hadoop并行數(shù)據(jù)加載

Kafka相關(guān)概念

Broker

Kafka集群包含一個(gè)或多個(gè)服務(wù)器贴届,這種服務(wù)器被稱為broker[5]

Topic

每條發(fā)布到Kafka集群的消息都有一個(gè)類別靠粪,這個(gè)類別被稱為Topic。(物理上不同Topic的消息分開存儲(chǔ)毫蚓,邏輯上一個(gè)Topic的消息雖然保存于一個(gè)或多個(gè)broker上但用戶只需指定消息的Topic即可生產(chǎn)或消費(fèi)數(shù)據(jù)而不必關(guān)心數(shù)據(jù)存于何處)

Partition

Parition是物理上的概念占键,每個(gè)Topic包含一個(gè)或多個(gè)Partition.

Producer

負(fù)責(zé)發(fā)布消息到Kafka broker

Consumer

消息消費(fèi)者,向Kafka broker讀取消息的客戶端元潘。

Consumer Group

每個(gè)Consumer屬于一個(gè)特定的Consumer Group(可為每個(gè)Consumer指定group name畔乙,若不指定group name則屬于默認(rèn)的group)。

一般應(yīng)用在大數(shù)據(jù)日志處理或?qū)?shí)時(shí)性(少量延遲)翩概,可靠性(少量丟數(shù)據(jù))要求稍低的場(chǎng)景使用牲距。

六袖订、參考資料

http://blog.sina.com.cn/s/blog_3fba24680100r777.html
http://blog.csdn.net/jiuqiyuliang/article/details/46701559
https://baike.baidu.com/item/rabbitmq?fr=aladdin
http://blog.csdn.net/sun305355024sun/article/details/41913105
http://www.searchtb.com/2012/08/zeromq-primer.html
http://blog.csdn.net/yangbutao/article/details/8498790
https://wenku.baidu.com/view/44d69a624431b90d6d85c745.html
https://baike.baidu.com/item/Kafka/17930165?fr=aladdin
http://www.infoq.com/cn/articles/apache-kafka/
http://www.mincoder.com/article/3942.shtml

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嗅虏,隨后出現(xiàn)的幾起案子洛姑,更是在濱河造成了極大的恐慌,老刑警劉巖皮服,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件楞艾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡龄广,警方通過(guò)查閱死者的電腦和手機(jī)硫眯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)择同,“玉大人两入,你說(shuō)我怎么就攤上這事∏貌牛” “怎么了裹纳?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)紧武。 經(jīng)常有香客問(wèn)我剃氧,道長(zhǎng),這世上最難降的妖魔是什么阻星? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任朋鞍,我火速辦了婚禮,結(jié)果婚禮上妥箕,老公的妹妹穿的比我還像新娘滥酥。我一直安慰自己,他們只是感情好畦幢,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布坎吻。 她就那樣靜靜地躺著,像睡著了一般呛讲。 火紅的嫁衣襯著肌膚如雪禾怠。 梳的紋絲不亂的頭發(fā)上返奉,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天贝搁,我揣著相機(jī)與錄音,去河邊找鬼芽偏。 笑死雷逆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的污尉。 我是一名探鬼主播膀哲,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼往产,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了某宪?” 一聲冷哼從身側(cè)響起仿村,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎兴喂,沒(méi)想到半個(gè)月后蔼囊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衣迷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年畏鼓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壶谒。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡云矫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出汗菜,到底是詐尸還是另有隱情让禀,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布陨界,位于F島的核電站堆缘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏普碎。R本人自食惡果不足惜吼肥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望麻车。 院中可真熱鬧缀皱,春花似錦、人聲如沸动猬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赁咙。三九已至钮莲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間彼水,已是汗流浹背崔拥。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凤覆,地道東北人链瓦。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親慈俯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渤刃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容