kafka消息發送,Kafka-produce(發送者)

 2023-10-15 阅读 20 评论 0

摘要:produce是kafka的消息發送者,負責將消息發送到kafka代理服務器(broker)指定的topic下的某個partition 一:消息的分布 假設現在一個topic下有兩個partition,下面是一個produce按照順序發送四條消息之后,partition中的情況 注意ÿ

produce是kafka的消息發送者,負責將消息發送到kafka代理服務器(broker)指定的topic下的某個partition

一:消息的分布
假設現在一個topic下有兩個partition,下面是一個produce按照順序發送四條消息之后,partition中的情況

注意:partition1和partition2都是leader,它倆可不是副本關系

在這里插入圖片描述
可以看到消息是大致按照圖中的樣子存儲的,主要想闡述的就是分片這個概念,目的是為了減少每個partition的存儲數據量,同時也為了消費端可以從多個partition同時取數據,那么這四條數據真實情況到底都存儲到哪個partition呢?其實我也不知道,我沒有測試,但是只要是分布式架構的中間件,必定遵循分布式理論,也就是說數據的分布方式只有可能是下面三種:
1.hash分布(kafka默認的分布方式)
2.按照數據范圍分布(按照數據特征分布)
3.按照數據量分布
所以感興趣的朋友可以自己測試一下,數據使用hash算法之后,分布到哪個partition,不過我覺得意義不大,我們研究的是kafka的設計思想,而不是這種小事

二:消息的持久化(如何確保消息不丟失)
在研究消息質量保證之前,必須要了解partition副本同步機制,你可以點擊這里查看關于partition同步機制

producer只是跟broker中的leader partition交互,不與follower partition交互
參數acks有四個值,分三種情況
acks=0:producer將消息扔給broker(就是leader partition)之后,就認為發送成功,如果出現網絡瞬斷,這種情況有可能消息丟失
acks=1:producer將消息扔給leader partition之后,等待leader partition數據持久到本地(commit log文件中),持久化完畢之后,認為發送成功
acks=-1:producer講消息扔給leader partition之后,不但要等待leader partition將數據持久到本地,還要等待follower將leader數據同步過去之后,才認為發送成功,這場景很適合重要的數據,比如訂單,銀行
acks=all:與-1完全一樣

日記:acks=-1可以和min.insync.replicas參數配合使用,假設一共有3個副本,
設置min.insync.replicas=2,
設置acks=-1,
那等待兩個副本寫入完畢,就返回,而不是三個副本全都寫入完畢

三:緩沖區
buffer_memory參數:發送者會將要發送的數據都扔到緩沖區,然后在緩沖區組裝batch包,最后將batch發送出去,注意這不是緩沖多少再發送,而是從緩沖區拿數據,拼裝batch,然后發送batch
batch_size參數:當每條消息的總大小達到多少時,發送該條消息
linger_ms參數:如果batch不滿,總不能不發吧,這個就是達到多少毫秒后,如果batch還沒滿,依然會發送出去

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/136939.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息