日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
kafka學習筆記:知識點整理(一)-創(chuàng)新互聯(lián)

一、kafka 架構

專業(yè)成都網站建設公司,做排名好的好網站,排在同行前面,為您帶來客戶和效益!成都創(chuàng)新互聯(lián)為您提供成都網站建設,五站合一網站設計制作,服務好的網站設計公司,網站制作、成都做網站負責任的成都網站制作公司!

1.1 拓撲結構

如下圖:

kafka學習筆記:知識點整理(一)

圖.1

1.2 相關概念

如圖.1中,kafka 相關名詞解釋如下:

1.producer:   消息生產者,發(fā)布消息到 kafka 集群的終端或服務。 2.broker:   kafka 集群中包含的服務器。 3.topic:   每條發(fā)布到 kafka 集群的消息屬于的類別,即 kafka 是面向 topic 的。 4.partition:   partition 是物理上的概念,每個 topic 包含一個或多個 partition。kafka 分配的單位是 partition。 5.consumer:   從 kafka 集群中消費消息的終端或服務。 6.Consumer group:   high-level consumer API 中,每個 consumer 都屬于一個 consumer group,每條消息只能被 consumer group 中的一個 Consumer 消費,但可以被多個 consumer group 消費。 7.replica:   partition 的副本,保障 partition 的高可用。 8.leader:   replica 中的一個角色, producer 和 consumer 只跟 leader 交互。 9.follower:   replica 中的一個角色,從 leader 中復制數(shù)據(jù)。 10.controller:   kafka 集群中的其中一個服務器,用來進行 leader election 以及 各種 failover。 12.zookeeper:   kafka 通過 zookeeper 來存儲集群的 meta 信息。

1.3 zookeeper 節(jié)點

kafka 在 zookeeper 中的存儲結構如下圖所示:

 kafka學習筆記:知識點整理(一)

圖.2

二、producer 發(fā)布消息

2.1 寫入方式

producer 采用 push 模式將消息發(fā)布到 broker,每條消息都被 append 到 patition 中,屬于順序寫磁盤(順序寫磁盤效率比隨機寫內存要高,保障 kafka 吞吐率)。

2.2 消息路由

producer 發(fā)送消息到 broker 時,會根據(jù)分區(qū)算法選擇將其存儲到哪一個 partition。其路由機制為:

1. 指定了 patition,則直接使用; 2. 未指定 patition 但指定 key,通過對 key 的 value 進行hash 選出一個 patition 3. patition 和 key 都未指定,使用輪詢選出一個 patition。

 附上 Java 客戶端分區(qū)源碼,一目了然:

//創(chuàng)建消息實例 public ProducerRecord(String topic, Integer partition, Long timestamp, K key, V value) { if (topic == null) throw new IllegalArgumentException("Topic cannot be null"); if (timestamp != null && timestamp < 0) throw new IllegalArgumentException("Invalid timestamp " + timestamp); this.topic = topic; this.partition = partition; this.key = key; this.value = value; this.timestamp = timestamp; } //計算 patition,如果指定了 patition 則直接使用,否則使用 key 計算 private int partition(ProducerRecord record, byte[] serializedKey , byte[] serializedValue, Cluster cluster) {      Integer partition = record.partition(); if (partition != null) {           List partitions = cluster.partitionsForTopic(record.topic()); int lastPartition = partitions.size() - 1; if (partition < 0 || partition > lastPartition) { throw new IllegalArgumentException(String.format("Invalid partition given with record: %d is not in the range [0...%d].", partition, lastPartition));           } return partition;      } return this.partitioner.partition(record.topic(), record.key(), serializedKey, record.value(), serializedValue, cluster); } // 使用 key 選取 patition public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {      List partitions = cluster.partitionsForTopic(topic); int numPartitions = partitions.size(); if (keyBytes == null) { int nextValue = counter.getAndIncrement();           List availablePartitions = cluster.availablePartitionsForTopic(topic); if (availablePartitions.size() > 0) { int part = DefaultPartitioner.toPositive(nextValue) % availablePartitions.size(); return availablePartitions.get(part).partition();           } else { return DefaultPartitioner.toPositive(nextValue) % numPartitions;           }      } else { //對 keyBytes 進行 hash 選出一個 patition return DefaultPartitioner.toPositive(Utils.murmur2(keyBytes)) % numPartitions;      } }

2.3 寫入流程

 producer 寫入消息序列圖如下所示:

kafka學習筆記:知識點整理(一)

圖.3

流程說明:

1. producer 先從 zookeeper 的 "/brokers/.../state" 節(jié)點找到該 partition 的 leader 2. producer 將消息發(fā)送給該 leader 3. leader 將消息寫入本地 log 4. followers 從 leader pull 消息,寫入本地 log 后 leader 發(fā)送 ACK 5. leader 收到所有 ISR 中的 replica 的 ACK 后,增加 HW(high watermark,最后 commit 的 offset) 并向 producer 發(fā)送 ACK

愿意了解更多技術分享的可關注:mingli.com

朋友需要請加球球:二零四二八四九二三七

2.4 producer delivery guarantee

 一般情況下存在三種情況:

1. At most once 消息可能會丟,但絕不會重復傳輸 2. At least one 消息絕不會丟,但可能會重復傳輸 3. Exactly once 每條消息肯定會被傳輸一次且僅傳輸一次

當 producer 向 broker 發(fā)送消息時,一旦這條消息被 commit,由于 replication 的存在,它就不會丟。但是如果 producer 發(fā)送數(shù)據(jù)給 broker 后,遇到網絡問題而造成通信中斷,那 Producer 就無法判斷該條消息是否已經 commit。雖然 Kafka 無法確定網絡故障期間發(fā)生了什么,但是 producer 可以生成一種類似于主鍵的東西,發(fā)生故障時冪等性的重試多次,這樣就做到了 Exactly once,但目前還并未實現(xiàn)。所以目前默認情況下一條消息從 producer 到 broker 是確保了 At least once,可通過設置 producer 異步發(fā)送實現(xiàn)At most once。

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。


分享文章:kafka學習筆記:知識點整理(一)-創(chuàng)新互聯(lián)
URL標題:http://www.dlmjj.cn/article/djcdjs.html