不啰嗦,我們直接開始!
引言
2020年,Kafka 依舊炙手可熱,一線大公司即使不用Kafka,但是自研產品也都是基于Kafka,或者完全借鑒Kafka設計思想,理論上來說,如果你還沒熟練掌握一個MQ框架,Kafka絕對是不錯的選擇,
關于歷史,如果你感興趣了解一下,至少知道是哪個公司開源的,Kafka最初于2011年在 LinkedIn 開發,自那時起經歷了很多改進,后來捐獻給Apache基金,如今發展成為一個完整的平臺,采用Scala和Java開發的開源流處理軟體,
Kafka 是我作業多年使用最多的訊息中間件 ,特點是擁有巨大吞吐量(數百萬/秒),作為當下最流行的分布式,可水平擴展,可容錯的“訊息系統”,
1、面試官:可以簡述下Kafka架構中比較重要的關鍵字嗎?比如Partition,Broker,你都是怎么理解的?
問題分析:Kafka基礎知識考察,因為Kafka出色的性能,在集群結構上也有所不同,一些新的概念設計名字初學者可能搞不懂,構建一個 Kafka cluster 首先需要理解 topics, producers, consumers, and brokers 的概念,
答:關于Kafka我做了一些深入了解,它的設計思路還是很值得借鑒的,這其中有6個比較關鍵的名字概念,弄懂這幾個概念才能更好地了解Kafka的作業機制,
-
Producer
訊息的生產方,如支付系統確認用戶已經支付,支付系統要通知訂單系統和物流系統,支付系統就是生產者, -
Consumer
消費的接收方,Producer 的案例中,物流系統就是消費方,前兩個都比較簡單,我就不多說了, -
Topic
每條發布到MQ集群的訊息都有一個類別,這個類別被稱為topic,可以理解成一類訊息的名字,所有的訊息都已topic作為單位進行歸類, -
Partition
Kafka 物理上磁區的概念,每個 Topic 會分散在一個或多個 Partition,一個 Topic 的資料太大了,就分成小片,Kafka 為磁區引入多副本模型,副本之間采用“一個leader多follower”的設計,通過多副本實作故障自動轉移,保證可用性, -
Broker:
可以理解成一個服務器的節點,集群包含一個或多個服務器,這種服務器被稱為 broker,對應用來說,生產者把消費發出去了,就不管了,消費者慢條斯理地按照自己的速率來消費,這段時間可能有大量訊息產生,消費者壓力還是在一定范圍內,做生產者和消費者之間解耦的就是一個快取服務broker, -
Kafka Cluster
集群就是 Broker 的集合,多個 Broker 組成一個高可用集群,
Producer 與 Consumer的關系
topic 和 Partition 的關系
一個 topic 可以分別存盤到多個 Partition,每個 Partition 有序的,
到這里面試官并沒有打斷我… 我就繼續了,
那我們為什么要選擇 Kafka 呢?
這里不再列舉同類產品都具有的功能,直接總結干貨,Kafka 特有的功能:
-
相比同類中間件 RabbitMQ or ActiveMQ,Kafka 支持批量拉取訊息,大大增加了Kafka的訊息吞吐量,
-
支持多種發送場景:
1.發送并忘記,
2.同步發送 ,
3.異步發送+回呼函式,
3種方式雖然在時間上有所差別,但并不是說時間越快的越好,具體使用哪種方式要看具體的業務場景,比如業務要求訊息必須是按順序發送,可以使用第2種同步發送,并且只能在一個partation上,如果業務只關心訊息的吞吐量,容許少量訊息發送失敗,也不關注訊息的發送順序,那么可以使用發送并忘記的方式,如果業務需要知道訊息發送是否成功,并且對訊息的順序不關心,那么可以用異步+回呼的方式來發送訊息
-
分布式可高可擴展,Kafka 集群可以透明的擴展,增加新的服務器進集群,
只說了 Kafka 的優勢,那別的同類產品就不好了嗎?當然不是,存在即真理,每個產品能生存下來,一定有它自己的優勢,比如 RabbitMQ,在吞吐量方面稍遜于 Kafka ,但是他們的出發點不一樣,RabbitMQ 支持對訊息的可靠的傳遞,支持事務,不支持批量的操作,技術選型中,選擇最適合你的,你最了解熟悉的,
| 分布式 | 高性能 | 持久性和擴展性 |
|---|---|---|
| 支持多磁區 | 高吞吐量 | 資料可持久化 |
| 支持多副本 | 低延遲 | 容錯性高 |
| 支持多訂閱者 | 高并發 | 支持水平在線擴展 |
| 基于ZooKeeper調度 | 時間復雜度為O(1) | 訊息分發自動平衡 |
言多必失,說了一堆 Kafka 相比其他產品有多好多快,終于成功給自己挖了一個坑,(?),順著我的思路展開了問
2、面試官:那為什么Kafka的吞吐量遠高于其他同類中間件?
問題分析:多年經驗總結,面試中最吃虧的就是你把你不熟悉的東西寫在簡歷上,還有就是你知道結果,不知其原理,原始碼沒看過,好歹也要知道用了巧妙的設計,
答:Kafka 是一個高吞吐量分布式訊息系統,并且提供了持久化,其高性能的有兩個重要特點:
-
利用了磁盤連續讀寫性能遠遠高于隨機讀寫的特點,內部采用訊息的批量處理,zero-copy機制,資料的存盤和獲取是本地磁盤順序批量操作,具有O(1)的復雜度,訊息處理的效率很高,
-
并發,將一個topic拆分多個partition, kafka讀寫的單位是partition,因此,將一個topic拆分為多個partition可以提高吞吐量,但是,這里有個前提,就是不同partition需要位于不同的磁盤(可以在同一個機器),如果多個partition位于同一個磁盤,那么意味著有多個行程同時對一個磁盤的多個檔案進行讀寫,使得作業系統會對磁盤讀寫進行頻繁調度,也就是破壞了磁盤讀寫的連續性,
在linkedlin的測驗中,每臺機器就加載了6個磁盤,并且不做raid,就是為了充分利用多磁盤并發讀寫,又保證每個磁盤連續讀寫的特性,同一個topic會被分散到多個分片上,并行處理,
深入分析
Kafka 訊息的生產與消費模型Demo
偽代碼:使用KafKa客戶端發送一條訊息
public class MqProducer {
private final Logger LOG = LoggerFactory.getLogger(MqProducer.class);
@Resource
private Producer payProducer;
public void sendPayMsg(String msg) {
try {
LOG.debug("send msg:{}", msg);
payProducer.send(msg);//發送出去一條訊息,
} catch (MQException e) {
LOG.error("mq訊息例外 message:{}", msg, e);
}
}
}
長什么樣子?
即payProducer.send(msg)里的msg的值:
{"businessType":1,"cityId":10,"ctime":1567426767077,"dataKey":20190902,"logType":1,"phone":"13212341234","uid":12345678,"userType":1,"uuid":"32EA02C86D78863"}
無論訊息長短,都可以看作一個json串,用 key-value的形式傳遞資訊,
偽代碼:接收一條訊息
public class DemoConsumer {
/**
* 注意:服務端對單ip創建相同主題相同佇列的消費者實體數有限制,超過100個拒絕創建.
* */
private static IConsumerProcessor consumer;
public static void main(String[] args) throws Exception {
Properties properties = new Properties();
properties.setProperty(ConsumerConstants.SubscribeGroup, "dache.risk.log.queue.v2");
// 創建topic對應的consumer物件(注意每次build呼叫會產生一個新的實體)
consumer = KafkaClient.buildConsumerFactory(properties, "topic.xxx.xxx");
// 呼叫recvMessageWithParallel設定listener
consumer.recvMessageWithParallel(String.class, new IMessageListener() {
@Override
public ConsumeStatus recvMessage(Message message, MessagetContext context) {
//TODO:業務側的消費邏輯代碼
try {
System.out.println("message=[" + message.getBody() + "] partition=" + message.getParttion());
} catch (Exception e) {
e.printStackTrace();
}
return ConsumeStatus.CONSUME_SUCCESS;
}
});
}
}
附錄:訊息管理工具
如果你們剛剛搭建起Kafka集群,還沒有完備的頁面管理系統,你不妨了解一下這幾款開源工具,給領導展示一下解決問題的能力,
為了簡化開發者和服務工程師維護 Kafka 集群的作業,基于頁面的管理工具必不可少,
常用 Kafka 開源管理工具:
- Kafka Manager :由 yahoo 團隊開發,使用可參考:https://github.com/yahoo/kafka-manager
- Kafka Lens:開源專案,允許開發人員在通過代理傳遞訊息時查看訊息,也可以按磁區過濾訊息,
參考:https://github.com/kafka-lens/kafka-lens
圖片來源:Kafka Lens
- Kafka Monitor :測驗和監視Kafka集群,而不需要對應用程式進行任何更改,
使用參考:https://github.com/linkedin/kafka-monitor
總結
Kafka架構關鍵字:
- Producer
- Consumer
- Topic
- Partition
- Broker
- Kafka Cluster
每一個關鍵詞都值得你深入研究,讓面試官看到你的亮點吧,
Kafka的性能為何如此優秀:一句話總結:得益于架構采用分布式并行處理,利用磁盤順序IO批處理,
參考資料
- Kafka官網
- Thorough Introduction to Apache Kafka
- 如果你想系統了解下Kafka,可以推薦一本書《深入理解Kafka:核心設計與實踐原理》,微信讀書就可以免費閱讀,
不啰嗦,文章結束,期待三連!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/317850.html
標籤:其他
