Kafka精講及常用開發代碼,手動提交offset值

在公司的技術分享,

JMS

JMS 是什麼:JMS Java 提供的一套技術規範

JMS 幹什麼用:用來異構系統 集成通信,緩解系統瓶頸,提高系統的伸縮性增強系統用戶體驗, 使得系統模塊化和組件化變得可行並更加靈活

通過什麼方式:生產消費者模式(生產者、服務器、消費者)

JMS 核心組
l Destination:消息發送的目的地,也就是前面說的QueueTopic

l Message :從字面上就可以看出是被髮送的消息。

l Producer: 消息的生產者,要發送一個消息,必須通過這個生產者來發送。

l MessageConsumer: 與生產者相對應,這是消息的消費者或接收者,通過它來接收一個消

JMS 消息服務器 ActiveMQ

ActiveMQ Apache 出品,最流行的,能力強勁的開源消息總線。ActiveMQ 是一個完全支持 JMS1.1 J2EE 1.4 規範的。

主要特點:

l  多種語言和協議編寫客戶端。語言: Java, C, C++, C#, Ruby, Perl, Python, PHP。應用協議: OpenWire,Stomp REST,WS Notification,XMPP,AMQP

l  完全支持 JMS1.1 J2EE 1.4 規範 (持久化,XA 消息,事務)

l  Spring 的支持,ActiveMQ 可以很容易內嵌到使用 Spring 的系統裏面去,而且也支持

Spring2.0 的特性

l  通過了常見 J2EE 服務器(Geronimo,JBoss 4, GlassFish,WebLogic)的測試,其中通過 JCA

1.5 resource adaptors 的配置,可以讓 ActiveMQ 可以自動的部署到任何兼容 J2EE 1.4 商業服

務器上

l  支持多種傳送協議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA

l  支持通過JDBCjournal提供高速的消息持久化

l  從設計上保證了高性能的集羣,客戶端-服務器,點對點

l  支持Ajax

l  支持與Axis的整合

分佈式消息中間件 Metamorphosis

Metamorphosis (MetaQ) 是一個高性能、高可用、可擴展的分佈式消息中間件,類似於 LinkedIn Kafka,具有消息存儲順序寫、吞吐量大和支持本地和 XA 事務等特性,適用於大吞吐量、順序消 息、廣播和日誌數據傳輸等場景,在淘寶和支付寶有着廣泛的應用,現已開源。

主要特點:

l 生產者、服務器和消費者都可分佈 l 消息存儲順序寫
l 性能極高,吞吐量大
l 支持消息順序

l 支持本地和XA事務
l 客戶端 pull,隨機讀,利用 sendfile 系統調用,zero-copy ,批量拉數據 l 支持消費端事務
l 支持消息廣播模式
l 支持異步發送消息
l 支持http協議
l 支持消息重試和recover
l 數據遷移、擴容對用戶透明
l 消費狀態保存在客戶端
l 支持同步和異步複製兩種HA
l 支持 group commit

分佈式消息中間件 RocketMQ

RocketMQ 是一款分佈式、隊列模型的消息中間件,具有以下特點: l 能夠保證嚴格的消息順序
l 提供豐富的消息拉取模式
l 高效的訂閱者水平擴展能力

l 實時的消息訂閱機制
l 億級消息堆積能力
l Metaq3.0 版本改名,產品名稱改爲 RocketMQ

  Kafka核心組件

Producer :消息生產者,就是向 kafka broker 發消息的客戶端

Consumer :

消息消費者,向 kafka broker 取消息的客戶端

Topic :名稱。

Consumer Group (CG):

kafka 用來實現一個 topic 消息的廣播(發給所有的 consumer) 單播(發給任意一個 consumer)的手段

topic 可以有多個 CGtopic 的消息會複製(不 是真的複製,是概念上的)到所有的 CG

每個 partion 只會把消息發給該 CG 中的一個 consumer

如果需要實現廣播,只要每個 consumer 有一個獨立的 CG 就可以了。要實現單播只 要所有的 consumer 在同一個 CG。用 CG 還可以將 consumer 進行自由的分組而不需要多次發送 消息到不同的 topic

Partition:

爲了實現擴展性,一個非常大的topic可以分佈到多個broker(即服務器)上,一個 topic 可以分爲多個 partition,每個 partition 是一個有序的隊列

partition 中的每條消息都會被分 配一個有序的 id(offset)kafka 只保證按一個 partition 中的順序將消息發給 consumer,不保 證一個 topic 的整體(多個 partition )的順序。

Offset:

kafka的存儲文件都是按照offset.kafka來命名,用offset做名字的好處是方便查找。例 如你想找位於 2049 的位置,只要找到 2048.kafka 的文件即可。當然 the first offset 就是 00000000000.kafka

Replication:

Kafka 支持以 Partition 爲單位對 Message 進行冗餘備份,每個 Partition 都可以配 置至少 1 Replication(當僅 1 Replication 時即僅該 Partition 本身)

Leader:

Replication集合中的Partition都會選出一個唯一的Leader,所有的讀寫請求都由 Leader 處理

其他 Replicas Leader 處把數據更新同步到本地,過程類似大家熟悉的 MySQL 中的 Binlog 同步

每個 Cluster 當中會選舉出一個 Broker 來擔任 Controller,負責處理 Partition Leader 選舉,協調 Partition 遷移等工作

SR(In-SyncReplica):

Replicas的一個子集,表示目前Alive且與Leader能夠“Catch-up”的 Replicas 集合。由於讀寫都是首先落到 Leader 上,所以一般來說通過同步機制從 Leader 上拉取 數據的Replica都會和Leader有一些延遲(包括了延遲時間和延遲條數兩個維度),任意一個超過閾值都會把該 Replica 踢出 ISR。每個 Partition 都有它自己獨立的 ISR

Consumer topic 關係

本質上 kafka 只支持 Topic;


l 每個 group 中可以有多個 consumer,每個 consumer 屬於一個 consumer group; 通常情況下,一個 group 中會包含多個 consumer,這樣不僅可以提高 topic 中消息的併發消費能 力,而且還能提高"故障容錯"性,如果 group 中的某個 consumer 失效那麼其消費的 partitions 將會有 其他 consumer 自動接管


l 對於Topic中的一條特定的消息,只會被訂閱此Topic的每個group中的其中一個consumer,此消息不會發送給一個 group 的多個 consumer; 那麼一個 group 中所有的 consumer 將會交錯的消費整個 Topic,每個 group consumer 消息消 費互相獨立,我們可以認爲一個 group 是一個"訂閱"


lkafka,一個partition中的消息只會被group中的一個consumer消費(同一時刻);Topic 中的每個 partions,只會被一個"訂閱者"中的一個 consumer 消費,不過一個 consumer 可 以同時消費多個 partitions 中的消息


l kafka的設計原理決定,對於一個topic,同一個group中不能有多於partitions個數的consumer

時消費,否則將意味着某些 consumer 將無法得到消息。

kafka 只能保證一個 partition 中的消息被某個 consumer 消費時是順序的;事實上,從 Topic 角度來說,當有多個 partitions ,消息仍不是全局有序的。

Producer 客戶端負責消息的分發

l  kafka集羣中的任何一個broker都可以向producer提供metadata信息,這些metadata中包含"

集羣中存活的 servers 列表"/"partitions leader 列表"等信息;

l  當 producer 獲取到 metadata 信息之後, producer 將會和 Topic 下所有 partition leader 保持 socket 連接;

l  消息由producer直接通過socket發送到broker,中間不會經過任何"路由層",事實上,消

息被路由到哪個 partition 上由 producer 客戶端決定;

比如可以採用"random""key-hash""詢等,如果一個 topic 中有多個 partitions,那麼在 producer 端實現"消息均衡分發"是必要的。
lproducer端的配置文件中,開發者可以指定partition路由的方式。

Producer 消息發送的應答機制 設置發送數據是否需要服務端的反饋,有三個值 0,1,-1

0: producer 不會等待 broker 發送 ack
1: leader 接收到消息之後發送 ack
-1: 當所有的 follower 都同步消息成功後發送 ack

request.required.acks=0

           Kafka體驗

kafka-Stream

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章