欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

分布式之全面了解Kafka的使用與特性

 更新時間:2021年11月26日 15:49:47   作者:Q.E.D.  
Kafka?是我工作多年使用最多的消息中間件?,特點是擁有巨大吞吐量(數(shù)百萬/秒),作為當下最流行的分布式,可水平擴展,可容錯的“消息系統(tǒng)”,下面跟隨小編看下分布式之全面了解Kafka的使用與特性

不啰嗦,我們直接開始!

引言

2020年,Kafka 依舊炙手可熱,一線大公司即使不用Kafka,但是自研產(chǎn)品也都是基于Kafka,或者完全借鑒Kafka設計思想,理論上來說,如果你還沒熟練掌握一個MQ框架,Kafka絕對是不錯的選擇。

關于歷史,如果你感興趣了解一下,至少知道是哪個公司開源的,Kafka最初于2011年在 LinkedIn 開發(fā),自那時起經(jīng)歷了很多改進,后來捐獻給Apache基金,如今發(fā)展成為一個完整的平臺,采用Scala和Java開發(fā)的開源流處理軟件。

Kafka 是我工作多年使用最多的消息中間件 ,特點是擁有巨大吞吐量(數(shù)百萬/秒),作為當下最流行的分布式,可水平擴展,可容錯的“消息系統(tǒng)”。

1、面試官:可以簡述下Kafka架構中比較重要的關鍵字嗎?

比如Partition,Broker,你都是怎么理解的?

問題分析:Kafka基礎知識考察,因為Kafka出色的性能,在集群結構上也有所不同,一些新的概念設計名字初學者可能搞不懂,構建一個 Kafka cluster 首先需要理解 topics, producers, consumers, and brokers 的概念。

答:關于Kafka我做了一些深入了解,它的設計思路還是很值得借鑒的,這其中有6個比較關鍵的名字概念,弄懂這幾個概念才能更好地了解Kafka的工作機制。

Producer
消息的生產(chǎn)方,如支付系統(tǒng)確認用戶已經(jīng)支付,支付系統(tǒng)要通知訂單系統(tǒng)和物流系統(tǒng),支付系統(tǒng)就是生產(chǎn)者。

Consumer
消費的接收方,Producer 的案例中,物流系統(tǒng)就是消費方,前兩個都比較簡單,我就不多說了。

Topic
每條發(fā)布到MQ集群的消息都有一個類別,這個類別被稱為topic,可以理解成一類消息的名字。所有的消息都已topic作為單位進行歸類。

Partition
Kafka 物理上分區(qū)的概念,每個 Topic 會分散在一個或多個 Partition。一個 Topic 的數(shù)據(jù)太大了,就分成小片,Kafka 為分區(qū)引入多副本模型,副本之間采用“一個leader多follower”的設計,通過多副本實現(xiàn)故障自動轉(zhuǎn)移,保證可用性。

Broker:
可以理解成一個服務器的節(jié)點,集群包含一個或多個服務器,這種服務器被稱為 broker。對應用來說,生產(chǎn)者把消費發(fā)出去了,就不管了。消費者慢條斯理地按照自己的速率來消費。這段時間可能有大量消息產(chǎn)生,消費者壓力還是在一定范圍內(nèi)。做生產(chǎn)者和消費者之間解耦的就是一個緩存服務broker。

Kafka Cluster

集群就是 Broker 的集合,多個 Broker 組成一個高可用集群。

Producer 與 Consumer的關系

圖片描述

?topic 和 Partition 的關系

一個?topic?可以分別存儲到多個?Partition,每個?Partition?有序的。

圖片描述

到這里面試官并沒有打斷我… 我就繼續(xù)了。

那我們?yōu)槭裁匆x擇 Kafka 呢??

1.這里不再列舉同類產(chǎn)品都具有的功能,直接總結干貨,Kafka 特有的功能:

2.相比同類中間件 RabbitMQ or ActiveMQ,Kafka?支持批量拉取消息,大大增加了Kafka的消息吞吐量。

支持多種發(fā)送場景:

1.發(fā)送并忘記。

2.同步發(fā)送 。

3.異步發(fā)送+回調(diào)函數(shù)。

3種方式雖然在時間上有所差別,但并不是說時間越快的越好,具體使用哪種方式要看具體的業(yè)務場景,比如業(yè)務要求消息必須是按順序發(fā)送,可以使用第2種同步發(fā)送,并且只能在一個partation上。如果業(yè)務只關心消息的吞吐量,容許少量消息發(fā)送失敗,也不關注消息的發(fā)送順序,那么可以使用發(fā)送并忘記的方式。如果業(yè)務需要知道消息發(fā)送是否成功,并且對消息的順序不關心,那么可以用異步+回調(diào)的方式來發(fā)送消息

3.分布式可高可擴展。Kafka 集群可以透明的擴展,增加新的服務器進集群。

?只說了 Kafka 的優(yōu)勢,那別的同類產(chǎn)品就不好了嗎?當然不是,存在即真理,每個產(chǎn)品能生存下來,一定有它自己的優(yōu)勢,比如 RabbitMQ,在吞吐量方面稍遜于 Kafka ,但是他們的出發(fā)點不一樣,RabbitMQ 支持對消息的可靠的傳遞,支持事務,不支持批量的操作,技術選型中,選擇最適合你的,你最了解熟悉的。

分布式 高性能 持久性和擴展性
支持多分區(qū) 高吞吐量 數(shù)據(jù)可持久化
支持多副本 低延遲 容錯性高
支持多訂閱者 高并發(fā) 支持水平在線擴展
基于ZooKeeper調(diào)度 時間復雜度為O(1) 消息分發(fā)自動平衡

言多必失,說了一堆 Kafka 相比其他產(chǎn)品有多好多快,終于成功給自己挖了一個坑。(?),順著我的思路展開了問

2、面試官:那為什么Kafka的吞吐量遠高于其他同類中間件?

問題分析:多年經(jīng)驗總結,面試中最吃虧的就是你把你不熟悉的東西寫在簡歷上,還有就是你知道結果,不知其原理,源碼沒看過,好歹也要知道用了巧妙的設計。

答:Kafka 是一個高吞吐量分布式消息系統(tǒng),并且提供了持久化。其高性能的有兩個重要特點:

1.利用了磁盤連續(xù)讀寫性能遠遠高于隨機讀寫的特點,內(nèi)部采用消息的批量處理,zero-copy機制,數(shù)據(jù)的存儲和獲取是本地磁盤順序批量操作,具有O(1)的復雜度,消息處理的效率很高。

2.并發(fā),將一個topic拆分多個partition, kafka讀寫的單位是partition,因此,將一個topic拆分為多個partition可以提高吞吐量。但是,這里有個前提,就是不同partition需要位于不同的磁盤(可以在同一個機器)。如果多個partition位于同一個磁盤,那么意味著有多個進程同時對一個磁盤的多個文件進行讀寫,使得操作系統(tǒng)會對磁盤讀寫進行頻繁調(diào)度,也就是破壞了磁盤讀寫的連續(xù)性。
在linkedlin的測試中,每臺機器就加載了6個磁盤,并且不做ra,就是為了充分利用多磁盤并發(fā)讀寫,又保證每個磁盤連續(xù)讀寫的特性。

圖片描述

同一個topic會被分散到多個分片上,并行處理。?

深入分析

Kafka 消息的生產(chǎn)與消費模型Demo

偽代碼:使用KafKa客戶端發(fā)送一條消息

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);//發(fā)送出去一條消息。
        } 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創(chuàng)建相同主題相同隊列的消費者實例數(shù)有限制,超過100個拒絕創(chuàng)建.
    * */
    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");
 
        // 創(chuàng)建topic對應的consumer對象(注意每次build調(diào)用會產(chǎn)生一個新的實例)
        consumer = KafkaClient.buildConsumerFactory(properties, "topic.xxx.xxx");
 
        // 調(diào)用recvMessageWithParallel設置listener
        consumer.recvMessageWithParallel(String.class, new IMessageListener() {
            @Override
            public ConsumeStatus recvMessage(Message message, MessagetContext context) {
                //TODO:業(yè)務側(cè)的消費邏輯代碼
                try {
                    System.out.println("message=[" + message.getBody() + "]  partition=" + message.getParttion());
                } catch (Exception e) {
                    e.printStackTrace();
                }
              
                return ConsumeStatus.CONSUME_SUCCESS;
            }
        });
       
    }
}

附錄:消息管理工具

如果你們剛剛搭建起Kafka集群,還沒有完備的頁面管理系統(tǒng),你不妨了解一下這幾款開源工具,給領導展示一下解決問題的能力。

為了簡化開發(fā)者和服務工程師維護 Kafka 集群的工作,基于頁面的管理工具必不可少。

常用 Kafka 開源管理工具:

Kafka Manager?:由 yahoo 團隊開發(fā)。使用可參考:https://github.com/yahoo/kafka-manager

圖片描述

Kafka Lens:開源項目,允許開發(fā)人員在通過代理傳遞消息時查看消息,也可以按分區(qū)過濾消息。

參考:https://github.com/kafka-lens/kafka-lens

圖片來源:Kafka Lens

Kafka Monitor?:測試和監(jiān)視Kafka集群,而不需要對應用程序進行任何更改。
使用參考:https://github.com/linkedin/kafka-monitor

總結

Kafka架構關鍵字:

  1. Producer
  2. Consumer
  3. Topic
  4. Partition
  5. Broker
  6. Kafka Cluster

每一個關鍵詞都值得你深入研究,讓面試官看到你的亮點吧。

Kafka的性能為何如此優(yōu)秀:一句話總結:得益于架構采用分布式并行處理,利用磁盤順序IO批處理。

參考資料

Kafka官網(wǎng)

Thorough Introduction to Apache Kafka

如果你想系統(tǒng)了解下Kafka,可以推薦一本書《深入理解Kafka:核心設計與實踐原理》,微信讀書就可以免費閱讀。

到此這篇關于分布式之全面了解Kafka的使用與特性的文章就介紹到這了,更多相關Kafka的使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JVM中-D、-X、-XX參數(shù)的區(qū)別

    JVM中-D、-X、-XX參數(shù)的區(qū)別

    本文主要介紹了JVM中-D、-X、-XX參數(shù)的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • 一文帶你搞懂Java8的LocalDateTime

    一文帶你搞懂Java8的LocalDateTime

    LocalDateTime?是Java8中新加入的日期時間類,現(xiàn)在都?Java20?了,不會還有人沒用過?LocalDateTime?吧?今天給大家演示一下?LocalDateTime?的常用方法
    2023-04-04
  • Spring通過ApplicationContext主動獲取bean的方法講解

    Spring通過ApplicationContext主動獲取bean的方法講解

    今天小編就為大家分享一篇關于Spring通過ApplicationContext主動獲取bean的方法講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • java通過url讀取文件內(nèi)容示例

    java通過url讀取文件內(nèi)容示例

    這篇文章主要介紹了java通過url讀取文件內(nèi)容示例,大家參考使用吧
    2014-01-01
  • 一篇文章教帶你了解Java Spring之自動裝配

    一篇文章教帶你了解Java Spring之自動裝配

    今天小編就為大家分享一篇關于Spring中的自動裝配,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2021-09-09
  • Spring?Boot整合Zookeeper實現(xiàn)分布式鎖的場景分析

    Spring?Boot整合Zookeeper實現(xiàn)分布式鎖的場景分析

    這篇文章主要介紹了Spring?Boot整合Zookeeper實現(xiàn)分布式鎖,zk實現(xiàn)分布式鎖完全是依靠zk節(jié)點類型當中的臨時序號節(jié)點來實現(xiàn)的,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • Springboot Apollo配置yml的問題及解決方案

    Springboot Apollo配置yml的問題及解決方案

    這篇文章主要介紹了Springboot Apollo配置yml的問題及解決方案,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • Spring實現(xiàn)聲明式事務的方法詳解

    Spring實現(xiàn)聲明式事務的方法詳解

    這篇文章主要介紹了Spring實現(xiàn)聲明式事務的方法詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • java使用Graphics2D繪圖/畫圖方式

    java使用Graphics2D繪圖/畫圖方式

    這篇文章主要介紹了java使用Graphics2D繪圖/畫圖方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • springboot整合shardingsphere和seata實現(xiàn)分布式事務的實踐

    springboot整合shardingsphere和seata實現(xiàn)分布式事務的實踐

    本文主要介紹了springboot整合shardingsphere和seata實現(xiàn)分布式事務的實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07

最新評論