Kafka 可靠性保障:消息確認與事務機制(二)

Kafka 事務機制

1. 冪等性與事務的關系

在深入探討 Kafka 的事務機制之前,先來了解一下冪等性的概念。冪等性,簡單來說,就是對接口的多次調用所產生的結果和調用一次是一致的。在 Kafka 中,冪等性主要體現在生產者端,用于解決生產者重試時可能出現的消息重復寫入問題。

為了實現冪等性,Kafka 引入了 Producer ID(PID)和序列號(Sequence Number)。每個新的生產者實例在初始化時都會被分配一個唯一的 PID,對于每個 PID,消息發送到的每一個分區都有對應的序列號,這些序列號從 0 開始單調遞增。生產者每發送一條消息,就會將<PID, 分區>對應的序列號的值加 1。Broker 端會在內存中為每一對<PID, 分區>維護一個序列號,當收到消息時,只有當消息的序列號的值比 Broker 端中維護的對應序列號的值大 1 時,Broker 才會接收它;如果序列號相等或小于,說明消息被重復寫入,Broker 可以直接將其丟棄;如果序列號大于當前維護的值超過 1,說明中間有數據尚未寫入,出現了亂序,對應的生產者會拋出OutOfOrderSequenceException異常。

然而,Kafka 的冪等性只能保證單個生產者會話(session)中單分區的冪等,無法滿足跨分區、跨會話的消息處理需求。例如,在一個電商系統中,可能需要同時向 “訂單” 分區和 “庫存” 分區發送消息,以確保訂單創建和庫存扣減這兩個操作的一致性,此時冪等性就顯得力不從心了。而事務機制則可以彌補這一缺陷,它可以保證對多個分區寫入操作的原子性,將一系列消息操作視為一個不可分割的整體,要么全部成功執行,要么全部回滾,從而實現跨分區、跨會話的消息處理一致性 。

2. 事務機制的原理與特性

Kafka 事務機制的核心原理是通過引入事務協調器(Transaction Coordinator)和事務日志(Transaction Log)來實現的。每個 Kafka Broker 都有一個事務協調器組件,負責管理事務的生命周期,維護事務日志(__transaction_state 主題),處理事務超時與恢復等操作。

當生產者開啟事務時,首先會向事務協調器發送InitPidRequest請求,獲取 PID,并建立 PID 與 Transaction ID 的映射關系。Transaction ID 是客戶端配置的唯一標識符,用于標識生產者實例,實現故障恢復后的事務繼續,避免 “僵尸實例”(Zombie instance)問題。同時,事務協調器會為每個事務分配一個唯一的事務 ID,并將事務的初始狀態記錄到事務日志中。

在事務執行過程中,生產者發送的每條消息都會攜帶 Transaction ID、Producer ID 和序列號等信息。消息先寫入本地緩沖區,滿足條件后批量發送到對應分區。分區 Leader 在接收到消息后,會驗證消息的 PID、epoch 和 sequence 等信息,確保消息的合法性和冪等性。此時,消息會暫標記為 “未提交” 狀態。

當生產者執行commitTransaction操作時,事務協調器會執行兩階段提交:第一階段,將事務日志中該事務的狀態設置為PREPARE_COMMIT,并向所有涉及分區寫入PREPARE_COMMIT控制消息,等待所有分區確認;第二階段,在收到所有分區的確認后,事務協調器將狀態改為Complete,寫入COMMIT控制消息到各分區,事務日志更新為完成狀態,釋放所有資源。如果生產者執行abortTransaction操作,事務協調器會將事務狀態改為PreparingAbort,向所有分區寫入ABORT控制消息,分區將丟棄該事務的所有消息,事務日志更新為中止狀態。

Kafka 事務機制具有以下特性:

  • 原子性:事務中的所有操作要么全部成功,要么全部失敗,不存在部分成功、部分失敗的情況,保證了數據的一致性。例如,在一個實時數據處理系統中,從一個 Topic 消費消息,經過處理后寫入另一個 Topic,這一系列操作可以放在一個事務中,確保消費、處理和生產的原子性。
  • 一致性:事務機制確保了在事務執行過程中,即使發生故障,數據也能保持一致狀態。例如,在一個分布式電商系統中,訂單創建和庫存扣減操作在一個事務中,無論出現何種故障,都不會出現訂單創建成功但庫存未扣減,或者庫存扣減了但訂單未創建的不一致情況。
  • 隔離性:Kafka 通過控制消息的可見性,實現了事務的隔離性。消費者只能看到已提交事務的消息,未提交事務的消息對消費者不可見,避免了臟讀問題。
  • 持久性:一旦事務被提交,其結果將持久化保存,即使系統發生故障,也不會丟失已提交的事務數據。

3. 事務的開啟與使用方法

在 Kafka 中,使用事務需要進行以下配置和操作:

  • 生產者配置
 

Properties props = new Properties();

props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");

props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

// 開啟冪等性,事務要求生產者開啟冪等性

props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, "true");

// 設置事務ID,必須唯一

props.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG, "my-transactional-id");

KafkaProducer<String, String> producer = new KafkaProducer<>(props);

  • 初始化事務
 

producer.initTransactions();

  • 開啟事務
 

producer.beginTransaction();

  • 發送消息
 

producer.send(new ProducerRecord<>("test-topic1", "key1", "value1"));

producer.send(new ProducerRecord<>("test-topic2", "key2", "value2"));

  • 提交事務
 

try {

producer.commitTransaction();

} catch (ProducerFencedException e) {

// 處理ProducerFencedException異常,通常是由于生產者實例被認為是“僵尸實例”導致

producer.close();

} catch (KafkaException e) {

// 處理其他Kafka異常,如網絡問題等

producer.abortTransaction();

}

  • 中止事務
 

producer.abortTransaction();

在實際應用中,例如在一個實時數據處理任務中,從 Kafka 的一個 Topic 消費消息,經過業務邏輯處理后,將結果寫入另一個 Topic,并且希望這一系列操作在一個事務中完成,可以參考以下代碼示例:

 

Properties consumerProps = new Properties();

consumerProps.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");

consumerProps.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());

consumerProps.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());

consumerProps.put(ConsumerConfig.GROUP_ID_CONFIG, "my-group-id");

// 關閉自動提交偏移量,因為事務中需要手動控制偏移量提交

consumerProps.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "false");

KafkaConsumer<String, String> consumer = new KafkaConsumer<>(consumerProps);

Properties producerProps = new Properties();

producerProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");

producerProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

producerProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

producerProps.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, "true");

producerProps.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG, "my-transactional-id");

KafkaProducer<String, String> producer = new KafkaProducer<>(producerProps);

producer.initTransactions();

consumer.subscribe(Arrays.asList("input-topic"));

while (true) {

ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));

producer.beginTransaction();

try {

for (ConsumerRecord<String, String> record : records) {

// 處理消息

String processedValue = processMessage(record.value());

producer.send(new ProducerRecord<>("output-topic", processedValue));

}

// 在事務內提交消費偏移量

producer.sendOffsetsToTransaction(consumer.committed(consumer.assignment()), "my-group-id");

producer.commitTransaction();

} catch (ProducerFencedException e) {

producer.abortTransaction();

producer.close();

break;

} catch (KafkaException e) {

producer.abortTransaction();

}

}

4. 事務隔離級別及影響

在 Kafka 消費端,通過isolation.level參數來配置事務隔離級別,該參數有兩個取值:read_uncommitted(默認值)和read_committed。

  • read_uncommitted:在這種隔離級別下,消費端應用可以看到(消費到)未提交的事務,當然對于已提交的事務也是可見的。這意味著,如果生產者開啟事務并向某個分區發送了消息,但尚未提交事務,設置為read_uncommitted的消費者就可以消費到這些消息。這種隔離級別可以實現更低的延遲,因為消費者無需等待事務提交就可以獲取消息,但同時也可能會導致消費者讀取到未提交的事務消息,即 “臟讀”,在一些對數據一致性要求較高的場景中,可能會引發問題。例如,在金融交易系統中,如果消費者讀取到未提交的事務消息并進行了相關處理,可能會導致交易數據的不一致。
  • read_committed:當設置為read_committed時,消費者只能讀取已經提交的事務消息。對于生產者開啟事務后發送的消息,在事務執行commitTransaction()方法之前,設置為read_committed的消費者是消費不到這些消息的。KafkaConsumer 內部會緩存這些消息,直到生產者執行commitTransaction()方法之后,它才會將這些消息推送給消費端應用。如果生產者執行了abortTransaction()方法,那么 KafkaConsumer 會將這些緩存的消息丟棄而不推送給消費端應用。這種隔離級別保證了消費者不會讀取到未提交的事務消息,確保了數據的一致性,但可能會增加一定的延遲,因為消費者需要等待事務提交后才能獲取消息。例如,在電商訂單處理系統中,使用read_committed隔離級別可以保證消費者不會處理到未提交的訂單消息,避免了因訂單狀態不一致而導致的業務錯誤 。

消息確認與事務機制的綜合應用

1. 實際場景中的可靠性保障策略

在實際應用中,消息確認和事務機制常常相互配合,以確保消息的可靠傳輸和處理。以電商訂單處理場景為例,當用戶下單后,訂單系統會生成一條訂單消息,該消息包含訂單的詳細信息,如訂單編號、商品列表、用戶信息等。訂單系統作為 Kafka 的生產者,需要將這條訂單消息發送到 Kafka 集群。

為了確保訂單消息不丟失,生產者可以將 ACK 級別設置為 acks=all,這樣只有當 ISR 中的所有副本都成功寫入消息后,生產者才會收到確認,從而保證了消息在 Kafka 集群中的持久性。同時,為了保證訂單處理的原子性,即訂單創建和庫存扣減這兩個操作要么都成功,要么都失敗,可以使用 Kafka 的事務機制。生產者開啟事務后,先發送訂單消息到 “訂單” 分區,再發送庫存扣減消息到 “庫存” 分區,最后提交事務。如果在事務執行過程中出現任何異常,生產者可以中止事務,確保不會出現訂單創建成功但庫存未扣減,或者庫存扣減了但訂單未創建的不一致情況。

在金融交易場景中,每一筆交易都涉及資金的轉移,對數據的準確性和可靠性要求極高。當用戶進行一筆轉賬操作時,轉賬系統會生成兩條消息,一條是從轉出賬戶扣除相應金額的消息,另一條是向轉入賬戶增加相應金額的消息。這兩條消息需要在一個事務中處理,以保證資金的一致性。生產者開啟事務后,依次發送這兩條消息到對應的分區,然后提交事務。在這個過程中,通過設置 ACK 級別為 acks=all,確保消息在 Kafka 集群中的可靠存儲,同時利用事務機制保證了轉賬操作的原子性,避免了資金丟失或錯誤轉移的情況發生 。

2. 配置優化與性能平衡

在實際應用中,配置優化是實現可靠性和性能平衡的關鍵。對于 ACK 級別,雖然 acks=all 提供了最高的可靠性,但由于需要等待所有副本的確認,會導致消息發送的延遲增加,吞吐量降低。因此,在一些對性能要求較高且可以容忍少量數據丟失的場景中,可以選擇 acks=1,在保證一定可靠性的同時,提高系統的性能。

對于事務機制,雖然它保證了數據的一致性,但事務的開啟、提交和回滾操作都會帶來一定的性能開銷。因此,在使用事務時,需要根據業務需求謹慎選擇事務的范圍,避免不必要的事務操作。例如,在一個實時數據處理任務中,如果可以將一些獨立的消息處理操作拆分成多個小事務,而不是將所有操作都放在一個大事務中,這樣可以減少事務的持續時間,提高系統的并發處理能力。

此外,還可以通過調整 Kafka 的其他參數來優化性能,如生產者的緩沖區大小、批量發送的消息數量、消費者的拉取頻率等。在一個高并發的日志收集系統中,可以適當增大生產者的緩沖區大小和批量發送的消息數量,減少網絡請求的次數,提高消息發送的效率;同時,合理調整消費者的拉取頻率,避免消費者因為頻繁拉取消息而占用過多的系統資源 。

總結與展望

1. 關鍵要點回顧

Kafka 的消息確認機制和事務機制是其確保消息可靠性的核心組件。消息確認機制中的 ACK 機制,通過設置不同的確認級別(acks=0、acks=1、acks=all),讓開發者能夠在消息可靠性和系統性能之間進行靈活權衡。acks=0 提供了極高的吞吐量,但犧牲了消息可靠性;acks=1 在一定程度上保證了可靠性,同時維持了較好的性能;acks=all 則提供了最高的可靠性,確保消息不會丟失,但相應地會增加延遲和降低吞吐量。

事務機制則是 Kafka 實現跨分區、跨會話消息處理一致性的關鍵。通過引入事務協調器和事務日志,Kafka 能夠將一系列消息操作視為一個原子事務,保證了事務的原子性、一致性、隔離性和持久性。事務機制依賴于冪等性,通過 PID 和序列號確保了消息的冪等性,避免了消息的重復寫入。同時,事務機制通過兩階段提交協議,保證了事務的原子性和一致性,通過控制消息的可見性實現了隔離性,通過事務日志的持久化保證了持久性。

在實際應用中,消息確認機制和事務機制常常相互配合,根據不同的業務場景和需求,選擇合適的配置和策略,以實現消息的可靠傳輸和處理。例如,在電商訂單處理場景中,通過設置 acks=all 和使用事務機制,確保了訂單消息的可靠傳輸和訂單處理的原子性,避免了訂單丟失和數據不一致的問題。

2. 未來發展趨勢探討

隨著分布式系統和大數據技術的不斷發展,Kafka 在可靠性保障方面有望迎來更多的創新和優化。在分布式事務方面,Kafka 可能會進一步完善其事務機制,提高事務的處理效率和性能,支持更復雜的分布式事務場景。例如,未來 Kafka 或許能夠更好地與其他分布式系統進行集成,實現跨系統的事務一致性,為企業級應用提供更強大的數據一致性保障。

性能優化也是 Kafka 未來發展的重要方向之一。Kafka 可能會通過優化消息的存儲和傳輸方式,減少消息確認和事務處理的延遲,提高系統的整體吞吐量。例如,采用更高效的存儲引擎,優化網絡傳輸協議,以及改進副本同步機制等,都有望提升 Kafka 在可靠性保障下的性能表現。

隨著云原生技術的興起,Kafka 在云環境中的部署和應用也將越來越廣泛。未來,Kafka 可能會進一步加強對云原生架構的支持,提供更便捷的云原生部署和管理方案,更好地利用云資源的優勢,實現彈性擴展和高可用性,為用戶提供更可靠、高效的消息處理服務。

Kafka 的消息確認與事務機制為其在分布式系統中的可靠性保障奠定了堅實的基礎,而未來的發展趨勢也將使其在不斷變化的技術環境中持續保持領先地位,為大數據和實時數據處理領域提供更強大的支持 。

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

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

相關文章

使用 React.Children.map遍歷或修改 children

使用場景&#xff1a; 需要對子組件進行統一處理&#xff08;如添加 key、包裹額外元素、過濾特定類型等&#xff09;。 動態修改 children 的 props 或結構。 示例代碼&#xff1a;遍歷并修改 children import React from react;// 一個組件&#xff0c;給每個子項添加邊框…

智能體三階:LLM→Function Call→MCP

哈嘍&#xff0c;我是老劉 老劉是個客戶端開發者&#xff0c;目前主要是用Flutter進行開發&#xff0c;從Flutter 1.0開始到現在已經6年多了。 那為啥最近我對MCP和AI這么感興趣的呢&#xff1f; 一方面是因為作為一個在客戶端領域實戰多年的程序員&#xff0c;我覺得客戶端開發…

flutter的常規特征

前言 Flutter 是由 Google 開發的開源 UI 軟件開發工具包&#xff0c;用于構建跨平臺的高性能、美觀且一致的應用程序。 一、跨平臺開發能力 1.多平臺支持&#xff1a;Flutter 支持構建 iOS、Android、Web、Windows、macOS 和 Linux 應用&#xff0c;開發者可以使用一套代碼庫在…

【Git】代碼托管服務

博主&#xff1a;&#x1f44d;不許代碼碼上紅 歡迎&#xff1a;&#x1f40b;點贊、收藏、關注、評論。 格言&#xff1a; 大鵬一日同風起&#xff0c;扶搖直上九萬里。 文章目錄 Git代碼托管服務概述Git核心概念主流Git托管平臺Git基礎配置倉庫創建方式Git文件狀態管理常用…

Android 網絡請求的選擇邏輯(Connectivity Modules)

代碼分析 ConnectivityManager packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java 許多APN已經棄用,應用層統一用 requestNetwork() 來請求網絡。 [ConnectivityManager] example [ConnectivityManager] requestNetwork() [Connectivi…

C#建立與數據庫連接(版本問題的解決方案)踩坑總結

1.如何優雅的建立數據庫連接 今天使用這個deepseek寫代碼&#xff0c;主要就是建立數據庫的鏈接&#xff0c;包括這個建庫建表啥的都是他整得&#xff0c;我就是負責執行&#xff0c;然后解決這個里面遇到的一些問題&#xff1b; 其實我學習這個C#不過是短短的4天的時間&…

FastAPI的初步學習(Django用戶過來的)

我一直以來是Django重度用戶。它有清晰的MVC架構模式、多應用組織結構。它內置用戶認證、數據庫ORM、數據庫遷移、管理后臺、日志等功能&#xff0c;還有強大的社區支持。再搭配上Django REST framework (DRF) &#xff0c;開發起來效率極高。主打功能強大、易于使用。 曾經也…

提升IT運維效率 貝銳向日葵推出自動化企業腳本功能

在企業進行遠程IT運維管理的過程中&#xff0c;難免會涉及很多需要批量操作下發指令的場景&#xff0c;包括但不限于下列場景&#xff1a; ● ?規模設備部署與初始化、設備配置更新 ● 業務軟件安裝與系統維護&#xff0c;進行安全加固或執行問題修復命令 ● 遠程設備監控與…

最簡單的遠程桌面連接方法是什么?系統自帶內外網訪問實現

在眾多遠程桌面連接方式中&#xff0c;使用 Windows 系統自帶的遠程桌面連接功能是較為簡單的方法之一&#xff0c;無論是在局域網內還是通過公網進行遠程連接&#xff0c;都能輕松實現。 一、局域網內連接步驟 1、 開啟目標計算機遠程桌面功能&#xff1a;在目標計算機&…

JVM(2)——垃圾回收算法

本文將穿透式解析JVM垃圾回收核心算法&#xff0c;涵蓋7大基礎算法4大現代GC實現3種內存分配策略&#xff0c;通過15張動態示意圖GC日志實戰分析&#xff0c;帶您徹底掌握JVM內存自動管理機制。 一、GC核心概念體系 1.1 對象存亡判定法則 引用計數法致命缺陷&#xff1a; // …

基于Spring Boot+Vue的“暖寓”宿舍管理系統設計與實現(源碼及文檔)

基于Spring BootVue的“暖寓”宿舍管理系統設計與實現 第 1 章 緒論 1.1 論文研究主要內容 1.1.1 系統概述 1.1.2 系統介紹 1.2 國內外研究現狀 第 2 章 關鍵技術介紹 2.1 關鍵性開發技術的介紹 2.1.1 Java簡介 2.1.2 Spring Boot框架 2.2 其他相關技術 2.2.1 Vue.J…

基于Java的不固定長度字符集在指定寬度和自適應模型下圖片繪制生成實戰

目錄 前言 一、需求介紹 1、指定寬度生成 2、指定列自適應生成 二、Java生成實現 1、公共方法 2、指定寬度生成 3、指定列自適應生成 三、總結 前言 在當今數字化與信息化飛速發展的時代&#xff0c;圖像的生成與處理技術正日益成為眾多領域關注的焦點。從創意設計到數…

軟考 系統架構設計師系列知識點之雜項集萃(93)

接前一篇文章&#xff1a;軟考 系統架構設計師系列知識點之雜項集萃&#xff08;92&#xff09; 第169題 人工智能技術已成為當前國際科技競爭的核心技術之一&#xff0c;AI芯片是占據人工智能市場的法寶。AI芯片有別于通常處理器芯片&#xff0c;它應具備四種關鍵特征。&…

Kotlin實現文件下載斷點續傳(RandomAccessFile全解析)

本文將深入探討如何使用Kotlin和RandomAccessFile實現高效的斷點續傳功能&#xff0c;涵蓋原理分析、完整代碼實現、性能優化及工程實踐要點。 一、斷點續傳核心原理 1.1 HTTP斷點續傳協議 #mermaid-svg-EfmgPUx3SFkso8Fc {font-family:"trebuchet ms",verdana,aria…

linux-headers-$(uname -r)和kmod是什么?

2025年6月16日&#xff0c;周一清晨 Linux-headers-$(uname -r)與kmod包詳解 一、linux-headers-$(uname -r)包 linux-headers-(uname -r)是Linux系統中與當前運行內核版本匹配的內核頭文件包&#xff0c;其中(uname -r)會自動替換為當前內核版本號&#xff08;如5.13.0-19-g…

使用axios及和spirng boot 交互

Axios Axios是一個基于Promise的HTTP庫&#xff0c;可以發送get、post等請求&#xff0c;它作用于瀏覽器和Node.js中。當運行在瀏覽器時&#xff0c;使用XMLHttpRequest接口發送請求&#xff1b;當運行在Node.js時&#xff0c;使用HTTP對象發送請求。 使用步驟&#xff1a; 第…

布局文件的逐行詳細解讀

總覽 源碼 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto&…

VTK 顯示大量點云數據及交互(點云拾取、著色、測量等)功能

VTK (Visualization Toolkit) 是一個強大的開源可視化庫&#xff0c;非常適合處理點云數據。下面將介紹如何使用 VTK 顯示大量點云數據&#xff0c;并實現點云拾取、著色、測量等功能。 基本點云顯示 創建一個基本的點云顯示程序&#xff1a; cpp #include <vtkSmartPoi…

性能優化 - 高級進階: 性能優化全方位總結

文章目錄 Pre1. 概述&#xff1a;性能優化提綱與使用場景2. 準備階段2.1 明確優化范圍與目標2.2 環境與工具準備 3. 數據收集與指標確認3.1 關鍵資源維度與指標項3.2 監控體系搭建與初始采集3.3 日志與追蹤配置 4. 問題定位思路4.1 從整體到局部的分析流程4.2 常見瓶頸維度檢查…

Mybatis之Integer類型字段為0,入庫為null

背景&#xff1a; 由于項目某個功能用到優先級字段來判斷&#xff0c;需要在mysql表中定義一個字段XX&#xff0c;類型為int&#xff0c;默認為0&#xff0c;具體值由后臺配置&#xff0c;正常入庫即可 問題&#xff1a; 由于后臺配置存量其他類型的數據無需該字段&#xff0c…