您好,登錄后才能下訂單哦!
這篇文章主要講解了“Kafka的使用與特性怎么理解”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“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 有序的。
到這里面試官并沒有打斷我… 我就繼續了。
1.這里不再列舉同類產品都具有的功能,直接總結干貨,Kafka 特有的功能:
2.相比同類中間件 RabbitMQ or ActiveMQ,Kafka 支持批量拉取消息,大大增加了Kafka的消息吞吐量。
支持多種發送場景:
1.發送并忘記。
2.同步發送 。
3.異步發送+回調函數。
3種方式雖然在時間上有所差別,但并不是說時間越快的越好,具體使用哪種方式要看具體的業務場景,比如業務要求消息必須是按順序發送,可以使用第2種同步發送,并且只能在一個partation上。如果業務只關心消息的吞吐量,容許少量消息發送失敗,也不關注消息的發送順序,那么可以使用發送并忘記的方式。如果業務需要知道消息發送是否成功,并且對消息的順序不關心,那么可以用異步+回調的方式來發送消息
3.分布式可高可擴展。Kafka 集群可以透明的擴展,增加新的服務器進集群。
只說了 Kafka 的優勢,那別的同類產品就不好了嗎?當然不是,存在即真理,每個產品能生存下來,一定有它自己的優勢,比如 RabbitMQ,在吞吐量方面稍遜于 Kafka ,但是他們的出發點不一樣,RabbitMQ 支持對消息的可靠的傳遞,支持事務,不支持批量的操作,技術選型中,選擇最適合你的,你最了解熟悉的。
分布式 | 高性能 | 持久性和擴展性 |
---|---|---|
支持多分區 | 高吞吐量 | 數據可持久化 |
支持多副本 | 低延遲 | 容錯性高 |
支持多訂閱者 | 高并發 | 支持水平在線擴展 |
基于ZooKeeper調度 | 時間復雜度為O(1) | 消息分發自動平衡 |
言多必失,說了一堆 Kafka 相比其他產品有多好多快,終于成功給自己挖了一個坑。(?),順著我的思路展開了問
問題分析:多年經驗總結,面試中最吃虧的就是你把你不熟悉的東西寫在簡歷上,還有就是你知道結果,不知其原理,源碼沒看過,好歹也要知道用了巧妙的設計。
答:Kafka 是一個高吞吐量分布式消息系統,并且提供了持久化。其高性能的有兩個重要特點:
1.利用了磁盤連續讀寫性能遠遠高于隨機讀寫的特點,內部采用消息的批量處理,zero-copy機制,數據的存儲和獲取是本地磁盤順序批量操作,具有O(1)的復雜度,消息處理的效率很高。
2.并發,將一個topic拆分多個partition, kafka讀寫的單位是partition,因此,將一個topic拆分為多個partition可以提高吞吐量。但是,這里有個前提,就是不同partition需要位于不同的磁盤(可以在同一個機器)。如果多個partition位于同一個磁盤,那么意味著有多個進程同時對一個磁盤的多個文件進行讀寫,使得操作系統會對磁盤讀寫進行頻繁調度,也就是破壞了磁盤讀寫的連續性。
在linkedlin的測試中,每臺機器就加載了6個磁盤,并且不做ra,就是為了充分利用多磁盤并發讀寫,又保證每個磁盤連續讀寫的特性。
同一個topic會被分散到多個分片上,并行處理。
偽代碼:使用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 團隊開發。
感謝各位的閱讀,以上就是“Kafka的使用與特性怎么理解”的內容了,經過本文的學習后,相信大家對Kafka的使用與特性怎么理解這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。