Kafka——請求是怎么被處理的?

引言

在分布式消息系統中,請求處理機制是連接客戶端與服務端的"神經中樞"。無論是生產者發送消息、消費者拉取數據,還是集群內部的元數據同步,都依賴于高效的請求處理流程。Apache Kafka作為高性能消息隊列的代表,其請求處理機制經過多版本迭代,形成了一套兼顧吞吐量與可靠性的成熟架構。

Kafka的客戶端(生產者、消費者)與Broker之間、Broker與Broker之間的所有交互,均通過請求/響應(Request/Response)模式完成。從客戶端視角看,常見的請求包括生產消息的PRODUCE請求、消費消息的FETCH請求、獲取集群信息的METADATA請求等;從Broker視角看,還存在大量內部請求,如副本同步的FETCH請求、Leader選舉的LeaderAndIsr請求等。總之,Kafka定義了很多類似的請求格式,而這些請求均通過TCP網絡以Socket的方式進行通訊的

理解Kafka的請求處理流程,不僅能幫助我們排查生產環境中的性能瓶頸(如請求超時、處理延遲),更能為集群調優提供理論依據。本文將從請求處理的基本方案入手,深入剖析Kafka基于Reactor模式的實現細節,詳解延時請求處理機制,并探討數據類與控制類請求的分離設計,最終給出實用的優化建議。

請求處理的基礎方案:從 naive 到高效

在設計請求處理機制時,最簡單的思路往往存在明顯缺陷。Kafka在演進過程中,摒棄了兩種基礎方案,最終選擇了Reactor模式。理解這兩種方案的局限性,能更好地體會Kafka設計的精妙之處。

方案一:順序處理請求

順序處理是最直觀的方案:Broker以串行方式接收并處理請求,一個請求處理完畢后再處理下一個。

其偽代碼如下:

while (true) {Request request = accept(connection); ?// 接收請求handle(request); ? ? ? ? ? ? ? ? ? ? ? // 處理請求
}

優點:實現簡單,無需考慮線程安全問題。

缺陷:吞吐量極低。每個請求必須等待前一個請求完成,無法利用多核CPU資源,在高并發場景下會導致請求堆積,延遲飆升。

這種方案僅適用于請求頻率極低的場景(如單機工具類應用),完全無法滿足Kafka的高吞吐需求。

方案二:每個請求一個線程

為解決順序處理的性能問題,另一種方案是為每個請求創建獨立線程異步處理,偽代碼如下:

while (true) {Request request = accept(connection); ?// 接收請求new Thread(() -> handle(request)).start(); ?// 新線程處理
}

優點:并發處理請求,吞吐量較順序處理有顯著提升。

缺陷:資源消耗極大。線程創建與銷毀的開銷昂貴,在高并發下(如每秒數萬請求),線程數量會急劇膨脹,導致CPU上下文切換頻繁、內存占用過高,甚至可能壓垮整個服務。

這種方案適用于請求頻率低、處理邏輯復雜的場景,但仍不符合Kafka的高性能需求。

為何選擇Reactor模式?

Kafka最終采用Reactor模式,其核心思想是事件驅動+線程池:通過一個或多個線程監聽事件(如請求到達),并將事件分發到工作線程池處理。

這種模式的優勢在于:

  1. 高效利用線程資源:通過線程池復用線程,避免頻繁創建銷毀線程的開銷。

  2. 支持高并發:事件驅動模型可同時處理大量連接,適合Kafka的多客戶端場景。

  3. 靈活擴展:可根據請求類型和系統負載動態調整線程池大小。

Reactor模式是高性能網絡編程的經典范式,被廣泛應用于Netty、Nginx等框架,Kafka對其進行了針對性優化,形成了獨特的請求處理架構。

Kafka的Reactor模式實現:從請求接收到響應返回

Kafka的Broker端請求處理架構基于Reactor模式擴展,主要包含SocketServerAcceptor線程網絡線程池IO線程池等組件。這些組件協同工作,完成請求的接收、分發、處理與響應。

核心組件與職責

1. SocketServer:請求處理的"總調度室"

SocketServer是Kafka Broker處理網絡請求的入口組件,負責管理所有網絡連接和線程資源。它包含兩個關鍵部分:

  • Acceptor線程:監聽客戶端連接,接收新請求并分發到網絡線程。

  • 網絡線程池:處理請求的初步解析,將請求放入共享隊列。

2. Acceptor線程:請求分發的"交通警察"

Acceptor線程是單線程的,其主要職責是:

  • 監聽指定端口(如默認9092)的TCP連接請求。

  • 通過輪詢(Round-Robin)策略將請求公平地分發到網絡線程池中的線程,避免請求處理傾斜。

輪詢策略的優勢在于實現簡單且公平,確保每個網絡線程處理的請求量大致均衡。

3. 網絡線程池:請求的"初步處理中心"

網絡線程池由num.network.threads參數控制(默認3個線程),其職責包括:

  • 從Acceptor線程接收請求,進行初步解析(如驗證請求格式)。

  • 將解析后的請求放入共享請求隊列,等待IO線程處理。

  • 接收IO線程返回的響應,并將其發送回客戶端。

網絡線程不執行具體的業務邏輯,僅負責請求的轉發,因此非常輕量。

4. IO線程池:請求處理的"主力部隊"

IO線程池由num.io.threads參數控制(默認8個線程),是執行請求處理邏輯的核心組件:

  • 從共享請求隊列中取出請求,執行具體處理(如PRODUCE請求寫入磁盤、FETCH請求讀取數據)。

  • 處理完成后,將響應放入對應網絡線程的響應隊列

  • 對于無法立即處理的請求(如延時請求),將其暫存到Purgatory組件。

IO線程直接操作磁盤和頁緩存,其數量應根據CPU核心數和IO密集程度調整(如SSD可適當增加線程數)。

5. 共享請求隊列與響應隊列:請求流轉的"緩沖區"

  • 共享請求隊列:所有網絡線程共享的隊列,用于暫存待處理的請求。其作用是平衡網絡線程與IO線程的處理速度,避免IO線程忙碌時網絡線程阻塞。

  • 響應隊列:每個網絡線程專屬的隊列,用于存放IO線程返回的響應。由于每個請求由固定的網絡線程負責回傳,響應隊列無需共享,減少了線程同步開銷。

請求處理全流程:以PRODUCE請求為例

假設生產者發送一條消息到Kafka Broker,請求處理流程如下:

  1. 請求接收:Acceptor線程監聽端口,接收到PRODUCE請求后,通過輪詢策略將其分配給某個網絡線程。

  2. 初步解析:網絡線程解析請求內容(如主題、分區、消息體),驗證格式合法性后,將請求放入共享請求隊列。

  3. 業務處理:IO線程從共享隊列取出請求,執行消息寫入邏輯:

    • 檢查分區Leader副本是否在當前Broker。

    • 將消息追加到分區的日志文件(先寫入頁緩存,再異步刷盤)。

    • 若設置acks=all,等待ISR中所有副本同步完成。

  4. 響應生成:IO線程處理完成后,生成包含"成功/失敗"狀態的響應,放入對應網絡線程的響應隊列。

  5. 響應發送:網絡線程從響應隊列取出響應,通過TCP連接發送回生產者客戶端。

整個流程通過多線程協作實現了高并發處理,每個組件專注于單一職責,避免了資源競爭和性能瓶頸。

線程池參數調優建議

Kafka的請求處理性能與線程池參數密切相關,合理配置可顯著提升吞吐量:

  • num.network.threads:默認3,建議根據客戶端連接數調整。連接數多時(如 thousands)可增至5-8。

  • num.io.threads:默認8,建議設置為CPU核心數的1-2倍(如16核CPU可設為16-32)。IO密集型場景(如機械硬盤)可適當增加,CPU密集型場景(如壓縮消息處理)可減少。

調優原則:通過壓測觀察線程使用率(如通過JMX監控kafka.network:type=SocketServer,name=NetworkProcessorAvgIdlePercent),確保線程不過載(使用率70%以下為宜)。

延時請求處理:Purgatory組件的"等待藝術"

并非所有請求都能被立即處理,某些請求需要滿足特定條件后才能完成(如acks=all的PRODUCE請求需等待所有ISR副本同步)。Kafka通過Purgatory組件(意為"煉獄")管理這類延時請求,確保其在條件滿足時被喚醒處理。

延時請求的典型場景

  1. acks=all的PRODUCE請求:需等待ISR中所有副本確認接收消息,若副本同步未完成,請求被暫存到Purgatory。

  2. 帶條件的FETCH請求:消費者設置fetch.min.bytes(如1KB),若服務器緩存的消息不足,請求會被延遲處理,直到數據量滿足條件或超時。

  3. LeaderAndIsr請求:副本同步過程中,若Leader副本未就緒,請求會被暫時掛起。

Purgatory的工作原理

Purgatory本質是一個延時請求管理器,其核心機制包括:

  1. 請求暫存:當請求無法立即處理時,IO線程將其放入Purgatory的優先級隊列(按超時時間排序)。

  2. 條件監聽:Purgatory為每個請求注冊觸發條件(如ISR副本同步完成、消息量達標)。

  3. 定時檢查與喚醒:Purgatory定期(默認100ms)檢查隊列中的請求,若條件滿足或超時,將請求取出并交由IO線程繼續處理。

  4. 響應生成:處理完成后,響應被放入網絡線程的響應隊列,最終返回給客戶端。

這種機制避免了IO線程的阻塞等待,提高了線程利用率。例如,對于acks=all的請求,IO線程無需原地等待副本同步,而是將請求交給Purgatory后繼續處理其他請求,待同步完成后再喚醒處理。

延時請求的超時配置

延時請求的最大等待時間由相關參數控制,例如:

  • request.timeout.ms:客戶端設置的請求超時時間(默認30秒),若超過此時長請求未完成,客戶端會認為失敗。

  • replica.lag.time.max.ms:副本同步的最大延遲時間(默認10秒),影響ISR集合調整,間接影響acks=all請求的處理。

合理設置超時參數可平衡可靠性與延遲:核心業務可適當延長超時時間(如60秒),非核心業務可縮短(如10秒)以快速失敗。

數據類與控制類請求:分離處理的必要性

Kafka的請求按功能可分為數據類請求控制類請求,兩者特性差異顯著,需要不同的處理策略。社區在2.3版本實現了兩類請求的分離處理,解決了此前混合處理的性能問題。

兩類請求的核心差異

類型示例特點處理優先級
數據類請求PRODUCE、FETCH頻率高、處理耗時(IO密集)、影響用戶體驗
控制類請求LeaderAndIsr、StopReplica頻率低、處理快(CPU密集)、影響集群穩定性

控制類請求雖然數量少,但直接影響集群元數據(如Leader副本切換、副本下線),若處理不及時,可能導致數據類請求失效或做無用功。

混合處理的問題:控制類請求被"餓死"

在2.3版本之前,兩類請求共用一套處理組件,可能出現以下問題:

  1. 控制類請求延遲:當Broker積壓大量PRODUCE請求時,LeaderAndIsr等控制類請求需排隊等待,導致集群狀態更新不及時。例如,Leader副本故障后,新Leader選舉的請求被延遲,會造成分區長時間不可用。

  2. 數據類請求無效化:若控制類請求(如LeaderAndIsr)處理延遲,期間處理的PRODUCE請求可能因Leader切換而失效,導致客戶端重試,浪費資源。

  3. 主題刪除卡頓:刪除主題時,StopReplica請求若被數據類請求阻塞,會導致主題刪除操作長時間無響應。

分離處理的實現:兩套組件,獨立端口

為解決上述問題,Kafka 2.3版本引入了請求分離機制,核心設計是:

  1. 兩套獨立組件:為數據類和控制類請求分別創建網絡線程池和IO線程池,避免資源競爭。

  2. 獨立端口監聽:通過listeners配置不同端口(如9092處理數據請求,9093處理控制請求),客戶端根據請求類型連接對應端口。

  3. 隔離處理流程:兩類請求的接收、解析、處理完全隔離,控制類請求無需等待數據類請求完成。

這種設計確保了控制類請求的優先處理,提升了集群的穩定性和響應速度。

為何不采用優先級隊列?

社區曾考慮過用優先級隊列(控制類請求優先級高)處理兩類請求,但最終否決,原因是:

  1. 隊列滿時失效:當請求隊列已滿,即使控制類請求優先級高,也無法放入隊列,仍會被阻塞。

  2. 實現復雜:優先級隊列需要額外的同步機制,可能引入性能開銷。

  3. 隔離性不足:共用隊列仍可能受數據類請求的突發流量影響。

相比之下,兩套組件的方案雖然增加了資源占用,但實現簡單、隔離性強,更符合Kafka的設計哲學。

實戰:請求處理相關的問題排查與優化

理解請求處理機制后,可針對性地排查生產環境中的常見問題,并通過參數調優提升性能。

常見問題與解決方案

1. 請求超時(Request Timeout)

現象:客戶端頻繁報TimeoutException,如"Timeout after 30000ms of waiting for the response"。 可能原因

  • 網絡線程或IO線程池過載,請求處理延遲。

  • 共享請求隊列滿,新請求無法入隊。

  • 延時請求在Purgatory中等待超時。

解決方案

  • 監控線程池使用率(如kafka.network:type=SocketServer,name=NetworkProcessorAvgIdlePercent),若空閑率低(<20%),增加num.network.threadsnum.io.threads

  • 調整queue.buffering.max.bytes增大請求隊列容量(默認64MB)。

  • 檢查Purgatory中延時請求的觸發條件(如ISR副本是否正常同步)。

2. 處理延遲飆升(High Request Latency)

現象:請求平均處理時間(如kafka.network:type=RequestMetrics,name=TotalTimeMs,request=Produce)突然增大。 可能原因

  • IO線程處理瓶頸(如磁盤IO繁忙)。

  • 大量延時請求占用Purgatory資源。

  • 控制類請求與數據類請求混合處理導致阻塞(2.3版本前)。

解決方案

  • 更換更快的存儲介質(如機械硬盤換SSD)。

  • 減少acks=all的使用場景,或降低min.insync.replicas

  • 升級Kafka至2.3+版本,啟用請求分離機制。

3. 連接數過高(Too Many Connections)

現象:Broker報"too many open files"錯誤,或netstat顯示大量ESTABLISHED連接。 可能原因

  • 客戶端未正確關閉連接,導致連接泄漏。

  • 網絡線程數不足,無法及時處理連接釋放。

解決方案

  • 客戶端設置合理的connections.max.idle.ms(默認9分鐘),自動關閉閑置連接。

  • 增加num.network.threads,提高連接處理能力。

  • 調整操作系統文件描述符限制(如ulimit -n 65535)。

性能優化最佳實踐

  1. 線程池參數調優

    • 網絡線程數:根據客戶端連接數調整,每1000個連接對應1-2個線程。

    • IO線程數:設置為CPU核心數的1-1.5倍,避免線程過多導致的上下文切換。

  2. 請求隊列配置

    • queued.max.requests:控制共享請求隊列的最大請求數(默認500),過小可能導致請求被拒絕,過大會增加內存占用,建議根據內存大小調整(如1000-2000)。

  3. 分離數據與控制請求

    • 升級至Kafka 2.3+,配置listeners分離端口(如PLAINTEXT://:9092,CONTROL://:9093),并通過inter.broker.listener.name指定控制請求端口。

  4. 監控關鍵指標

    • 請求吞吐量:kafka.network:type=RequestMetrics,name=RequestsPerSec

    • 平均處理時間:kafka.network:type=RequestMetrics,name=TotalTimeMs

    • 線程池空閑率:kafka.network:type=SocketServer,name=NetworkProcessorAvgIdlePercent

總結

Kafka的請求處理機制是其高性能、高可靠性的基石,通過Reactor模式實現了高并發處理,通過Purgatory組件管理延時請求,通過請求分離機制保障了集群穩定性。

其設計理念可總結為:

  1. 職責分離:Acceptor、網絡線程、IO線程各司其職,避免功能耦合。

  2. 異步非阻塞:通過事件驅動和線程池,最大化利用系統資源。

  3. 動態調整:線程池大小、隊列容量等參數可根據負載動態優化。

  4. 隔離優先:數據類與控制類請求分離,確保核心控制流程不受業務流量影響。

  • Acceptor線程:采用輪詢的方式將入站請求公平地發到所有網絡線程中。
  • 網絡線程池:處理數據類請求。網絡線程拿到請求后,將請求放入到共享請求隊列中。
  • IO線程池:處理控制類請求。從共享請求隊列中取出請求,執行真正的處理。如果是PRODUCE生產請求,則將消息寫入到底層的磁盤日志中;如果是FETCH請求,則從磁盤或頁緩存中讀取消息。
  • Purgatory組件:用來緩存延時請求。延時請求就是那些一時未滿足條件不能立刻處理的請求。

理解這套機制,不僅能讓我們更好地使用Kafka,更能為分布式系統的請求處理設計提供借鑒。在實際應用中,需結合業務場景合理配置參數,并通過監控及時發現并解決性能瓶頸,讓Kafka在高并發場景下持續穩定運行。

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

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

相關文章

區塊鏈技術如何確保智能合約的安全性和可靠性?

智能合約作為區塊鏈上自動執行的可編程協議&#xff0c;其安全性和可靠性直接決定了區塊鏈應用的信任基礎。區塊鏈通過底層技術架構、密碼學工具和機制設計的多重保障&#xff0c;構建了智能合約的安全防線。以下從技術原理、核心機制和實踐保障三個維度展開分析&#xff1a;一…

2020 年 NOI 最后一題題解

問題描述2020 年 NOI 最后一題是一道結合圖論、動態規劃與狀態壓縮的綜合性算法題&#xff0c;題目圍繞 "疫情期間的物資配送" 展開&#xff0c;具體要求如下&#xff1a;給定一個有向圖 G (V, E)&#xff0c;其中節點代表城市&#xff0c;邊代表連接城市的道路。每個…

加密與安全

目錄 一、URL編碼&#xff1a; 二、Base64編碼&#xff1a; 三、哈希算法&#xff1a; 四、Hmac算法&#xff1a; 五、對稱加密算法&#xff1a; 一、URL編碼&#xff1a; URL編碼是瀏覽器發送數據給服務器時使用的編碼&#xff0c;它通常附加在URL的參數部分。之所以需要…

EasyExcel 公式計算大全

EasyExcel 是基于 Apache POI 的封裝&#xff0c;主要專注于簡化 Excel 的讀寫操作&#xff0c;對于公式計算的支持相對有限。以下是 EasyExcel 中處理公式計算的全面指南&#xff1a;1. 基本公式寫入1.1 寫入簡單公式Data public class FormulaData {ExcelProperty("數值…

2025年AI+數模競賽培訓意見征集-最后一輪

在過去幾天的“AI時代下2025年數模競賽培訓課程需求調研緊急征集”我們收到了大量老師、學生的反饋。我們通過大家的實際需求&#xff0c;編寫了下述2025年AI時代下最新的數學建模競賽教學課程課程表&#xff0c;具體授課內容以及相關課件、支撐材料都將會免費發布&#xff0c;…

Qwen2 RotaryEmbedding 位置編碼僅僅是第一層有嗎

Qwen2 RotaryEmbedding 位置編碼僅僅是第一層有嗎,還是全部層都有 Qwen2 模型中的 Rotary Embedding(旋轉位置編碼)是應用于所有 Transformer 層 的,而非僅第一層。 1. Transformer 架構的核心邏輯 Qwen2 基于 Decoder-only Transformer 架構,而位置編碼(如 Rotary Emb…

CNN卷積神經網絡之LeNet和AlexNet經典網絡模型(三)

CNN卷積神經網絡之LeNet和AlexNet經典網絡模型&#xff08;三&#xff09; 文章目錄CNN卷積神經網絡之LeNet和AlexNet經典網絡模型&#xff08;三&#xff09;深度學習兩大經典 CNN 模型速覽1. LeNet-5&#xff1a;CNN 的開山之作&#xff08;1998&#xff09;2. AlexNet&#…

江協科技STM32 12-2 BKP備份寄存器RTC實時時鐘

這一節我們要講的主要內容是RTC實時時鐘&#xff0c;實時時鐘本質上是一個定時器&#xff0c;但是這個定時器是專門用來產生年月日時分秒&#xff0c;這種日期和時間信息的。所以學會了STM32的RTC就可以在STM32內部擁有一個獨立運行的鐘表。想要記錄或讀取日期和時間&#xff0…

【10】大恒相機SDK C++開發 ——對相機采集的原圖像數據IFrameData裁剪ROI 實時顯示在pictureBox中,3種方法實現(效率不同)

文章目錄1 在回調函數中實現2 獨立封裝調用2.1 獲取圖像寬、高、pBuffer、channel2.2 內存圖像數據截取ROI并顯示2.3 回調函數調用3 for循環嵌套 方法24 for循環嵌套 方法35 按行復制數據提高效率&#xff0c;但很耗內存6 unsafe代碼 解釋及注意事項 看我另一篇文章7 ConvertTo…

ubuntu22.04系統入門 linux入門(二) 簡單命令 多實踐以及相關文件管理命令

以下有免費的4090云主機提供ubuntu22.04系統的其他入門實踐操作 地址&#xff1a;星宇科技 | GPU服務器 高性能云主機 云服務器-登錄 相關兌換碼星宇社區---4090算力卡免費體驗、共享開發社區-CSDN博客 之所以推薦給大家使用&#xff0c;是因為上面的云主機目前是免費使用的…

分布式ID方案(標記)

一、參考文章-標記 分布式ID方案有哪些&#xff1f;雪花算法如何搞定時鐘回撥和動態機器ID&#xff1f; 二、應用 1.百度 uid-generator github項目地址 原理參考 2.百度 uid-generator 擴展應用 燈官網 燈 項目代碼 lamp-util 單元模塊 lamp-util 單元模塊子模塊 lamp-…

std::map 加鎖

在并發環境下使用std::map&#xff0c;必須采取同步措施。 在并發環境下對 std::map 進行不加鎖的讀寫操作會導致嚴重的線程安全問題&#xff0c;主要會產生以下幾種問題&#xff1a; ?? 主要風險與后果數據競爭&#xff08;Data Race&#xff09; 當多個線程同時修改同一個鍵…

學習筆記090——Ubuntu 中 UFW 防火墻的使用

文章目錄1、允許特定的端口訪問2、允許特定 IP 訪問某個端口3、允許某個范圍的端口4、查看 UFW 狀態5、重新加載 UFW6、啟用 UFW7、關閉 UFW1、允許特定的端口訪問 # 允許 TCP 端口&#xff08;例如 80&#xff09;&#xff1a; sudo ufw allow 80/tcp# 允許 UDP 端口&#xf…

移動端 WebView 內存泄漏與性能退化問題如何排查 實戰調試方法匯總

在混合 App 應用中&#xff0c;WebView 頁面常承載復雜業務邏輯與交互。隨著用戶使用時間增長&#xff0c;特別在切換多個頁面或反復打開界面后&#xff0c;常常會出現性能下降、頁面卡頓、甚至白屏崩潰等現象。這通常是因為頁面存在內存泄漏、事件監聽未解綁或垃圾回收阻塞導致…

JSON 對象在瀏覽器中順序與后端接口返回不一致的問題

一、問題描述 后端接口返回一個字典表的JSON對象&#xff0c;頁面展示排序與預期排序不一致。 在瀏覽器調試面板Response中看到接口原始響應字符串&#xff0c;是期望順序&#xff1a;在Preview中看到&#xff0c; key “22” 被提到最前&#xff0c;順序發生變化&#xff1a;頁…

Spring MVC數據傳遞全攻略

Spring MVC數據傳遞一、前端到后端的數據傳遞1. 使用 RequestParam 傳遞簡單參數2. 使用 PathVariable傳遞路徑參數3. 使用RequestBody傳遞 JSON 數據二、后端到前端的數據傳遞1. 使用Model或 ModelAndView傳遞數據到前端2. 使用HttpServletResponse直接寫回數據3.使用Response…

倉庫管理系統-12-前端之頭部區域Header基于嵌套路由訪問個人中心

文章目錄 1 個人中心 1.1 DateUtils.vue(子組件) 1.2 Home.vue(父組件) 1.3 router/index.js(嵌套路由) 1.4 index.vue(路由占位符) 2 Header.vue 2.1 頁面布局 2.2 toUser方法 2.3 初始加載 2.4 Header.vue 頭部區域Header中有一個個人中心下拉菜單,點擊個人中心選項,通過嵌…

【智能協同云圖庫】第七期:基于AI調用阿里云百煉大模型,實現AI圖片編輯功能

摘要&#xff1a;AI 高速發展賦能傳統業務&#xff0c;圖庫網站亦有諸多 AI 應用空間。以 AI 擴圖功?能為例&#xff0c;讓我們來學習如何在項目?中快速接入 AI 繪圖大模型。?用戶可以選擇一張已上傳的圖片&#xff0c;?通過 AI 擴圖得到新的圖片&#xff0c;希望可以幫到大…

Notepad++插件安裝

方式一&#xff1a;自動安裝&#xff08;有些notepad并不好用&#xff0c;推薦方式二&#xff09;工具欄-》插件-》插件管理如下點擊安裝后會提示&#xff0c;后端安裝&#xff0c;安裝成功后自動啟動&#xff0c;本人使用的v8.6.4的版本&#xff0c;插件基本都無法自動安裝&am…

git pull和git fetch的區別

git pull和git fetch是git版本控制系統中的兩個基本命令&#xff0c;它們都用于從遠程倉庫更新本地倉庫的信息&#xff0c;但執行的具體操作不同。git fetch:git fetch下載遠程倉庫最新的內容到你的本地倉庫&#xff0c;但它并不自動合并或修改你當前的工作。它取回了遠程倉庫的…