KAFKA第二課之生產者(面試重點)

生產者學習

1.1 生產者消息發送流程

在消息發送的過程中,涉及到了兩個線程——main線程和Sender線程。在main線程中創建了一個雙端隊列RecordAccumulator。main線程將消息發送給RecordAccumulator,Sender線程不斷從RecordAccumulator中拉取消息發送到Kafka Broker。
生產者如何發送的?
現在Main線程中將數據進行處理,處理成IO型數據,然后調用sender進行發送
Main:
1.讀取生產者配置
2.產生數據
3.過濾數據(校驗什么的)
4.序列化
5.放入緩沖區 RecordAccumulator
6.發送Sender

細節: 考慮的問題 1.生產者配置的讀取和修改 2.數據的過濾與分區, 3.緩沖區是如何設置的,大小
4.發送(發送失敗怎么樣,請求區的大小)
這里注意一下,可以在緩沖區對數據進行壓縮,這樣就提高緩沖區的容量和發送的數據量,提高吞吐量

1.2 同步發送與異步發送

1.什么是同步和異步

同步就是,串行,一條龍 異步 一起運行
舉例: 餐館點餐
同步: 需要等服務員過來,讓服務員記錄,
異步: 點餐APP直接點餐,交給隊列,讓他自己運行

2.發送的同步異步

同步:需要得到返回值
異步:發送過去不管了

3. 分區好處

啥是分區?
將一個數據塊分成多個數據塊
將數據分布式處理了
存儲: 可以分在多個機器上, 也可以整多個副本。便于存儲,同時提高健壯性
IO:多個數據塊可以同時進行發送接收消費。生產者可以以分區為單位發送數據,消費者可以以分區為單位進行消費

4. 默認分區器

前提條件: 1.分區 2.key值
規則:

  • 1存在,按1分區
  • 1不存在,按2.key值對分區數取余得到的值分區
  • 1.2都不存在 隨機選個分區,等這個批次發送完了,再換

3 就是粘性分區
那么粘性分區的缺點是什么?
因為緩沖區溢出的條件是,大小和時間雙重判斷,如果大小不夠,但是時間夠了,還是會發走,這樣,最后導致,分區上產生數據傾斜
如何解決的?
3.3.1 Kafka去掉粘性分區的時間控制,批次只由大小判斷

1.3.自定義分區器

1.思路

  • 1.實現接口Parititoner,重寫相關方法
  • 2.修改配置 將partitioner設置為默認配置

2.1 自定義分區器代碼

public class MyPartitioner implements Partitioner {//  自定義分區器 實現partitioner接口// 1.分區方法@Overridepublic int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {// 獲取消息String data = value.toString();// 創建partition 作為最后的分區標識int partitions;// 分區邏輯// 根據含有的字符串進行判斷 判斷進入哪個分區if (data.contains("atguigu")){partitions = 0;} else if (data.contains("shangguigu")){partitions = 1;} else {partitions = 2;}return partitions;}@Overridepublic void close() {}@Overridepublic void configure(Map<String, ?> configs) {}
}

2.2 主類

package com.atguigu.producer;import org.apache.kafka.clients.producer.*;
import org.apache.kafka.common.serialization.StringSerializer;import java.util.Properties;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;public class ProducerClientAsync {public static void main(String[] args) {// 0 配置對象Properties properties = new Properties();//  --指定kafka的Broker地址properties.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "hadoop102:9092,hadoop103:9092");//  -- 1.指定序列化器 序列化器的全限定類名properties.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());properties.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());//.setProperty(ProducerConfig.LINGER_MS_CONFIG,"0");// -- 2.設置分區器properties.setProperty(ProducerConfig.PARTITIONER_CLASS_CONFIG,MyPartitioner.class.getName());// -- 3.獲取客戶端連接對象KafkaProducer<String,String> kafkaProducer= new KafkaProducer<String,String>(properties);//  key是主題  v是發送內容  這里注意一下// -- 4.發送數據String[] str= {"atguigu","111","atguigu","shangguigu","222"};for (int i =0; i < str.length; i++) {System.out.println(str[i]);try {kafkaProducer.send(new ProducerRecord<>("first", str[i]), new Callback() {@Overridepublic void onCompletion(RecordMetadata metadata, Exception exception) {if (exception == null){System.out.println("主題:" + metadata.topic() + "->"  + "分區:" + metadata.partition());}else {// 出現異常打印exception.printStackTrace();}}}).get();} catch (InterruptedException e) {throw new RuntimeException(e);} catch (ExecutionException e) {throw new RuntimeException(e);}}kafkaProducer.close();}
}

在這里插入圖片描述

3.面試細節

1.如何提高生產者的吞吐量

  • 批次大小調到16
  • 將等待時間改成50-100ms 默認是0
  • 壓縮數據量,這樣每次發送的數據就多了
  • 加大緩沖區大小,進來的數據變多,發送也能提上去

2.生產者如何保證數據可靠性的

主要通過ack機制

1.什么是ACK機制?

根據ack值來決定Kafka集群服務端的存儲應答

  • ack=0 最低 生產者只管發送,不用接收
  • ack=1 中等 生產者發送完需要等待Leader保存后回應,
  • ack=-1 最高 生產者發送完需要等待所有副本保存后回應

2.分析ACK機制

性能與安全是成反比的
所以,-1雖然最安全,但是效率最低

3.如果將ACK調到-1會出現什么問題?

有可能出現數據重復發送與接收
比如,在同步的瞬間,Leader死掉,但是其他副本已經落盤,這時候,就是問題了。
因為Leader死掉了,所以會直接更換Leader,選出一個副本作為Leader,注意,這時顯示沒有收到內容,所以,send重新發送,這時候,每個副本上,收到的就是2份該數據了。

4.應用場景

acks=0 幾乎不用
acks=1 傳輸普通日志,允許丟失
acks=-1 傳輸高可靠性數據,一般與錢有關

5.ACK=-1一定可靠么?

不一定
如果分區副本數設置為1 ,或者ISR里應答的最小副本數設置為1(默認也是1),這時候,ack=1效果相同了。
也就是說,應答一個,就能走,就沒意義了
所以需要完全可靠就需要配置一下
ACK=-1 & 分區副本大于等于2 & ISR應答最小副本數量大于等于2

3. 數據去重

1.概念

至少一次:一次或者多次 完全可靠
在這里插入圖片描述
最多一次:直接不管回復只管發送 ack=0

至少:保證數據不丟失,但是無法保證數據不重復
最多: 無法保證數據不丟失

1.如何解決數據的重復發送與接收的問題,同時保證數據的不丟失

注意,這里解決的是sender和服務端的重復發送與接收,而不是生產者本身發送多個重復消息的問題,這個要搞清楚。
一般重復問題,都是通過標識來判別,從而去重的
Kafka 0.11 引入 冪等性和事務
精確一次: 冪等性 +至少一次(ack=-1 & 分區副本>=2 & ISR最小副本>=2)

4.冪等性

1.概念

啥是冪等性,標識一個消息的唯一標識
<pid,partition,Seqnumber>
Pid 是會話ID,每次重新生成會話,就會重新生成PID
partition是分區 標識 消息是哪個分區的
Seqnumber是單調遞增的標識,注意,這是每個分區獨享的
這三個在一起,才是唯一標識。

2.如何使用冪等性

開啟參數enable.idempotence 默認為true,false關閉。
開啟開關就行

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/37382.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37382.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37382.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

03-基礎入門-搭建安全拓展

基礎入門-搭建安全拓展 1、涉及的知識點2、常見的問題3、web權限的設置4、演示案例-環境搭建&#xff08;1&#xff09;PHPinfo&#xff08;2&#xff09;wordpress&#xff08;3&#xff09;win7虛擬機上使用iis搭建網站&#xff08;4&#xff09;Windows Server 2003配置WEB站…

C#應用處理傳入參數 - 開源研究系列文章

今天介紹關于C#的程序傳入參數的處理例子。 程序的傳入參數應用比較普遍&#xff0c;特別是一個隨操作系統啟動的程序&#xff0c;需要設置程序啟動的時候不顯示主窗體&#xff0c;而是在后臺運行&#xff0c;于是就有了傳入參數問題&#xff0c;比如傳入/h或者/min等等。所以此…

YOLO v8目標跟蹤詳細解讀(二)

上一篇&#xff0c;結合代碼&#xff0c;我們詳細的介紹了YOLOV8目標跟蹤的Pipeline。大家應該對跟蹤的流程有了大致的了解&#xff0c;下面我們將對跟蹤中出現的卡爾曼濾波進行解讀。 1.卡爾曼濾波器介紹 卡爾曼濾波&#xff08;kalman Filtering&#xff09;是一種利用線性…

歐拉OS 使用 CentOS 7 yum repo

一、下載CentOS的repo的yum文件 任何基于CentOS的yum的repo 的url是這樣的&#xff1a; 但歐拉OS輸出這個變量為&#xff1a;openEuler 20.03 (LTS-SP3) 那明顯歐拉想要使用這個yum的url找不到這個版本&#xff0c; 所以直接講這個變量替換為 7, Centos 7的7 然后執行&…

wget 詳解

wget 詳解 wget 詳解基本用法&#xff1a;命令參數&#xff1a;遞歸下載&#xff1a;斷點續傳&#xff1a;限速下載&#xff1a;后臺下載&#xff1a; 示例 wget 詳解 wget&#xff08;Web Get&#xff09;是一個用于從網絡上下載文件的命令行工具&#xff0c;常用于在 Linux …

從零實戰SLAM-第七課(多視角幾何)

在七月算法報的班&#xff0c;老師講的蠻好。好記性不如爛筆頭&#xff0c;關鍵內容還是記錄一下吧&#xff0c;課程入口&#xff0c;感興趣的同學可以學習一下。 --------------------------------------------------------------------------------------------------------…

整型int溢出引起的crash

線上系統發生了crash&#xff0c;后發現是整型溢出。 1、初始化函數的偽代碼&#xff1a; init_mem(int count, int size){for(int i0; i<count; i)mem_list[i] i*size; # 溢出發生的地方} 2、問題分析&#xff1a; 原有的變量 i、size 為有符號的int類型&#xff0c;i…

設計模式--策略模式

目錄 一.場景 1.1場景 2.2 何時使用 2.3個人理解 二. 業務場景練習 2.1業務: 2.2具體實現 2.3思路 三.總結 3.1策略模式的特點&#xff1a; 3.2策略模式優點 3.3策略模式缺點 一.場景 1.1場景 許多相關的類僅僅是行為有異&#xff0c;也就是說業務代碼需要根據場景不…

Android數字價格變化的動畫效果的簡單實現

原理&#xff1a;使用ValueAnimator屬性動畫類實現&#xff0c;它通過值的改變手動設置對象的屬性值來實現動畫效果。直接貼代碼&#xff1a; public static void doNumberAnim(TextView tvPrice, float startNumber, float endNumber) {ValueAnimator animator ValueAnimato…

C語言中的 RSA加密和解密算法: 深度探索與實現

C語言中的 RSA加密和解密算法: 深度探索與實現 RSA加密算法是一種非對稱加密算法&#xff0c;即公開密鑰加密&#xff0c;私有密鑰解密。在公開密鑰加密和私有密鑰解密的過程中&#xff0c;密鑰是不同的&#xff0c;這是與其他加密算法的主要區別。RSA算法的安全性依賴于大數分…

ssm+mybatis無法給帶有下劃線屬性賦值問題

原因&#xff1a;mybaitis根據配置&#xff0c;將有下劃線的字段名改為了駝峰格式。 具體見&#xff1a;ssmmybatis無法給帶有下劃線屬性賦值問題&#xff0c;無法獲取數據庫帶下劃線的字段值 - 開發者博客 解決方式&#xff1a; 直接將實體類中的下劃線去掉返回值使用resul…

歸并排序 與 計數排序

目錄 1.歸并排序 1.1 遞歸實現歸并排序&#xff1a; 1.2 非遞歸實現歸并排序 1.3 歸并排序的特性總結: 1.4 外部排序 2.計數排序 2.1 操作步驟: 2.2 計數排序的特性總結: 3. 7種常見比較排序比較 1.歸并排序 基本思想: 歸并排序(MERGE-SORT)是建立在歸并操作上的一種…

代理技術在網絡安全、爬蟲和數據隱私中的多重應用

1. Socks5代理&#xff1a;靈活的數據中轉 Socks5代理協議在網絡通信中起著關鍵作用。與其他代理技術不同&#xff0c;Socks5代理不僅支持TCP連接&#xff0c;還能夠處理UDP流量&#xff0c;使其在需要實時數據傳輸的場景中表現尤為出色。通過將請求和響應中轉到代理服務器&am…

redis分布式集群-redis+keepalived+ haproxy

redis分布式集群架構&#xff08;RedisKeepalivedHaproxy&#xff09;至少需要3臺服務器、6個節點&#xff0c;一臺服務器2個節點。 redis分布式集群架構中的每臺服務器都使用六個端口來實現多路復用&#xff0c;最終實現主從熱備、負載均衡、秒級切換的目標。 redis分布式集…

使用Edge和chrom擴展工具(GoFullPage)實現整頁面截圖或生成PDF文件

插件GoFullPage下載&#xff1a;點擊免費下載 如果在瀏覽網頁時&#xff0c;有需要整個頁面截圖或導出PDF文件的需求&#xff0c;這里分享一個Edge瀏覽器的擴展插件&#xff1a;GoFullPage。 這個工具可以一鍵實現頁面從上到下滾動并截取。 一、打開“管理擴展”&#xff08;…

網絡設備(防火墻、路由器、交換機)日志分析監控

外圍網絡設備&#xff08;如防火墻、路由器、交換機等&#xff09;是關鍵組件&#xff0c;因為它們控制進出公司網絡的流量。因此&#xff0c;監視這些設備的活動有助于 IT 管理員解決操作問題&#xff0c;并保護網絡免受攻擊者的攻擊。通過收集和分析這些設備的日志來監控這些…

Python 3 使用Hadoop 3之MapReduce總結

MapReduce 運行原理 MapReduce簡介 MapReduce是一種分布式計算模型&#xff0c;由Google提出&#xff0c;主要用于搜索領域&#xff0c;解決海量數據的計算問題。 MapReduce分成兩個部分&#xff1a;Map&#xff08;映射&#xff09;和Reduce&#xff08;歸納&#xff09;。…

tauri-react:快速開發跨平臺軟件的架子,支持自定義頭部和窗口陰影效果

tauri-react 一個使用 taurireacttsantd 開發跨平臺軟件的模板&#xff0c;支持窗口頭部自定義和窗口陰影&#xff0c;不用再自己做適配了&#xff0c;拿來即用&#xff0c;非常 nice。 開原地址&#xff1a;GitHub - Sjj1024/tauri-react: 一個最基礎的使用tauri和react開發…

生成式 AI 在泛娛樂行業的應用場景實踐 – 助力風格化視頻內容創作

感謝大家閱讀《生成式 AI 行業解決方案指南》系列博客&#xff0c;全系列分為 4 篇&#xff0c;將為大家系統地介紹生成式 AI 解決方案指南及其在電商、游戲、泛娛樂行業中的典型場景及應用實踐。目錄如下&#xff1a; 《生成式 AI 行業解決方案指南與部署指南》《生成式 AI 在…

一個概率論例題引發的思考

浙江大學版《概率論與數理統計》一書&#xff0c;第13章第1節例2&#xff1a; 這個解釋和模型比較簡單易懂。 接下來&#xff0c;第13章第2節的例2也跟此模型相關&#xff1a; 在我自己的理解中&#xff0c;此題的解法跟上一個題目一樣&#xff0c;其概率如下面的二維矩陣&a…