1.自我介紹
2.基本資料型別有哪些
int 整型 32位 最常用的資料型別
short 短整型 16 常用於節省記憶體
long 長整型 64位 用於較大整數的計算
flort 浮點型 32位 用於科學計算和高精度計算
double 雙精度浮點型 64位
char 字元 可以表示數字、字母、符號
byte 位元組 用於檔案和網路的位元組級別傳輸
boolen 布林型 只有true和false兩種取值 常用於判斷
3. 定義的時候為什麼用integer 不用int
integer定義的初始值為null,int定義的初始值是0;為了防止不必要的麻煩(比如成績 0)
integer初始值為null,int初始值為0
4. string傳遞的是值還是引用
值傳遞,string是不可改變的,發生改變則是重新定義的字串
4.1stringBuffer和stringBuilder
是可改變的,但是stringBuilder執行緒不安全,但是效能好;被建立在堆上
5.常用的集合框架說一下,哪些是安全的
list、set、hashmap 執行緒都不安全
list 有arrayList和linkedlist 陣列和連結串列 陣列檢視快
執行緒安全的:Hashtable,ConcurrentHashMap,Vector ,CopyOnWriteArrayList ,CopyOnWriteArraySet
執行緒不安全的:HashMap,ArrayList,LinkedList,HashSet,TreeSet,TreeMap
6. mybatis #和$區別,什麼時候用$
#傳的值會預設加上雙引號作為字串,$會直接拼在sql中;當作為sql中一部分而非引數時
7.Linux的基本指令說一下
目錄:
mkdir建立、rm刪除檔案或目錄、rmdir刪除空目錄、find查詢、mv移動或修改名稱、cp 複製檔案或目錄、pwd顯示當前目錄
檔案:
touch建立、rm刪除、head檢視前面行tail加行數檢視後面對應行數、?檢視全部、vi進入編輯修改檔案,i開始編輯esc停止編輯:wq儲存並關閉:!wq強制儲存關閉
壓縮
bzip2、zip
解壓縮
unzip、tar
安裝yum
開啟目錄 cd加目錄名稱
檢視目錄下檔案 ls
停止正在執行的程式ctrl+c
關機 shutdown
重啟reboot
8. Jvm設定的常用引數?-Xss是什麼?
9. Redis的操作,Mysql的操作
10. Springmvc 和springboot一般是單例還是多例 為什麼
11. List用for遍歷存在的問題,應該用什麼
12. sql查詢慢怎麼看,主要看哪幾個引數
執行時間: 觀察查詢執行所需的時間。如果一個查詢花費了相對較長的時間才能返回結果,可能就是慢查詢的一個指標。通常,這個時間取決於具體的環境和預期效能。
資源消耗: 查詢是否消耗了大量的系統資源,比如 CPU、記憶體或者磁碟 I/O。這可能會影響系統的整體效能,尤其在高負載時。
慢日誌: 資料庫通常會記錄慢查詢日誌,這些日誌會記錄執行時間較長的查詢。檢視資料庫的慢查詢日誌可以找到慢 SQL 查詢的資訊,包括執行時間、消耗資源等。
查詢執行計劃: 使用資料庫提供的工具或命令,獲取查詢的執行計劃。執行計劃可以顯示查詢是如何被執行的,以及可能存在的效能瓶頸。
索引最佳化: 確保資料庫表上有適當的索引,有時缺少正確的索引會導致查詢變得緩慢。最佳化索引可以提升查詢效能。
普通索引index、唯一索引unique index、全文索引fulltext index、index
增加方式:建立時增加、建立表後增加create index index_name on table_name(column)、修改表增加alter table table_name add index index_name()
索引失效:
運算子不匹配。如果查詢中使用的運算子與索引定義的不同,索引會失效。例如,使用LIKE查詢字串而索引的資料型別為數字或日期型別。12345678
函式使用。如果在查詢中使用了函式,例如LOWER或UPPER函式,該函式可能會使索引不再有效。原因在於函式會改變查詢條件的形式,不再是索引上的原始值。123456
型別轉換。如果查詢中使用了某種型別的轉換,索引會失效。例如,在查詢中將字串轉換為數字。12348
表示式複雜。如果查詢條件中有複雜的表示式,可能無法使用索引。1
NULL值。如果索引中包含NULL值,NULL值的行將不包括在索引中。因此,在查詢時使用索引的列時,如果查詢條件使用了NULL,索引將不再有效。12468
OR語句使用。當使用OR語句時,索引可能會失效。例如,“WHERE column1 = 1 OR column2 = 2”,如果這兩個列都有索引,但由於OR運算子需要掃描兩個索引,因此無法使用它們。
聯合索引使用不當。如果查詢條件沒有使用到建立的索引欄位,資料庫可能不會使用該索引。568
表連線中的索引失效。如果在表連線查詢中,連線條件中的欄位沒有索引,可能導致索引失效。
索引何時用:
1.原則上來說:一個表需要跟別人做連線的欄位都要加索引,比如表A 的A1,A2,A3需要跟其他表發生連線,那麼3個欄位都要加索引
2.經常用來查詢的欄位,模糊查詢的欄位不用, 其他精確查詢且欄位重複率低的最好需要.比如 varchar欄位
3.如果一個表經常用這個欄位進行條件查詢,這個欄位是不是要加索引,要看這個欄位的值是什麼場景的,如果是列舉的,值是固定的幾個,就沒多大意義,如果是各式各樣的,比如 varchar(100)裡面的值重複很少,而且查詢不是以like()進行 那麼可以考慮加一加.
4.Mysql中Like查詢 keyword%,走索引 %keyword%不走索引
5.比如使用者名稱,建立時間,狀態,很多常用的條件,就可以嘗試建組合索引,注意Where順序要一樣,組合索引,要有組合欄位被檢索的場景才有用
6.資料重複多的話用點陣圖索引
7.索引多了的表,不建議物理刪除資料,最好邏輯刪除,索引多了維護起來累,還有,建議索引不要跟資料在一個表空間(Oracle)
8.只要用索引就會拖慢插入 更新的速度,所以自己權衡好
9.每個表不超過三個索引,並不是建的越多效能越好,亂建索引會導致查詢慢,具體請看執行計劃
10.Oracle高版本按照CBO來最佳化的,如果CBO覺得不走索引快,那麼你建再多的索引都沒有用.
監控工具: 使用監控工具來跟蹤資料庫的效能指標,如查詢次數、響應時間等。這些工具可以幫助及時發現慢查詢並定位效能問題。下圖為使用pigoss監控MySQL和Oracle的慢查詢。
13.快取雪崩
定義:當快取系統中的大量快取同時失效或不可用時,請求會直接落到後端系統上,導致後端系統負載驟增,甚至當機
原因:雪崩效應通常發生在快取失效的瞬間,這可能是由於快取過期、快取伺服器故障、快取擊穿等原因導致
影響:
效能下降:後端系統無法及時處理大量請求,導致響應時間增加,系統效能下降。
響應中斷:由於後端系統無法承受壓力,部分請求可能會超時或直接失敗,導致服務中斷
措施:
多級快取(艙壁模式):使用多級快取架構,如本地快取、分散式快取等,減少單一快取失效對整個系統的影響。
快取預熱:在系統啟動或快取失效前,提前載入熱門資料到快取中,避免大量請求落到後端系統。
快取失效策略:合理設定快取的過期時間,並採用合適的快取失效策略,如LRU(最近最少使用)等。
限流和熔斷:透過限制請求的併發量或採用熔斷機制來控制請求對後端系統的衝擊,保護系統穩定性。
容災和高可用:配置系統的冗餘和故障轉移,確保即使其中一部分快取或後端系統不可用,仍能保持系統的正常執行。
redis支援的五種型別:string、list、set、zset、bmap
14.docker容器
可以將程式及依賴包打包放到docker中,這樣就可以在任何安裝了docker引擎的伺服器上部署包括windows、linux等
15、mybatis中有哪些標籤
sql定義 insert、delete、update、select
sql拼接 foreach、if、case、when
foreach中的屬性 collection(集合物件)、item(集合元素遍歷時別名)、open(常為"(")、close(常為")")、separator(分隔符常為",")
16、springboot如何實現事務
在實現方法上面加上@Transactional增刪改查將具有原子性()
什麼時候觸發事務回滾:預設丟擲執行時異常(即繼承自RuntimeException的異常)也可以加rollbackfor=Exception.class、error、手動回滾
什麼時候不回滾:異常只捕獲不跑出、方法中呼叫了別的對錶操作的方法沒有加標籤
17、秒殺問題
利用redis的單執行緒特性預減庫存處理秒殺超賣問題!!!
在系統初始化時,將商品以及對應的庫存數量預先載入到Redis快取中;(快取預熱)
接收到秒殺請求時,在Redis中進行預減庫存(decrement),當Redis中的庫存不足時,直接返回秒殺失敗,否則繼續進行第3步;
將請求放入非同步佇列中,返回正在排隊中;
服務端非同步佇列(MQ)將請求出隊,出隊成功的請求可以生成秒殺訂單,減少資料庫庫存,返回秒殺訂單詳情。
18、面向切面程式設計 AOP
已經有原始的方法,想增加額外功能不想動原來程式碼,抽象出來一個通知類,定義出該類要增加的目標方法(這個點叫切入點),
額外功能類和切入點繫結(這個環節叫植入),額外功能與原功能解耦,快速擴充套件額外功能
19、非同步呼叫多執行緒
非同步請求、併發執行、快速結束
執行緒池處理
建立執行緒的幾種方式:繼承Thread類、實現Runnable介面、實現Callable介面
20、事務的隔離級別
Read Uncommitted (讀未提交)。最低的隔離級別,允許髒讀,即一個事務可以讀取另一個未提交事務的資料。1234567
Read Committed (讀提交)。一個事務只能讀取已經提交的資料,這樣可以避免髒讀,但可能出現不可重複讀,即在同一事務中多次讀取同一行資料時,可能得到不同的結果。
Repeatable Read (可重複讀取)。保證在同一事務中多次讀取同一行資料時,結果始終一致,但可能出現幻讀,即在多次查詢時,結果集的行數可能不一致。
Serializable (序列化)。最高的隔離級別,事務按順序一個接一個執行,避免髒讀、不可重複讀和幻讀,但效率較低。
21、鎖
22、重寫和過載的區別
過載:
定義位置:過載方法必須在同一個類中定義。
方法名和引數列表:過載方法的方法名相同但引數列表不同,引數型別可以不同,也可以是引數順序不同。
返回型別:過載方法的返回型別可以不同。
目的:過載的目的是為了提高程式碼的可讀性和簡潔性,同時也可以減少編寫相似程式碼的工作量。
重寫:
定義位置:重寫方法必須在子類中定義。
方法名和引數列表:重寫方法的方法名和引數列表必須與父類相同。
返回型別:重寫方法的返回型別必須相同或是其子類。
目的:重寫的目的是為了改變父類方法的實現,以便適應子類的特定需求。
23、hashmap和hashtable區別
執行緒安全性:
HashMap 是非執行緒安全的,這意味著在多執行緒環境下使用 HashMap 時,需要額外的同步措施來避免資料競爭和不一致的問題。
Hashtable 是執行緒安全的,它的所有方法都經過了 synchronized 關鍵字修飾,因此在多執行緒環境中使用 Hashtable 時,可以避免同步問題。
效率:
由於執行緒安全性的差異,HashMap 的效率通常比 Hashtable 高,因為 Hashtable 提供了更復雜的同步機制。
Null 值支援:
HashMap 允許鍵和值為 null,但一個鍵只能有一個 null 值,多個 null 值會導致執行時錯誤。
Hashtable 不允許鍵和值為 null,嘗試插入 null 值會導致 NullPointerException。
繼承關係:
Hashtable 繼承自 Dictionary 類,而 HashMap 繼承自 AbstractMap 類。
Hashtable 底層實現基於雜湊表加連結串列,而 HashMap 底層實現基於雜湊表。
使用建議:
如果需要執行緒安全,可以使用 ConcurrentHashMap,它提供了更好的效能和併發性。
如果不需要執行緒安全,並且對效率有更高要求,可以選擇使用 HashMap。
24、AOP和ioc的區別
25、注入方式的區別(@Autowird、@Resource)
26、kafka的註解、如何防止訊息丟失
27、建立物件的方式六種
使用new關鍵字。這是最常見和最基本的方式,透過直接呼叫類的構造方法來例項化物件。1234567
使用Class類的newInstance方法。這是反射的一個應用,可以透過類的全限定名獲取Class物件,然後使用其newInstance方法建立物件。但這種方式在Java 9中已不推薦使用,因為它只能呼叫公共的無參建構函式。
使用Constructor類的newInstance方法。這也是反射的應用,可以呼叫任何可見的建構函式,包括帶引數的建構函式。134567
使用clone方法。如果原物件實現了Cloneable介面並重寫了clone()方法,可以呼叫該物件的clone()方法來建立物件的副本。1347
使用序列化和反序列化。透過實現Serializable介面,可以將物件轉換為位元組流(序列化),之後可以從位元組流中重新建立物件(反序列化),這個過程可以用於網路傳輸或持久化物件。
使用第三方庫,如Objenesis。利用位元組碼技術動態生成Constructor類物件,從而建立物件。
28、springmvc的工作流程
使用者傳送請求至前端控制器(DispatcherServlet)。
DispatcherServlet接收請求並處理。
DispatcherServlet查詢處理器對映器(HandlerMapping)找到處理請求的Controller。
DispatcherServlet將請求委託給Controller。
Controller接收請求並處理,處理完成後返回ModelAndView物件。
DispatcherServlet查詢檢視解析器(ViewResolver)根據ModelAndView資訊找到View。
DispatcherServlet將執行結果渲染到View上。
返回響應給使用者。
29、bean的生命週期
30、mybatis的工作原理和操作步驟
MyBatis 是一個優秀的持久層框架,它支援自定義 SQL、儲存過程以及高階對映。MyBatis 消除了幾乎所有的 JDBC 程式碼和引數的手工設定以及結果集的檢索。
工作原理:
配置 MyBatis 配置檔案 (mybatis-config.xml),定義了 MyBatis 的環境配置、事務管理和資料庫連線資訊。
建立對映檔案 (Mapper.xml),包含了 SQL 語句和對映規則。
透過 MyBatis 提供的 SqlSessionFactory 建立 SqlSession。
透過 SqlSession 獲取對映器 (Mapper) 介面的例項。
呼叫對映器介面的方法執行 SQL 操作。
處理結果並返回。
事務提交,關閉 SqlSession。
操作步驟:
新增 MyBatis 依賴到專案中。
配置 mybatis-config.xml 檔案。
建立 Mapper 介面。
建立 Mapper.xml 對映檔案,編寫 SQL 對映。
透過 SqlSessionFactory 獲取 SqlSession。
透過 SqlSession 獲取 Mapper 介面例項並呼叫方法。
提交事務,關閉 SqlSession。
mybatis分頁
分頁可分為邏輯分頁和物理分頁
邏輯分頁是一次性把全部資料查詢載入進記憶體 ,然後再進行分頁。這樣優點是減少IO次數,適合頻繁訪問、資料量少的情況。缺點是不適合大資料量,容易造成記憶體溢位。
物理分頁是利用limit語法在資料庫中進行分頁。他的優點是適合分頁大資料量資料。缺點是頻繁查詢資料庫,消耗效能。
mybatis實現分頁有三種方式
直接使用SQL語句,利用limit關鍵字分頁(物理分頁)
RowBounds(邏輯分頁)
第三方外掛PageHelper(物理分頁)
31、執行緒池七大引數
1、 corePoolSize 執行緒池核心執行緒大小
corePoolSize 是執行緒池中的一個最小的執行緒數量,即使這些執行緒處理空閒狀態,他們也不會被銷燬,除非設定了allowCoreThreadTimeOut。
2、maximumPoolSize 執行緒池最大執行緒數量
執行緒池能夠容納同時執行的最大執行緒數,此值大於等於1。一個任務被提交到執行緒池以後,首先會找有沒有空閒並且存活執行緒,如果有則直接將任務交給這個空閒執行緒來執行,如果沒有則會放到工作佇列中,直到工作佇列滿了,才會建立一個新執行緒,然後從工作佇列的頭部取出一個任務交由新執行緒來處理,而將剛提交的任務放入工作佇列尾部。執行緒池不會無限制的去建立新執行緒,它會有一個最大執行緒數量的限制,這個數量即由maximunPoolSize指定。工作佇列滿,且執行緒數等於最大執行緒數,此時再提交任務則會呼叫拒絕策略。
3、keepAliveTime 多餘的空閒執行緒存活時間
當執行緒空閒時間達到keepAliveTime值時,多餘的執行緒會被銷燬直到只剩下corePoolSize個執行緒為止。預設情況下:只有當執行緒池中的執行緒數大於corePoolSize時keepAliveTime才會起作用,直到執行緒中的執行緒數不大於corepoolSIze,
4、unit 空閒執行緒存活時間單位
keepAliveTime的計量單位
5、workQueue 工作佇列
任務被提交給執行緒池時,會先進入工作佇列,任務排程時再從工作佇列中取出。
常用工作佇列有以下幾種:
①ArrayBlockingQueue(陣列的有界阻塞佇列)
ArrayBlockingQueue 在建立時必須設定大小,按FIFO排序(先進先出)。新任務進來後,會放到該佇列的隊尾,有界的陣列可以防止資源耗盡問題。當執行緒池中執行緒數量達到corePoolSize後,再有新任務進來,則會將任務放入該佇列的隊尾,等待被排程。如果佇列已經是滿的,則建立一個新執行緒,如果執行緒數量已經達到maxPoolSize,則會執行拒絕策略。
②LinkedBlockingQueue(連結串列的無界阻塞佇列)
按 FIFO 排序任務,可以設定容量(有界佇列),不設定容量則預設使用 Integer.Max_VALUE 作為容量 (無界佇列)。該佇列的吞吐量高於 ArrayBlockingQueue。由於該佇列的近似無界性,當執行緒池中執行緒數量達到corePoolSize後,再有新任務進來,會一直存入該佇列,而不會去建立新執行緒直到maxPoolSize,因此使用該工作佇列時,引數maxPoolSize其實是不起作用的。有兩個快捷建立執行緒池的工廠方法 Executors.newSingleThreadExecutor、Executors.newFixedThreadPool,使用了這個佇列,並且都沒有設定容量(無界佇列)。
③SynchronousQueue(一個不快取任務的阻塞佇列)
生產者放入一個任務必須等到消費者取出這個任務。也就是說新任務進來時,不會快取,而是直接被排程執行該任務,如果沒有可用執行緒,則建立新執行緒,如果執行緒數量達到maxPoolSize,則執行拒絕策略。
其 吞 吐 量 通 常 高 於LinkedBlockingQueue。 快捷工廠方法 Executors.newCachedThreadPool 所建立的執行緒池使用此佇列。與前面的佇列相比,這個佇列比較特殊,它不會儲存提交的任務,而是將直接新建一個執行緒來執行新來的任務。
④PriorityBlockingQueue(具有優先順序的無界阻塞佇列)
優先順序透過引數Comparator實現。
⑤DelayQueue(這是一個無界阻塞延遲佇列)
底層基於 PriorityBlockingQueue 實現的,佇列中每個元素都有過期時間,當從佇列獲取元素(元素出隊)時,只有已經過期的元素才會出隊,而佇列頭部的元素是過期最快的元素。快捷工廠方法 Executors.newScheduledThreadPool 所建立的執行緒池使用此佇列。
Java 中的阻塞佇列(BlockingQueue)與普通佇列相比,有一個重要的特點:在阻塞佇列為空時,會阻塞當前執行緒的元素獲取操作。具體來說,在一個執行緒從一個空的阻塞佇列中取元素時,執行緒會被阻塞,直到阻塞佇列中有了元素;當佇列中有元素後,被阻塞的執行緒會自動被喚醒(喚醒過程不需要使用者程式干預)。
6、threadFactory 執行緒工廠
建立一個執行緒工廠用來建立執行緒,可以用來設定執行緒名、是否為daemon執行緒等等
7、handler 拒絕策略
AbortPolicy:丟棄任務並丟擲 RejectedExecutionException 異常。(預設這種)
DiscardPolicy:丟棄任務,但是不丟擲異常
DiscardOldestPolicy:丟棄佇列最前面的任務,然後重新嘗試執行任務(重複此過程) 。也就是當任務被拒絕新增時,會拋棄任務佇列中最舊的任務也就是最先加入佇列的,再把這個新任務從隊尾新增進去,等待執行。
CallerRunsPolicy:誰呼叫,誰處理。由呼叫執行緒(即提交任務給執行緒池的執行緒)處理該任務,如果執行緒池已經被shutdown則直接丟棄
32、資料庫varchar和char的區別
長度固定性。char型別是定長字元型別,其長度是固定的;varchar型別是變長字元型別,其長度是可變的。這意味著,當儲存字串時,char型別會在右側補充空格以達到指定的長度,而varchar型別則僅儲存實際長度的資料。
儲存效率。char型別在修改資料時效率較高,因為它每次修改的資料長度相同;varchar型別在修改資料時效率較低,因為它每次修改的資料長度可能不同。12
儲存空間需求。char型別儲存時會佔用較多的空間,因為它需要儲存初始預計的字串長度加上實際字串長度,並且對於定長欄位,即使實際資料長度小於定義長度,也會補充空格;varchar型別儲存時會佔用較少的空間,它只需要儲存實際字串長度加上實際字串內容。125
適用場景。對於經常修改且長度變化較大的資料,使用varchar型別可能更合適;對於很少變更且長度固定或較短的資料,使用char型別可能更有效。
33、springboot啟動類哪些標籤、如何啟動
Spring Boot啟動類通常使用@SpringBootApplication註解,這是一個組合註解,包含@SpringBootConfiguration(表示這是一個Spring Boot配置類)、@EnableAutoConfiguration(啟用Spring Boot的自動配置機制)以及@ComponentScan(指定Spring掃描的包路徑)。
springboot啟動流程
Spring Boot應用的啟動流程是一個多階段的過程,可以從以下幾個方面進行概述:
初始化配置。啟動過程從`main`方法開始,首先建立一個`SpringApplication`物件。在這個過程中,透過類載入器讀取`classpath`下所有的`spring.factories`配置檔案,建立初始化配置物件。同時,通知監聽器應用程式啟動開始,並建立環境物件`Environment`,用於讀取環境配置,如`application.yml`。12
建立應用程式上下文。接下來建立`ApplicationContext`(應用上下文),這是Spring容器的主要介面,負責管理應用中的bean。
重新整理上下文(啟動核心)。這是啟動過程中的關鍵步驟,包括配置工廠物件、註冊並例項化bean工廠釋出處理器和bean處理器、掃描和解析類、建立bean定義、快取bean類資訊、建立內嵌Web伺服器(如Tomcat)、例項化所有bean、建立動態代理物件等。在此過程中,還會發布通知,表明上下文已重新整理完成。1
通知監聽者。啟動程式完成時,通知所有註冊的監聽者。13
執行應用程式。在所有準備就緒後,Spring Boot應用開始執行。如果是Web應用,此時會啟動內嵌的Web伺服器。24
列印Banner和版本資訊。在啟動過程中,還會列印Spring Boot的啟動Banner和版本資訊。3
記錄啟動時間。使用`StopWatch`例項記錄Spring Boot的啟動時間,以便於分析和除錯。
總結來說,Spring Boot的啟動流程涉及初始化配置、建立應用程式上下文、重新整理上下文、通知監聽者、執行應用程式等多個階段,每個階段都有其特定的任務和目的。
34、迴圈依賴怎麼解決
singletonObjects:這是一級快取,用於儲存已經完全初始化的單例Bean的例項。當Bean建立完成後,它將被放入此快取中,並且可以透過Bean名稱進行訪問。
earlySingletonObjects:這是二級快取,用於儲存已經例項化但尚未完全初始化的單例Bean的例項。當Spring框架檢測到迴圈依賴時,會首先將已例項化但未初始化的Bean放入該快取中,以便後續的依賴注入。一旦所有的依賴都已注入完成,Bean將從此快取中移除,並放入一級快取中。
singletonFactories:這是三級快取,用於儲存Bean的工廠類例項。當Spring框架檢測到迴圈依賴時,會先建立一個Bean的工廠類例項並放入該快取中。這樣,當另一個Bean需要引用該Bean時,可以透過工廠類來獲取例項,並在後續的例項化過程中完成迴圈依賴。
35、
kafka如何防止資料丟失訊息丟失
Kafka 訊息丟失的原因可能有以下幾種:
生產者傳送的訊息未成功寫入Kafka。
Kafka broker在訊息儲存過程中當機或出錯。
Kafka broker處理訊息時出錯,例如訊息格式錯誤。
消費者未正確消費訊息,導致訊息丟失。
為了防止資料丟失,Kafka提供了以下機制:
生產者確認:可以設定acks引數,當設定為all或-1時,只有當Leader和所有的Follower都同步訊息成功後,才認為訊息傳送成功。
複製機制:Kafka透過副本機制保證資料的冗餘儲存,一旦Leader失效,會自動從Follower中選舉新的Leader。
消費者確認:透過offset commit可以確保即使在消費者崩潰的情況下,也可以知道訊息已被消費。
持久化配置:確保broker配置中的log.dirs指向的目錄可靠,且磁碟有足夠的空間和健康狀態。