先看下kafka的整體
黑色箭頭的通信采用的是TCP
協(xié)議.
kafka
Topic
kafka允許我們把一類(lèi)消息歸類(lèi)在一起, 這就是Topic, kafka還對(duì)每個(gè)Topic進(jìn)行了分區(qū). 如下就是三個(gè)分區(qū). 012345678這些叫做offset
, 是partition(分區(qū))用來(lái)記錄每個(gè)offset所對(duì)應(yīng)的消息的. 如圖, 在分區(qū)中, 消息是有序的.
topic剖析
生產(chǎn)者
生產(chǎn)者發(fā)布消息
- 發(fā)給Topic, 在Topic內(nèi)部采用復(fù)雜均衡的模式將消息分發(fā)給各個(gè)分區(qū).
- 發(fā)給Topic, 并且指定發(fā)送給哪個(gè)分區(qū).
消費(fèi)者
消費(fèi)者所需要維護(hù)的數(shù)據(jù), 只有其所消費(fèi)的那個(gè)分區(qū)的offset. 按offset讀取數(shù)據(jù)的時(shí)候, 一般來(lái)說(shuō)都是按照順序讀取的, 但是消費(fèi)者也可以指定offset的值, 即使這個(gè)數(shù)據(jù)已經(jīng)被讀取過(guò)了, 只要這個(gè)分區(qū)消息還在有效期中, 都可以被讀到.
隊(duì)列模式和發(fā)布/訂閱模式
- 隊(duì)列模式: 一組消費(fèi)者消費(fèi)一個(gè)Topic的消息, 每個(gè)消息只會(huì)被一個(gè)消費(fèi)者給消費(fèi)掉.
- 發(fā)布/訂閱模式: 同一條消息會(huì)同時(shí)被多組消費(fèi)者消費(fèi). 每組內(nèi)可能會(huì)有一個(gè)或多個(gè)消費(fèi)者, 在組內(nèi)其實(shí)可以看做"隊(duì)列模式", 進(jìn)入組內(nèi)的一條只會(huì)被一個(gè)消費(fèi)者消費(fèi). 這里需要注意的是, 訂閱的是組而不是個(gè)體消費(fèi)者.
集群和消費(fèi)者
有序性
- 以分區(qū)順序: 上面有說(shuō)道, 每個(gè)分區(qū)內(nèi)部的消息是有順序的. 如果只有一個(gè)/組消費(fèi)這個(gè)分區(qū), 那么這個(gè)/組的消費(fèi)者消費(fèi)的消息就是順序的. 這種相對(duì)下面的方式提高了并發(fā)量的上限, 但是不能保證Topic是順序的.
- 以Topic順序: 那么就讓這個(gè)Topic只有一個(gè)分區(qū), 并且只有一個(gè)(組)消費(fèi)者去消費(fèi)他. 但是隨之而來(lái)的問(wèn)題就是并發(fā)性能上限不高的問(wèn)題.