虎哥來聊聊怎麼用一個小小的改動,給你的 Golang 代碼提速 42%!很多時候,程序性能優化就是這樣:只要動一個字符,就可能帶來出人意料的提升。今天咱們就從切片傳遞優化、變量聲明優化和字符串拼接優化入手,看看怎麼改動這麼一個字符能讓 Golang 飛起來!🚀切片傳遞優化先來說說切片。切片在 Go 語言中用得特別多,因爲它們既靈活又方便。然而,切片的傳遞會帶來性能問題,尤其是當切片非常大時。原始代 ⌘ Read more
虎哥來聊聊怎麼用一個小小的改動,給你的 Golang 代碼提速 42%!很多時候,程序性能優化就是這樣:只要動一個字符,就可能帶來出人意料的提升。今天咱們就從切片傳遞優化、變量聲明優化和字符串拼接優化入手,看看怎麼改動這麼一個字符能讓 Golang 飛起來!🚀切片傳遞優化先來說說切片。切片在 Go 語言中用得特別多,因爲它們既靈活又方便。然而,切片的傳遞會帶來性能問題,尤其是當切片非常大時。原始代 ⌘ Read more
1 引言----Node.js 的事件驅動架構和非阻塞 I/O(輸入 / 輸出)機制賦予了其出色的可擴展性。然而,隨着應用程序規模的擴大,性能瓶頸仍然可能成爲問題。處理的請求和數據量增加時,內存泄漏、CPU 密集型任務和低效的 I/O 操作等問題可能會拖慢應用速度。爲了維持高效性能,開發者必須對性能進行細緻的調優,並儘早解決這些潛在障礙。本文將探討一系列用於優化 Node.js 性能的技術。我們將 ⌘ Read more
今天我們要討論的是如何對 API 進行限流。假設我們有一個 API,多個用戶在訪問它,我們總是有可能遇到某個用戶開始大量請求我們的服務,從而導致服務器超載,阻止其他用戶訪問該服務。這個用戶可能是一個惡意行爲者,試圖攻擊服務,或者只是由於某人的代碼中存在錯誤。但無論是哪種情況,我們都希望確保能夠消除這種情況的可能性。這種情況會導致其他用戶體驗差,並可能增加成本。因此,如果我們要防止某個特定用戶一次發 ⌘ Read more
首先回顧一下:四大統計(基數統計,二值統計,排序統計、聚合統計)的原理 和應用場景-----------------------------------------尼恩這邊的文章都有一個 基本的規則,從最爲基礎的講起。先看看 常見的四大統計。億級海量數據查重,如何實現 ?涉及的是四大統計其中的 二值統計億級海量數據黑名單 ,如何存儲?涉及的也是四大統計其中的 二值統計第 1 大統計:基數統計基數( ⌘ Read more
衆所周知 Redis 扛併發的能力是非常強的,所以高併發場景下經常會使用 Redis,但是 Redis 單分片的寫入瓶頸在 2w 左右,讀瓶頸在 10w 左右,如果在超高併發下即使是集羣部署 Redis,單分片的 Redis 也是有可能扛不住的,如下圖所示: 雖然 Redis 做了集羣部署,但是 Redis 的 key 只會存在一個分片上,此時超高併發下 redis1 很有可能會被打 ⌘ Read more
大家好,我是 frank。「Golang 語言開發棧」公衆號作者。01 介紹在使用 Gin 框架開發項目時,通常我們選擇模型綁定的方式接收請求參數,我們在上一遍文章中,已經介紹過使用 Gin 框架接收請求參數的常用方式。本文我們主要介紹怎麼驗證綁定到結構體的字段,順便補充關於模型綁定的一些內容。02 模型綁定關於 Gin 框架的模型綁定,我們在上一篇文章中介紹了 ShouldBind 方法,該 ⌘ Read more
前兩天會上有一個需求, 就是某個數據發生變化了, 需要給用戶提示一下, 這個時候呢, 我們就需要使用 SSE 服務了 那麼, 什麼是 SSE 呢? SSE 全稱叫做: Server-Sent Events, 該服務是一種服務器向客戶端推送實時更新的機制模式, Http 協議是無法實現服務端向客戶端主動推送消息, 但是呢, 可以向客戶端聲明, 要發送流信息, 所以該服務就是利用這個機制, 向客戶 ⌘ Read more
今天我們站在收發包視角來看一下,爲了避免丟包,需要注意的內核參數吧。 背景-- TCP 收包和發包的過程是網絡應用中容易出現問題的地方。收包是指數據到達網卡並被應用程序開始處理的過程;發包則是應用程序調用發包函數到數據包從網卡發出的過程。常見的問題包括:網卡中斷過多,佔用大量 CPU,影響業務性能; 應用程序調用 write() 或 send() 發送數據包卻未成功; ⌘ Read more
在編程語言領域,Zig 相對來說是新成員。Zig 由 Andrew Kelly 創立,於 2016 年正式面世,Zig 社區將其定位爲 “用於開發健壯、優化和可複用軟件的通用編程語言”。作爲一名 Go 開發者,我對 Zig 及其工具鏈的能力尤爲感興趣。在研究 Zig 時,發現這兩種語言(Zig 和 Go)在某些方面有着共同的特性。譯|zouyee爲了幫助讀者深入瞭解 Kubernetes 在各種應 ⌘ Read more
字符編碼的奧祕-------本文旨在講解常見的字符編碼,如:Unicode、UTF-8、GBK字符集,以及emoji。起初計算機在美國發明,自然大家考慮的是如何表示英文,英語字母總共 26 個,加上特殊字符,用 128 個字符,一個byte即足以表示出來。這個就是大家所熟知的ASCII編碼。對應關係很簡單,一個字符對應一個byte。但很快人們發現,其他非英語國家的文字遠遠超過ASCII碼,不同國家 ⌘ Read more
在本文中,我們將使用 Go 編程語言構建一個 Web 應用程序,利用 Gin 框架進行路由,GORM 進行數據庫交互,並使用 JWT(JSON Web Tokens)進行身份驗證。應用程序將採用 MVC(模型 - 視圖 - 控制器)設計模式,以促進關注點的清晰分離。前置條件----在開始之前,請確保您具備以下條件:已在您的計算機上安裝 Go(版本 1.16 或更高)。 已設置 Postgre ⌘ Read more
作者:騰訊 PCG 代碼委員會 經過十餘年的迭代,Go 語言逐漸成爲雲計算時代主流的編程語言。下到雲計算基礎設施,上到微服務,越來越多的流行產品使用 Go 語言編寫。可見其影響力已經非常強大。一、Go 語言發展歷史介紹Go 語言起源於 2007 年的 Google;創始人有三位,分別是 Ken Thompson、Rob Pike、Robert Griesemer;他們可謂是大佬中的大佬。最初的構 ⌘ Read more
在日常工作和生活中,我們經常需要在手機和電腦之間傳輸文件。有時想把手機裏的照片傳到電腦,有時又要把電腦上的文檔發送到手機。雖然有不少文件傳輸工具,但要麼需要註冊賬號,要麼必須聯網,要麼傳輸速度慢得讓人抓狂。最近我在 GitHub 上發現了一個完全開源的文件傳輸工具 LocalSend,它讓我眼前一亮。項目介紹LocalSend 這款工具不需要網絡連接,只要設備在同一個局域網內就能實現快速傳輸。更棒 ⌘ Read more
一 文件在線預覽在現代工作與生活環境中,文件共享與查看已經成爲日常不可或缺的一部分。不過傳統的文件處理方式要求用戶下載文件到本地後才能查看,這不僅佔用了設備的存儲空間,還可能導致文件傳播效率低下,甚至存在安全隱患。因此,現在很多應用都支持文件在線預覽,像我們常見的 docx、pptx、xlsx、md、圖片、pdf 等等都可以在瀏覽器中直接查看文件內容,無需下載,大大提高了文件處理的便捷性和安全性。 ⌘ Read more
🍹 Insight Daily 🪺 Aitrainee \| 公衆號:AI 進修生Hi,這裏是 Aitrainee,歡迎閱讀本期新文章。向大家 分享一個非常有趣的 RAG 工具,它是基於 GraphRAG 的。 先說 GraphRAG 爲什麼如此受歡迎,並且看起來是任何生產級 GraphRAG 流水線的好選擇呢?因爲它處理的是節點和圖結構,適用於現實世界的場景。例如,普通的 RAG 只是通過語義 ⌘ Read more
本文介紹了 Go 語言中靜態鏈接和動態鏈接的概念,解釋了它們的區別和各自優勢。通過示例,展示瞭如何生成靜態或動態鏈接的二進制文件,以及使用工具進行檢查。文章還討論了內部和外部鏈接器的區別,如何在編譯時選擇鏈接方式,以及在交叉編譯時處理 cgo 的方法。最後,提到了減小二進制文件大小的技巧和安全性方面的考慮。概述--Go 語言最大的優勢之一就是它的編譯器,它爲程序員抽象了許多細節,讓你可以輕鬆地爲幾 ⌘ Read more
TCP 連接生命週期---------- 來自《TCP 半連接全連接(一) -- 全連接隊列相關過程》(https://xiaodongq.github.io/2024/05/18/tcpconnect/)一文的作者,很好的總結了連接建立,數據收發到連接關閉的過程,正所謂一圖勝千言!原圖地址:https://xiaodongq.github.io/images/tcp-connect-clo ⌘ Read more
一、引言----微信存在大量 AI 計算的應用場景,主要分爲三種:流量分發、產品運營和內容創作。流量分發場景中的 AI 計算主要用於搜索、廣告、推薦場景的核心特徵生產,產品運營相關的 AI 計算主要用於產品功能相關和內容運營相關(低質、優質、生態建設),由於大模型的興起,AIGC 相關的文生圖、圖生圖、AI 特效等內容創作場景的 AI 計算也有了較多的落地。目前 AI 計算幾乎覆蓋了微信的所有業務 ⌘ Read more
在 GreptimeDB v0.9 版本我們加入了對日誌相關的支持:Pipeline 引擎和全文索引。GreptimeDB 致力於成爲統一處理指標(Metric)、日誌(Log)、事件(Event)和追蹤(Trace)的時序數據庫。在 v0.9 之前,用戶雖然可以寫入文本(string)類型的數據,但無法進行專門的解析和查詢。有了 Pipeline 引擎和全文索引之後,用戶可以直接使用 Grept ⌘ Read more
進程間通信,即 Interprocess communication(IPC),在現代操作系統中起着至關重要的作用。在計算機系統中,每個進程都擁有獨立的地址空間,這意味着它們不能直接訪問彼此的數據。然而,在許多實際應用場景中,不同的進程需要進行數據交互和協同工作,這就需要進程間通信機制來實現。進程間通信的重要性主要體現在以下幾個方面。首先,數據傳輸是一個關鍵需求。例如,一個進程可能需要將大量的數據 ⌘ Read more
最近在做 RLHF 場景下的訓練和推理複用機器的優化,需要及時釋放掉不用的 GPU 資源。翻出了之前和同事一起寫的這篇文章,雖然過去 2 年了,但依然好看,因此轉載到這裏。本文使用的 PyTorch 源碼爲 master 分支,commit id 爲 a5b848aec10b15b1f903804308eed4140c5263cb。背景介紹----剖析 PyTorch 顯存管理機制主要是爲了減少顯 ⌘ Read more
“ 導讀:電商業務中,多場景下的複雜業務流程往往通過訂單來記錄業務的發生。訂單的拆單規則需要適配不同條件的細分場景。本文通過個人項目覆盤,以文字與流程圖的形式,描述清楚訂單(銷售訂單)的拆單與合併規則。”01概述1.1 什麼是拆單:在網上購買商品下單成功後,過一段時間再次瀏覽時,有時會發現你的訂單會變成兩個或多個,這就是系統做了拆單而導致的。 ●拆單,就是將一個大的訂單依據某些規則的集合,將其分 ⌘ Read more
後臺分佈式架構形形色色,特別是微服務和雲原生的興起,誕生了一批批經典的分佈式架構,然而在公司內部,或者其他大型互聯網企業,都是拋出自己的架構,從接入層,邏輯層,數據層都各有特點,但這些系統設計中到底是出於何種考量,有沒有一些參考的脈絡呢,本文將從雲原生和微服務,有狀態服務,無狀態服務以及分佈式系統等維度探討這些脈絡。 01分佈式系統概論 下面這個定義來自於經典的《Designing Dat ⌘ Read more
在現代分佈式系統中,事件驅動架構 (EDA, Event-Driven Architecture) 日益流行,它通過異步處理事件來解耦系統組件,使得系統更具擴展性和靈活性。然而,隨着越來越多的服務、平臺和工具採用事件驅動的方式,不同平臺間事件的定義和格式不統一的問題逐漸暴露。這種不兼容性會導致跨平臺通信的複雜性增加,開發者需要爲不同系統適配不同的事件格式,極大地增加了開發和維護成本。爲了解決這一問 ⌘ Read more
1 前言 ffmpeg 是音視頻業界最著名的開源之一,支持多種流媒體協議的推拉流,支持多種媒體格式,支持多種編解碼器,但是一直沒有對 webrtc 協議的推拉流進行支持。在 whip 協議寫入 rfc 的草案後,webrtc 協議的推流協議就有了規範。whip 協議,全名: WebRTC-HTTP ingestion protocol.rfc 地址: https://www.ietf.org ⌘ Read more
介紹GoReplay 是一個開源網絡監控工具,可以將實時 HTTP 流量捕獲並重放到測試環境。應用成熟的過程中,測試所需的工作量往往會成倍增長。針對這個問題,GoReplay 爲使用者提供了重用現有通信量進行測試的簡單方法。它可以在不改動產品基礎結構、且不影響現有流量的情況下,對這些流量進行分析和記錄,從而增強使用者對代碼部署、配置和基礎結構進行更改的信心。下載及安裝下載地址:https://gi ⌘ Read more
大家好,今天我們來聊一個 Go 語言中非常實用的包 - bufio。不管你是剛入門的新手還是有經驗的開發者,這篇文章都能幫你快速掌握 bufio 的使用!🌟 什麼是 bufio?-------------bufio 是 Go 語言提供的一個帶緩衝的 I/O 包,它像是給 I/O 操作加了一個 "加速器",通過減少系統調用次數來提升性能。想象一下:不用緩衝:每次讀寫都直接操作硬盤,就像我們一次只買一 ⌘ Read more
Yaegi[2] 是一個用 Go 語言編寫的 Go 語言解釋器。這個項目最初是在 Traefik-Labs 啓動的, 目的是爲 traefik 反向代理提供一個簡單實用的嵌入式插件引擎。現在, 社區貢獻的 200 多個插件已經列在 plugins.traefik.io[3] 的公共目錄中。Yaegi 的使用也擴展到其他領域, 例如 數據庫 [4] 、 可觀察性 [5] 、 容器安全 [6] ⌘ Read more
背景介紹隨着互聯網技術的迅猛發展,JavaScript 已經成爲幾乎所有現代網頁和應用開發中不可或缺的組成部分。但是,JavaScript 的執行環境通常侷限於瀏覽器或者 Node.js,這爲那些希望在不同環境下運行 JavaScript 代碼的開發者帶來了限制。特別是在 Go 語言環境中,開發者面臨着將 JavaScript 與 Go 通信的挑戰,因爲二者運行時不一致可能導致性能下降和開發效率降 ⌘ Read more
本文主要介紹了在 Golang 中實現策略設計模式(Strategy Design Pattern)的方法和優勢。策略設計模式是一種用於處理多種相似算法或行爲的設計模式,允許在運行時動態切換算法。原文: Strategy Design Pattern in Golang[1]假設有一個名爲 PaymentStrategy 的接口,包含一個名爲 Pay() 的方法,有兩種名爲 CreditCar ⌘ Read more
問題--假如有 10 億的用戶,每個用戶有自己的分數 (score),請你設計一個排行榜,可以根據用戶的分數進行排名,每個用戶可以知道自己在排行榜中的排名情況。分析一說到排行榜,我們的第一反應肯定是使用 Redis 的 ZSET 結構實現,那麼使用 ZSET 如何實現對 10 億用戶進行排序?ZSET 單 key第一種思路,使用 ZSET 單 key,也就是將 10 億用戶都放入一個 ZSET k ⌘ Read more
布隆過濾器和布穀鳥過濾器是兩種概率型數據結構,主要用於高效的檢査一個元素是否屬於一個集合,但是在實現實現、性能特性和使用場景上存在一定的差異,下面我們來聊聊這兩種過濾器。1、布隆過濾器 布隆過濾器的原理是對一個 key 進行 n 個 hash 算法獲取 n 個值,然後通過這些值在比特數組中將這 n 個值對應的 bit 位設爲 1,如下圖所示的: 我們元數據(龍蝦編程)通過兩個哈 ⌘ Read more
性能分析和優化是所有軟件開發人員必備的技能,也是後臺大佬們口中津津樂道的話題。Golang 作爲一門 “現代化” 的語言,原生就包含了強大的性能分析工具 pprof 和 trace。pprof 工具常用於分析資源的使用情況,可以採集程序運行時的多種不同類型的數據(例如 CPU 佔用、內存消耗和協程數量等),並對數據進行分析聚合生成的報告。trace 工具則關注程序運行時的事件(例如協程狀態切換,G ⌘ Read more
位圖 (bitmap) 是一種優雅而高效的數據結構, 它巧妙地利用了計算機最底層的位運算能力。你可以把它想象成一個巨大的開關陣列, 每個開關只有打開和關閉兩種狀態 —— 這就是位圖的本質。每一位都可以獨立控制, 卻又可以通過位運算實現羣體操作。在實際應用中, 位圖的威力令人驚歎。設想你需要在海量數據中查找重複的數字, 傳統的哈希表或數組都會佔用大量內存。而位圖卻能巧妙地用一個比特位標記一個數字的 ⌘ Read more
在 Go 語言面試中, 關於 "可以產生的最大協程數量" 這個問題有時會讓候選人措手不及。答案並不是簡單地給出一個具體數字。面試官通常用這個問題來評估你對 Go 併發模型、內存管理以及協程實踐經驗的理解。理解 Go 的併發模型和協程效率首先需要明確以下幾點:協程是由 Go 運行時管理的輕量級用戶空間線程, 比傳統的操作系統線程更高效 Go 並沒有對協程數量設置嚴格限制, 在合適的條件下, 你可以同 ⌘ Read more
10 個最佳 Golang 庫---------------在 Golang 中,我們可以找到垃圾回收、可接受的庫和標準的類型系統。Golang 適用於系統編程,也被稱爲包。Go 語言被稱爲 Golang 是因爲它在編程語言 GO 中收集了一些可重用的代碼組件。在 Go 語言中,包在組織和結構化代碼方面起着重要作用,還提高了可讀性、代碼可重用性和可維護性。這裏爲你介紹十個最佳 Golang 庫。這 ⌘ Read more
在軟件開發中,配置管理是一個不可或缺的部分。無論是開發環境、測試環境還是生產環境,我們都需要一種方法來存儲和讀取配置信息。在 Golang 項目中,Viper 是一個非常流行且功能強大的庫,用於處理配置文件。下面我會寫一些例子,幫助大家快速上手。什麼是 Viper?----------不賣關子,直接上 GitHub 地址:https://github.com/spf13/viper 大家可以直接去 ⌘ Read more
概述--線程本地變量。當使用 ThreadLocal 維護變量時, ThreadLocal 爲每個使用該變量的線程提供獨立的變量副本,所以每一個線程都可以獨立地改變自己的副本,而不會影響其它線程。每個線程都有一個 ThreadLocalMap ( ThreadLocal 內部類),Map 中元素的鍵爲 ThreadLocal ,而值對應線程的變量副本。ThreadLocal 原理--------- ⌘ Read more
FAIR 是一個 Go 庫, 旨在確保資源受限環境中的公平性。它有助於在資源短缺時將有限的資源 (例如數據庫 / blob 存儲吞吐量、作業執行資源等) 均勻分配給多個客戶端, 防止基於客戶端行爲的過度分配和飢餓。 簡介--FAIR 的核心算法基於 隨機公平 BLUE[1] , 這種算法通常用於網絡擁塞控制, 但做了一些修改。FAIR 的理念是隻在真正資源短缺時進行限制, 而不是像令牌桶或漏桶等 ⌘ Read more
你是否還在爲微服務架構的拆分而苦惱?本文揭祕 7 大拆分原則,助你輕鬆駕馭微服務架構!隨着雲計算的普及,微服務架構成爲企業數字化轉型的重要選擇。然而,如何合理拆分微服務卻成爲許多開發者的難題。本文將揭祕 7 大拆分原則,助你輕鬆駕馭微服務架構,提升系統性能和可維護性。無論你是架構師還是開發者,這些原則都將爲你帶來實實在在的幫助。今天,碼哥帶大家從不同角度來剖析微服務架構設計的 7 大原則,做到合理 ⌘ Read more
傳統的密碼認證一直以來都是數字時代的主流身份驗證方式。然而,用戶常常選擇易記的弱密碼並重復使用,導致賬號易受攻擊。密碼泄露、釣魚攻擊等安全問題層出不窮,超過 80% 的數據泄露與密碼相關。與此同時,頻繁的密碼管理和忘記密碼情況嚴重影響用戶體驗。服務商在安全保存用戶密碼方面的責任也增加了系統建設和維護的成本。爲了應對這些問題,科技行業開始積極探索無密碼認證的方法。無密碼認證利用設備生物識別、硬件加密 ⌘ Read more
在 Linux 這個龐大而精妙的操作系統世界裏,隱藏着無數複雜而神奇的底層原理。今天,我們將一同深入探索其中至關重要的一環 ——Task 的內核態表示。這就像是打開了一扇通往系統核心深處的大門,在那裏,我們會看到 Linux 是如何有條不紊地管理進程和線程,如同一位技藝高超的指揮家掌控着一場宏大的交響樂演奏。無論是對 Linux 系統充滿好奇的新手,還是希望深入理解其內部機制的專業人士,都將在這次 ⌘ Read more
AI 領域正在快速發展,新的應用層出不窮。然而,創建能夠有效協調多個 AI 任務或 Agent(每個 Agent 處理複雜工作流的一部分)的系統仍然具有挑戰性。SwarmGo 應運而生,這是一個功能強大且輕量級的 Go 包,旨在使 AI 應用中的 Agent 編排更易於訪問和擴展。本文將深入探討 SwarmGo 的特性、優勢和結構,並展示如何使用它輕鬆創建智能的模塊化 AI 工作流。什麼是 Swa ⌘ Read more
引言--在現代 Web 應用中,文檔預覽是一項常見的需求,特別是針對 Word、Excel 和 PDF 等 Office 文件類型。開發者往往需要尋找高效、易用且性能良好的解決方案來滿足用戶的在線文檔預覽需求。vue-office正是爲此而生,它是一個支持多種 Office 文件預覽的 Vue 組件庫,提供了從簡單集成到高性能優化的全方位解決方案。本文將詳細介紹vue-office的功能特色、使用 ⌘ Read more
支付方式的發展歷程是怎樣的?第一方、二方、三方、四方支付是什麼?三方支付系統的背後支撐體系是怎樣的?一個第三方支付系統由哪些部分組成?各個組成部分的作用原理是什麼?本文作者將細緻而全面地帶你深入到支付系統的技術設計中,助你體系化掌握支付系統的技術全貌! 本文將是一個系列內容,後續還將發佈交易、退款、結算等各個環節的技術知識,感興趣的讀者朋友記得關注騰訊雲開發者公衆號,不錯過後續內容 01 序言 ⌘ Read more
如果我們想在對象 GC 之前釋放一些資源,可以使用 returns.SetFinalizer。這就像在函數返回前執行 defer 來釋放資源一樣。例如:1:使用 runtime.SetFinalizertype MyStruct struct { Name string Other MyStruct } func main() { x := MyStru ⌘ Read more=
InnoDB 是 MySQL 中最常用的存儲引擎之一,它通過一系列複雜的機制和策略來實現事務的 ACID 特性(原子性、一致性、隔離性和持久性)。以下是 InnoDB 實現事務的詳細過程和關鍵機制:1. 事務的啓動和結束• 啓動事務:通過 START TRANSACTION 或 BEGIN 語句開始一個新事務。 • 提交事務:通過 COMMIT 語句提交事務,將事務中的所有操作永久保存到數據 ⌘ Read more
背景最近一直在整理業務架構,之前同一份代碼邏輯,我們最多的邏輯會存在在 4 個 Git 倉庫,一些業務邏輯修改,經常需要同時修改多個地方;同時,同一 Git 倉庫中,一個代碼邏輯也有多處判斷的地方。在此之前,我們已經劃分了業務模塊,但是尚未完全重構完成,因此,我在之前的基礎上,繼續用 DDD 重構代碼。原架構原有的架構,我們存在多個系統,每個系統都是直接連接數據庫,需要使用哪些表,都是直接用。這也 ⌘ Read more
文章或者視頻一般都有評論模塊,因爲評論不僅可以增強用戶的參與度、促進交流,而且通過用戶的各種精彩評論與回覆增加了內容吸引力,所以文章或者視頻下的評論是非常重要的一個板塊,今天我們來聊聊評論模塊的設計。 1、基礎設計 如下是一個文章的評論截圖: 通過上圖的評論圖我們發現用戶發表了一級評論之後,其他的用戶可以在這個一級評論上繼續評論成爲二級評論,多個二級評論不用一次性展示 ⌘ Read more
前言當大量定時任務需要在同一時刻運行時,任務平臺的任務延遲會顯著增大,這是因爲任務平臺負載過高,導致任務運行延遲增大。本文對常見的分佈式框架進行壓力測試以及性能分析,從源碼層面找到性能差異的原因,同時希望通過測試與分析,可以開發出在高併發場景下,實現更低延遲的任務平臺。壓力測試測試方法----每個任務平臺都創建 5000 個 cron 表達式(/30 \* ?)任務,這些任務會在 0 秒和 3 ⌘ Read more*
讓我們深入探討一下多租戶系統的概念模型。概念模型是多租戶系統的 "骨架",幫助我們理解系統各部分的組織和運作方式。多租戶的核心概念模型--------------• 租戶:通常指一個企業客戶,不同租戶之間的數據和行爲是相互隔離的。 • 用戶:某個租戶內的具體使用者,使用賬號、密碼等信息登錄到 SaaS 系統,使用軟件服務。 • 組織:如果租戶是企業客戶,通常會有自己的組織架構。 ⌘ Read more
微信作爲月活用戶超過 13 億的國民級應用,每天處理的請求量簡直可以用 “天文數字” 來形容。 想象一下,微信後臺每秒要應對數億次用戶請求——聊天、朋友圈刷屏、微信支付、甚至紅包雨。這麼大的流量衝擊下,系統稍有不慎,可能就會 “崩了”。可事實是,微信後臺一直穩得讓人驚訝。那麼問題來了,微信是怎麼做到面對億級 QPS 的併發請求時,還能穩如泰山、不崩不垮的? 答案就是熔斷、降級和限流這些機制就像我 ⌘ Read more
大家好,這裏是物聯網心球。 談到高性能編程,我們繞不過一個問題高效內存分配,通常我們會使用 malloc 和 free 函數來申請和釋放內存。 那麼我們習以爲常的 malloc 和 free 函數,真的能滿足高性能編程的要求嗎? 帶着這個問題我們來深入理解 malloc 和 free 函數實現原理。1.ptmalloc 工作原理 malloc 和 fre ⌘ Read more
隨着社交網絡的蓬勃發展,點贊功能逐漸成爲了一個網站中不可或缺的功能。因爲點贊功能不僅可以讓用戶更直觀地瞭解自己的視頻、文章等內容被多少人認可,而且也提升了用戶互動體驗感。下面我們來聊聊通用的點贊系統設計的方案。1、點贊系統的數據表設計 在設計數據表的時候我們需要知道點贊系統需要完成的基礎功能有哪些,點贊系統通常需要實現以下功能:(1)用戶可以點贊一個視頻、文章、評論等內容(2)用 ⌘ Read more
分佈式鎖是分佈式系統中用來解決多個進程或節點之間對共享資源的安全訪問問題的一種機制。以下是幾種常見的分佈式鎖實現方式:1\. 基於數據庫的分佈式鎖實現原理:基於數據庫的分佈式鎖主要利用數據庫的唯一性索引或主鍵等特性來實現。當需要獲取鎖時,向數據庫中插入一條記錄,如果插入成功,則表示獲取鎖成功;如果插入失敗(如因唯一索引衝突),則表示鎖已被其他節點持有。釋放鎖時,從數據庫中刪除相應的記錄。優缺點:• ⌘ Read more
寫在前面----Spring 的核心思想就是容器,當容器 refresh 的時候,外部看上去風平浪靜,其實內部則是一片驚濤駭浪,汪洋一片。Springboot 更是封裝了 Spring,遵循約定大於配置,加上自動裝配的機制。很多時候我們只要引用了一個依賴,幾乎是零配置就能完成一個功能的裝配。由 spring 提供的、在容器或 bean 生命週期各個階段、供 spring 框架回調使用的函數方法,即 ⌘ Read more
在現代應用程序中,讀寫操作的需求往往是截然不同的。爲了應對這些差異,CQRS (Command Query Responsibility Segregation,命令查詢職責分離), 逐漸成爲一種廣泛使用的架構模式。它通過將讀操作和寫操作進行分離,解決了傳統架構下的一些常見問題,尤其在性能和可擴展性方面優勢顯著。什麼是 CQRS?---------CQRS 的核心思想是:將處理 “命令”(Comm ⌘ Read more
單體架構下的事務在單體系統的開發過程中,假如某個場景下需要對數據庫的多張表進行操作,爲了保證數據的一致性,一般會使用事務,將所有的操作全部提交或者在出錯的時候全部回滾。以創建訂單爲例,假設下單後需要做兩個操作: 在訂單表生成訂單。 在積分表增加本次訂單增加的積分記錄。在單體架構下只需使用@Transactional開啓事務,就可以保證數據的一致性。 @Transactional ⌘ Read more
深入剖析:Rust 所有權系統---------------一、Rust 所有權系統是什麼Rust 的所有權系統是該語言最爲獨特且核心的特性之一。它是一種用於管理內存的機制,在不需要垃圾回收(GC)機制的情況下,保障內存安全和運行效率。在 Rust 中,每個值都有一個被稱爲其所有者(owner)的變量,並且這個值有且僅有一個所有者。例如,當創建一個變量來存儲某個值時,這個變量就成爲了該值的所有者。 ⌘ Read more
在現代軟件開發領域,分佈式系統已經變得至關重要。它們使服務能夠擴展、處理大量數據並提供高可用性。本文將指導您使用 Golang 構建一個簡單的分佈式系統,該系統利用主節點和單個工作節點,並使用 gRPC 協議進行通信。這種架構非常適合數據處理、並行計算和大規模處理工作負載等分佈式任務。我們將介紹如何設置主從結構、建立基於 gRPC 的通信,以及實現簡單的任務分配和執行流程。系統概述----我們的分 ⌘ Read more
在 Go 中,創建設計模式有助於管理對象的創建,並控制對象的實例化方式。這些模式在對象創建過程複雜或需要特殊處理時特別有用。以下是 Go 中常用的主要創建模式:單例模式單例模式確保一個類只有一個實例,並提供一個全局訪問點。如何實現定義一個結構,並將其作爲單個實例。 爲該結構創建一個全局變量,但不要立即將其初始化。 使用 sync.Once 確保實例只創建一次,即使在多線程情況下也是如此 ⌘ Read more
markdown 格式地址:https://github.com/ForceInjection/linux-from-beginner-to-master/blob/main/elf101.mdLinux 二進制文件格式 ELF 101什麼是 ELF 文件?-----------ELF 是 可執行和可鏈接格式(Executable and Linkable Format)的縮寫,它定義了二進制文件 ⌘ Read more
01、背景介紹-------雖然 Java 對線程的創建、中斷、等待、通知、銷燬、同步等功能提供了很多的支持,但是從操作系統角度來說,頻繁的創建線程和銷燬線程,其實是需要大量的時間和資源的。例如,當有多個任務同時需要處理的時候,一個任務對應一個線程來執行,以此來提升任務的執行效率,模型圖如下:如果任務數非常少,這種模式倒問題不大,但是如果任務數非常的多,可能就會存在很大的問題:1. 線程數不可控: ⌘ Read more
有好的擴展工具對於開發者來說是非常有用的,它們可以提高開發效率,簡化工作流程,並且使得在瀏覽器中進行開發和調試變得更加方便。先來看看各大瀏覽器的市場佔比:前五大瀏覽器分別是:Chrome、Safari、Edge、Firefox、Opera。Chrome 瀏覽器基本上一騎絕塵了,所以本文以 Chrome 瀏覽器爲例介紹開發者必備的一些擴展!!!1、Web DeveloperWeb Developer ⌘ Read more
KAG(Knowledge Augmented Generation)框架早在 9 月份就已經發布,近期終於開源了,它的核心在於提出了:一種 LLM 友好的知識表示方法 知識圖譜與原始文本塊之間的相互索引 邏輯形式引導的混合推理引擎 以及基於語義推理的知識對齊 歸功於在構建更有效的索引、知識對齊和混合解決庫方面的創新,KAG 框架在多跳問答任務中相比於現有的 RAG 方法有 ⌘ Read more
一、核心思想------IoC和AOP不是spring提出來的,在spring之前就已經存在,只不過更偏向理論化,spring在技術層面把這兩個思想做了非常好的實現。在手寫spring中的IoC和AOP之前,我們先來了解IoC和AOP的思想。1、IoC1.1 什麼是 IoC?IoC Inversion of Control(控制反轉、反轉控制),注意它是一個技術思想,不是技術實現。描述的事情:Ja ⌘ Read more
得益於 Zig 與 C 的無縫交互加上構建系統的逐漸完善,我們可以相對教簡單的將一個 C 項目包裝成一個 Zig 綁定庫。以下是 zig-rocksdb[1] 支持靜態鏈接 librocksdb 的構建方式:fn buildStaticRocksdb( b: std.Build, target: std.Build.ResolvedTarget, optimize: std.bu ⌘ Read more
treap 是一棵二叉樹,它同時維護二叉搜索樹 (BST) 和堆的屬性, 所以由此得名 (tree + heap ⇒ treap)。從形式上講,treap (tree + heap) 是一棵二叉樹,其節點包含兩個值,一個 key 和一個 priority,這樣 key 保持 BST 屬性,priority 是一個保持 heap 屬性的隨機值(至於是最大堆還是最小堆並不重要)。相對於其 ⌘ Read more
在軟件開發領域,"組合優於繼承" 的原則常常被奉爲圭臬,因爲它能夠帶來更靈活、更易維護的代碼。Go 語言以其獨特的面對對象設計理念,堅定地選擇了組合而非繼承。本文將深入探討 Go 語言爲何偏愛組合,並闡述其在實際應用中的優勢。繼承的弊端與組合的優勢-----------傳統的面對對象編程語言通常依賴繼承機制,允許一個類繼承另一個類的行爲和屬性。然而,這種方式容易導致代碼結構僵化,難以應對需求變化。 ⌘ Read more
日誌對於我們開發人員是非常重要的,當我們的系統會出現異常或者業務出現錯誤的時候,我們都是利用日誌來定位問題,問題定位到之後就可以有針對性的來解決這個問題,下面我們來聊聊日誌系統架構的常見設計方案。1、單體應用下的日誌系統設計 在互聯網初期的業務系統都是單體架構部署的,所以針對這種架構下的日誌一般都是採用文件的形式存儲日誌,如下所示: 用戶在使用系統的過程中,系統中採用 ⌘ Read more
GPU(圖形處理器)和 CPU(中央處理器)是計算機硬件中的兩大核心組件,它們在計算機系統中發揮着不同的作用,並具有顯著的區別。 設計目的與功能CPU:設計目的是爲了高效地處理各種不同的任務,是計算機系統的中樞。它擅長順序處理和分支預測,能夠與各種設備和內存進行交互,並負責操作系統、應用程序、網絡通信等的運行。CPU 的作用偏向於調度、協調和管理,同時也具備一定的計算能力。 GPU:設計目 ⌘ Read more
什麼是分佈式任務調度器?爲什麼需要分佈式任務調度系統?如何設計一套分佈式任務調度系統?這篇文章,我們來詳細分析。什麼是分佈式任務調度系統?分佈式調度系統是一種軟件系統,用於在多個計算節點上協調和管理的執行,這類系統的主要目標是提高任務調度的效率、可靠性和可擴展性。分佈式調度系統通常用於處理需要在多個服務器或計算節點上並行執行的複雜計算任務。如何設計分佈式任務調度系統?2.1 需求分析------- ⌘ Read more
分庫分表的一般做法---------一般會使用三種算法:哈希分庫分表: 根據分庫分表鍵算出一個哈希值,根據這個哈希值選擇一個數據庫。最常見的就是數字類型的字段作爲分庫分表鍵,然後取餘。比如在訂單表裏,可以按照買家的 ID 除以 8 的餘數進行分表範圍分庫分表: 將某個數據按照範圍大小進行分段。比如說根據 ID,[0,1000)在一張表,[1000,2000)在另外一張表。最常見的應該是按照日期進行 ⌘ Read more
在金融領域,爲了保證數據的精度,往往會使用 BigDecimal。本文就來探討下爲什麼 BigDecimal 可以保證精度不丟失。類介紹---首先來看一下 BigDecimal 的類聲明以及幾個屬性:public class BigDecimal extends Number implements ComparableBigDecimal { // 該BigDecimal的未縮放值 p ⌘ Read more
依賴注入:讓 Go 語言更加優雅----------------在軟件工程中,依賴注入(Dependency Injection,簡稱 DI)是一種設計模式,它允許我們在不修改類的代碼的情況下向類中注入依賴。這種方式有助於降低代碼間的耦合度,使得各個組件更容易獨立開發和測試。雖然 Go 語言以其簡潔和高效的特性著稱,但在構建大規模應用時,手動管理依賴關係可能會變得複雜和難以維護。這就是 Pa ⌘ Read more
優雅地關閉線程池意味着確保所有正在執行的任務都能完成,同時不會接受新的任務,並且不會突然終止正在運行的線程。Java 提供了幾種方法來優雅地關閉線程池,主要通過 shutdown() 和 awaitTermination() 方法來實現。示例和講解import java.util.concurrent.Executors;import java.util.concurrent.ExecutorSe ⌘ Read more
JavaScript 在處理文件、二進制數據和數據轉換時,提供了一系列的 API 和對象,比如 File、Blob、FileReader、ArrayBuffer、Base64、Object URL 和 DataURL。每個概念在不同場景中都有重要作用。下面的內容我們將會詳細學習每個概念及其在實際應用中的用法。接下來的內容中我們將來了解 File 和 Blob 這兩個對象。blob在 JavaScr ⌘ Read more
1:一圖解讀分佈式事務-----------首先奉上一張全網最爲牛逼的圖,給大家做個總覽:1:Seata 和 Rocketmq 事務消息實現,實現 強弱結合型事務------------------------------------- 秒殺 / 搶購 等場景,都是屬於 強弱結合型 的數據一致性場景。 首先看看 RocketMQ 的事務消息, 能夠保證本地操作 + 消息發送的原子性。具體 ⌘ Read more
在 Go 語言中,我們可以利用 channel 作爲數據的傳輸通道,通過定期批量讀取 channel 中的數據,並將這些數據批量發送到 Kafka 或者進行網絡寫入。這樣可以提高系統的性能,減少單個請求的網絡開銷。批量處理的主要邏輯是:從 channel 中接收數據,積累到一定數量或者達到時間限制後,將數據批量處理(例如發送到 Kafka 或者寫入網絡)。下面我將展示一個從 Go channel ⌘ Read more
Once is an object that will perform exactly one action.sync.Once 是 Go 標準庫提供的使函數只執行一次的實現,常應用於單例模式,例如初始化配置、保持數據庫連接等。它可以在代碼的任意位置初始化和調用,因此可以延遲到使用時再執行,併發場景下是線程安全的。對外接口Once 對外僅暴露了唯一的方法 Do(f func()),f 爲需要執行的 ⌘ Read more
來源:juejin.cn/post/7306038680963579919需求 環境準備 設計方案 配置 nginx.conf 配置 lua 腳本 總結 擴展 需求------爲了封禁某些爬蟲或者惡意用戶對服務器的請求,我們需要建立一個動態的 IP 黑名單。對於黑名單中的 IP ,我們將拒絕提供服務。並且可以設置封禁失效時間環境準備--------lin ⌘ Read more
本文主要介紹泛型誕生的前世今生,特性,以及著名 PECS 原則的由來。在日常開發中,必不可少的會使用到泛型,這個過程中經常會出現類似 “爲什麼這樣會編譯報錯?”,“爲什麼這個列表無法添加元素?” 的問題,也會出現感嘆 Java 的泛型限制太多了很難用的情況。爲了更好的使用泛型,就需要更深的瞭解它,因此本文主要介紹泛型誕生的前世今生,特性,以及著名 PECS 原則的由來。泛型的誕生背景在沒有泛型之前 ⌘ Read more
一般對接過支付業務的都知道,RSA 算法。RSA 是一種廣泛應用於安全通信領域的非對稱加密算法。它使用一對密鑰(公鑰和私鑰)來加密和解密數據,在互聯網通信、數字簽名等場景中具有重要作用。咱們一起看一下,在 Go 語言中,如何使用 RSA 算法。一、RSA 加密與解密的基礎知識1. 非對稱加密RSA 屬於非對稱加密算法,主要特點是密鑰成對使用:一個用於加密(公鑰),另一個用於解密(私鑰)。使用公鑰加 ⌘ Read more
synchronized 關鍵字是 Java 中用於實現線程同步的一種機制,旨在確保多個線程在執行同步代碼塊時的原子性和可見性。synchronized 可以用於方法或者代碼塊上,以確保同一時刻只有一個線程可以執行被同步的代碼。synchronized 的實現過程1. 鎖的獲取和釋放• 方法級的同步:當一個方法被 synchronized 修飾時,它鎖定的是調用該方法的對象實例(如果是 stati ⌘ Read more
TL;DR通過函數式編程和 map 結構可以優化複雜的 if-else 邏輯 提前返回可以避免不必要的資源消耗,防止全表掃描等問題 避免在循環中使用 defer 語句,可能導致資源泄露 使用 for 循環對相同邏輯進行壓縮,提高代碼的簡潔性和可擴展性 代碼的世界,將自然語言的需求轉換成執行的邏輯。如何轉化成代碼之後仍然儘可能接近自然語言的可理解性,是我們一直探求的內容。 ⌘ Read more
本文主要介紹了 Go 語言新引入的 log/slog 標準庫的設計理念、使用方法以及如何進行定製化開發,以提高日誌操作的性能和靈活性。原文: Explore the Go slog Standard Library: Design and Usage[1]在 Go1.21[2] 中引入的 log/slog[3] 軟件包試圖彌補原有日誌軟件包的不足,即日誌缺乏結構化和級別特性。正如提案 [4] ⌘ Read more
什麼是 sync.Map------------我們都知道在 Go 語言中,普通的 Map 是非併發安全,併發讀寫時會 panic,sync.Map 則是官方庫提供的一種特殊的併發安全的映射類型,能保較高的性能的同時,還能保證併發安全。sync.Map 有以下幾個特點:sync.Map 特點併發安全: sync.Map 無需額外的鎖機制即可在多個 goroutine 中安全地進行讀寫操作。這對於高 ⌘ Read more
在本教程中,我們將深入探討如何使用cached庫來提升 Rust 應用程序的性能。我們將涵蓋本機緩存和 Redis 緩存的使用,並通過實際代碼示例展示如何優雅地實現緩存機制。環境準備-------首先,確保你已經安裝了 Rust 和 Cargo。然後,在你的Cargo.toml文件中添加cached和redis依賴:[dependencies]cached = "0.53"redis = "0.2 ⌘ Read more
目錄結構我們以最小目錄結構爲例進行說明,如下這是我們此次示例的目錄結構。$ tree -L 3.├── main.go├── Makefile├── pkg│ └── version│ └── version.go├── README.md代碼內容主要有兩部分代碼,分別爲 main.go,內容如下:package mainimport ( "eastMoney/pkg/ver ⌘ Read more
大家好,我是 ConardLi。 今天跟大家來介紹一款 JavaScript 運行時框架 - Hono,在 Github 上目前已經收穫了 19.5K Star!Hono,寓意爲 “火焰🔥”,是一個小巧、簡單且超快速的 Web 框架,構建在 Web 標準之上。Hono 號稱可以在任何 JavaScript 運行時環境中運行,包括 Cloudflare Workers、Fastly Compute ⌘ Read more
在受限的環境中運行 Rust 會帶來挑戰,代碼可能無法訪問完整的操作系統,如 Linux、Windows 或 macOS。可能對文件、網絡、時間、隨機數甚至內存的訪問有限(或沒有)。我們將探索變通方法和解決方案。這篇文章主要關注在 “WASM-WASI”(一種類似容器的環境)上運行 Rust 代碼。作爲在瀏覽器或嵌入式系統中運行 Rust 的第一步,它是有價值的。將代碼運行在 WASM-WASI ⌘ Read more
在信息爆炸的時代,數據如同洪流般湧現,如何高效地存儲和傳輸這些數據成爲了一項至關重要的技術挑戰。壓縮技術應運而生,它如同一位技藝精湛的魔術師,能夠將龐大的數據文件 “化繁爲簡”,在不損失信息或損失極少信息的情況下將其壓縮成更小的體積,從而節省存儲空間、提高傳輸效率。壓縮技術主要分爲兩大類:無損壓縮和有損壓縮。無損壓縮:顧名思義,這種壓縮方式能夠在解壓縮後完全恢復原始數據,不會造成任何信息損失。常見 ⌘ Read more
一. 爲什麼需要進程間通信-----------------1). 數據傳輸一個進程需要將它的數據發送給另一個進程。2). 資源共享多個進程之間共享同樣的資源。3). 通知事件一個進程需要向另一個或一組進程發送消息,通知它們發生了某種事件。4). 進程控制有些進程希望完全控制另一個進程的執行 (如 Debug 進程),該控制進程希望能夠攔截另一個進程的所有操作,並能夠及時知道它的狀態改變。注:爲什 ⌘ Read more
0 開始之前本文從 Llama 3 報告出發,基本整理一些現代 LLM 的技術。'基本',是說對一些具體細節不會過於詳盡,而是希望得到一篇相對全面,包括預訓練,後訓練,推理,又能介紹清楚一些具體技術,例如 RM,DPO,KV Cache,GQA,PagedAttention,Data Parallelism 等等的索引向文章。由於東西比較多,且無法詳盡細節,所以推薦大家二次整理爲自己的筆記。本文的 ⌘ Read more
首先,讓我們先來回顧 Go 運行時的 GPM 模型。這方面的介紹網上的資料都非常非常多了,但是我們也不妨回顧一下: GPM 模型中的 G 代表 goroutine。每個 goroutine 只佔用幾 KB 的內存, 可以輕鬆創建成千上萬個。G 包含了 goroutine 的棧、指令指針和其他信息, 如阻塞 channel 的等待隊列等。 P 代表 processor, 可以理解爲一個抽 ⌘ Read more
在 Web 應用中,通常會需要對 IP 訪問進行限制以及控制提交次數,以防止惡意攻擊(例如暴力破解、DoS 攻擊、API 濫用等)。爲了實現這一功能,我們可以結合 Golang 的特性,使用中間件或者基於 Redis 這樣的緩存服務來實現 IP 限制和提交次數的控制。實現步驟IP 訪問限制:對每個 IP 的訪問頻次進行限制,比如每個 IP 每分鐘只能訪問某個接口 10 次。超過限制後,返回錯誤信息 ⌘ Read more
最近發現 Golang 標準庫竟然自帶了 varint 的實現,代碼位置在 encoding/binary/varint.go。剛好藉助 golang 標準庫的 varint 源碼,我們來系統地學習和梳理下 varint。熟悉 protobuf 的人肯定對 varint 不陌生,protobuf 裏面除了帶 fix (如 fixed32、fixed64) 之外的整數類型, 都是 varint 編碼 ⌘ Read more
在構建健壯且可靠的應用程序時,優雅地處理系統信號至關重要。系統信號,如 SIGINT(中斷信號,通常由 Ctrl+C 觸發)和 SIGTERM(終止信號),允許我們以可控的方式關閉應用程序,執行必要的清理操作,例如關閉連接、釋放資源和保存狀態。本文將深入探討在 Go 語言中如何處理系統信號。我們將涵蓋以下主題:理解系統信號 使用 os/signal 包捕獲信號 實現優雅的關閉機制 ⌘ Read more
今天要帶大家走進一個神奇的技術領域 —— 零拷貝(Zero-Copy)。在數據如洪流般湧動的互聯網時代,零拷貝就像是一位高效的數據魔法師,它能極大地提升系統性能,讓數據傳輸變得前所未有的順暢。想知道它是如何施展魔法的嗎?那就跟我一起深入探索零拷貝的奇妙世界吧!一、零拷貝的概念--------1.1 概述零複製(英語:Zero-copy;也譯零拷貝)技術是指計算機執行操作時,CPU 不需要先將數據從 ⌘ Read more
概述--UDP 是無連接的,盡最大可能交付 (網絡 IP 層),不提供流量控制,擁塞控制,面向報文(對於應用程序的數據不合並也不拆分,直接添加 UDP 首部),支持一對一、一對多、多對一和多對多 (也就是多播和廣播) 通信。TCP 和 UDP 區別總結TCP 實現可靠傳輸層的核心有三點:確認與重傳 (已經可以滿足 “可靠性”,但是可能存在性能問題) 滑動窗口 (也就是流量控制,爲了提高吞吐量 ⌘ Read more