一、發(fā)布與訂閱系統(tǒng)
在講Kafka之前,我們先來聊聊發(fā)布與訂閱模式。
在維基百科里面彤守,發(fā)布訂閱模式是這么定義的:
In?software architecture,?publish–subscribe?is a?messaging pattern?where senders of?messages, called publishers, do not program the messages to be sent directly to specific receivers, called subscribers, but instead categorize published messages into classes without knowledge of which subscribers, if any, there may be. Similarly, subscribers express interest in one or more classes and only receive messages that are of interest, without knowledge of which publishers, if any, there are.
Publish–subscribe is a sibling of the?message queue?paradigm, and is typically one part of a larger?message-oriented middleware?system. Most messaging systems support both the pub/sub and message queue models in their?API, e.g.?Java Message Service?(JMS).
從上面的介紹可以歸納三點(diǎn):
1.它是軟件工程里的一種設(shè)計(jì)模式。
2.主要存在發(fā)布者和訂閱者兩大角色哭靖,發(fā)布者不需要關(guān)心發(fā)的消息都有誰訂閱具垫,訂閱者只關(guān)心pick哪些消息,而不需要關(guān)心消息是誰發(fā)布试幽。
3.它是消息隊(duì)列范式的姊妹筝蚕,圍繞這個模式產(chǎn)生了許多消息中間件模型。
這里我們舉《Kafka權(quán)威指南》里服務(wù)質(zhì)量指標(biāo)這個例子,來看看常見的發(fā)布訂閱系統(tǒng)長什么樣饰及。首先蔗坯,假設(shè)現(xiàn)在業(yè)務(wù)方需要對幾個前端服務(wù)器的服務(wù)質(zhì)量進(jìn)行檢測康震,這里新增一個可查看度量指標(biāo)的服務(wù)燎含,分別讓幾個前端服務(wù)和這個度量指標(biāo)服務(wù)做直連,我們就可以通過這個新建的“儀表盤”觀察服務(wù)質(zhì)量腿短。
隨著業(yè)務(wù)發(fā)展屏箍,我們對業(yè)務(wù)的度量標(biāo)準(zhǔn)不斷擴(kuò)大,我們可能不止要一個儀表盤橘忱,還需要對收集到的數(shù)據(jù)進(jìn)行分析赴魁,對活動進(jìn)行監(jiān)控,如果按照上面的思想去對服務(wù)進(jìn)行擴(kuò)展钝诚,那么整個架構(gòu)看起來就很是雜亂無章颖御。
為了方便管理,降低架構(gòu)的耦合程度凝颇,我們可以增設(shè)一個管理各種指標(biāo)的中間服務(wù)潘拱,負(fù)責(zé)接收來自不同程序的度量指標(biāo)數(shù)據(jù),然后讓各個度量服務(wù)自己來這個中間服務(wù)篩選自己想要的數(shù)據(jù)去進(jìn)行分析拧略。
二芦岂、常用消息隊(duì)列比較
下面列舉了幾個常用的消息隊(duì)列之間的對比。
三垫蛆、Kafka架構(gòu)簡介圖
這里涉及到的組件和概念有Producer,Consumer,ConsumerGroup,topic,broker,partition等等禽最。相關(guān)概念可以查閱Kafka官方文檔,這里主要是列幾個要關(guān)注的點(diǎn):
1.每個topic可以有多個partition袱饭,一個topic只能保證同一個partition里面的消息有序川无,不能保證不同partition的消息有序
2.同一個topic可以分布在不同的broker,其中一定要有一個broker是屬于leader虑乖,其他broker的topic作為備份
3.消費(fèi)者消費(fèi)消息以group為單位懦趋,同一個group內(nèi)的消息只能被消費(fèi)一次,所以對于上圖决左,如果topicA來了一條數(shù)據(jù)a愕够,consumer1和consumer2兩者只有其中一個可以消費(fèi)這條數(shù)據(jù)a,而如果Consumer3也訂閱topicA佛猛,則不受影響惑芭,可以消費(fèi)a。這里可以看作Consumer3自己也是一個Consumer Group继找。
4.每一個broker和Consumer遂跟,都交由zookeeper去做服務(wù)注冊與發(fā)現(xiàn),同時(shí)zk還有選舉功能,當(dāng)其中一個topic的leader所在的broker下線時(shí)幻锁,zk可以選舉其他備份的broker作為新的leader凯亮,producer生產(chǎn)的所有數(shù)據(jù)都會重新指向這個新leader。