Paxos 算法是一種用於在分佈式系統中實現一致性的算法。算法的核心是多數派原則(Quorum),在一個分佈式系統中,只要有一組超過半數的接受者接受了某個提案,那麼這個提案的值就被認爲是達成一致的值。它能夠讓分佈式系統中的多個節點,在可能出現網絡故障、節點故障以及消息延遲、丟失或重複等複雜情況下,就某個值達成一致。一、角色構成提議者(Proposer):主要職責是提出提案(Proposal)。提案 ⌘ Read more
Paxos 算法是一種用於在分佈式系統中實現一致性的算法。算法的核心是多數派原則(Quorum),在一個分佈式系統中,只要有一組超過半數的接受者接受了某個提案,那麼這個提案的值就被認爲是達成一致的值。它能夠讓分佈式系統中的多個節點,在可能出現網絡故障、節點故障以及消息延遲、丟失或重複等複雜情況下,就某個值達成一致。一、角色構成提議者(Proposer):主要職責是提出提案(Proposal)。提案 ⌘ Read more
作者|Eino 項目組今天,經過字節跳動內部半年多的使用和迭代,基於 Golang 的大模型應用綜合開發框架 —— Eino,已在 CloudWeGo 正式開源啦!Eino 基於明確的 “組件” 定義,提供強大的流程“編排”,覆蓋開發全流程,旨在幫助開發者以最快的速度實現最有深度的大模型應用。你是否曾有這種感受:想要爲自己的應用添加大模型的能力,但面對這個較新的領域,不知如何入手;想持續的站在研究 ⌘ Read more
在 DDD(領域驅動設計)的領域建模以及系統建設之旅中,諸多參與者紛紛登場,領域專家憑藉深厚的專業知識爲項目奠基,產品經理把控整體方向與功能規劃,項目經理統籌資源、推進流程,架構師精心勾勒系統藍圖,開發經理組織代碼編寫,測試經理保障質量底線。然而,面對同一套領域知識,不同角色基於自身專業背景與職責範疇,理解往往大相徑庭,這無疑在溝通交流時築起了一道道高牆,阻礙着項目的順暢推進。正是爲了打破這一困境 ⌘ Read more
signal 間接啓動checkpointer process 的主要入口點是 CheckpointerMain(), 它是從 AuxiliaryProcessMain() 調用的,AuxiliaryProcessMain() 已經創建了基本的執行環境,但尚未啓用信號。對於 checkpointer process 的啓動初始化調用,是間接的。 它並非直接被 postmaster 調用初始化, ⌘ Read more
Goroutine 是 Go 編程語言中一個極具特色的設計,也是其併發能力的核心亮點之一。Goroutine 本質上是一種協程(Coroutine),是實現並行計算的關鍵。使用 Goroutine 非常簡單,只需通過 go 關鍵字即可啓動一個協程,協程會以異步方式運行。程序無需等待 Goroutine 完成即可繼續執行後續代碼。go func() // 使用 go 關鍵字啓動一個協程 II. Go ⌘ Read more
聚合在 DDD 中,實體和值對象是很基礎的領域對象。實體一般對應業務對象,它具有業務屬性和業務行爲;而值對象主要是屬性集合,對實體的狀態和特徵進行描述。但實體和值對象都只是個體化的對象,它們的行爲表現出來的是個體的能力。那聚合在其中起什麼作用呢?社會由個體組成,我們每個人都是其中一員。隨着社會發展,社團、機構、部門等組織應運而生,我們從個體逐漸成爲組織的一部分。在組織中,大家協同工作,朝着共同目標 ⌘ Read more
本文我們將學習 Redis Geo 數據類型,並瞭解它如何在需要需要位置服務的應用中使用,例如網約車。介紹--Redis GEO 是 Redis 3.2 版本中新增的數據類型,主要用於存儲地理位置信息以及對存儲的信息進行操作。在日常生活中,我們越來越依賴於搜索附近的購物中心和餐館。旅行時,我們通過出租車叫車應用叫出租車。這一切都離不開位置服務(Location-Based Service,LBS) ⌘ Read more
邊緣計算是在靠近物或數據源頭的網絡邊緣側,通過融合網絡、計算、存儲、應用核心能力的分佈式開放平臺,就近提供邊緣智能服務。簡單點講,邊緣計算是將從終端採集到的數據,直接在靠近數據產生的本地設備或網絡中進行分析,無需再將數據傳輸至雲端數據處理中心。01 爲什麼需要邊緣計算?物聯網技術的快速發展,使得越來越多具備獨立功能的普通物體實現互聯互通,實現萬物互聯。得益於物聯網的特徵,各行各業均在利用物聯網技術 ⌘ Read more
在計算機系統的複雜架構中,有許多關鍵組件在幕後默默運行,保障着系統的穩定與高效,IOMMU 便是其中之一。或許對於不少人來說,IOMMU 這個名字還稍顯陌生,但它卻在 I/O 設備與內存交互的關鍵環節中扮演着舉足輕重的角色。它就像一位幕後的調度大師,精準地協調着 I/O 設備對內存的訪問,讓數據的傳輸有條不紊地進行。從它誕生的那一刻起,就致力於解決計算機發展進程中遇到的各種內存訪問難題。今天,就讓 ⌘ Read more
1\. 從內核看 epoll 機制-------------------- select 和 poll 雖然能夠實現 IO 複用的功能,但是由於設計的缺陷,select 和 poll 無法處理海量的網絡連接,並且隨着網絡連接數量的增加,select 和 poll 效率越來越低。 此時急需一種更爲高效的 IO 複用機制解決海量併發請求問題,epoll 機制就是爲了解決該問題而誕生的。要理解 ⌘ Read more
應用架構的設計大概分爲以下幾個階段: 圖例:應用架構設計方法整體概述階段 1:需求分析---------圖例:應用架構設計 - 需求分析階段 本階段的主要工作就是進行需求分析。 通過業務架構中的業務能力與業務流程,進一步梳理業務流程,提取業務活動及相關操作。這個階段要和業務團隊緊密合作,瞭解真實的業務流程和業務需求,並通過業務語言建立統一的溝通語言,確定相關的流 ⌘ Read more
在 Go 語言中,Optional 模式和 Builder 模式都是用於對象構建和配置的重要設計模式,但它們各自具有獨特的特點和應用場景。但是使用起來也是非常的類似,就好比電動車和摩托車,都能讓你不費太多力氣的騎行,把你送到目的地,這篇文章我們就來討論一下這兩個模式的本質區別和不同的使用場景。我們首先聲明一個結構體,後面我們就研究使用兩種不同方式來創建這個結構體的實例:type Person st ⌘ Read more
selfupdate 提供更新程序,用於從各種版本分發後端就地更新 rust 可執行文件。該庫的一些特性如下:archive-tar:支持 tar 歸檔格式; archive-zip:支持 zip 存檔格式; compression-flate2:支持 gzip 壓縮; compression-zip-deflate:支持 zip 的 deflate 壓縮格式; compr ⌘ Read more
當我們要更改線程之間共享的數據時,必須使用 Mutex(互斥標誌,Mutually exclusive)來同步線程,否則結果可能出乎意料。const std = @import("std");const Thread = std.Thread;const Mutex = Thread.Mutex;const SharedData = struct { mutex: Mutex, val ⌘ Read more
對於很多深入研究計算機底層架構的朋友來說,CPU 緩存一致性無疑是一個繞不開的關鍵話題。從單核處理器邁向多核時代,計算能力呈指數級增長,可隨之而來的挑戰也接踵而至。CPU 爲了加速數據存取,引入了多層緩存結構,這本是提升性能的妙招,然而,當多個核心同時讀寫共享數據時,緩存中的數據副本如何保持同步、確保一致,就成了棘手難題。這涉及到複雜的硬件協議、緩存控制機制以及軟件層面的優化策略。CPU 緩存一致 ⌘ Read more
在軟件開發的世界裏,代碼質量就是生命線,而內存管理又是這條生命線中最脆弱的一環。內存泄漏,哪怕只是微小的一處,日積月累,都可能對整個系統造成災難性的打擊,無論是大型企業級應用、實時性要求極高的嵌入式系統,還是對性能錙銖必較的遊戲開發。此時,掌握一款強大的內存檢測工具至關重要,Valgrind 便是這樣的利器。它以其精準、全面的檢測能力,成爲衆多開發者捍衛代碼質量的 “祕密武器”。今天,我們就深入探 ⌘ Read more
名字空間是由虛擬機在運行時動態維護的,但有時我們希望將名字空間靜態化。換句話說,我們希望有的代碼不受名字空間變化帶來的影響,始終保持一致的功能該怎麼辦呢?隨便舉個例子:def login(username, password, user): if not (username == "satori" and password == "123"): return "用戶名密碼不正確 ⌘ Read more
本文是經過嚴格查閱相關權威文獻和資料,形成的專業的可靠的內容。全文數據都有據可依,可回溯。特別申明:數據和資料已獲得授權。本文內容,不涉及任何偏頗觀點,用中立態度客觀事實描述事情本身。 大家好我是小豬,今天我繼續給大家分享乾貨。熟悉我的人,都知道我真正的乾貨一般在中間和末尾部分。請耐心看完!謝謝用 C 語言創建一個簡化版的 GCC(GNU 編譯器套件)。雖然 GCC 本身是一個複雜且功能豐富的 ⌘ Read more
對於支付安全我自認比絕大部分支付行業的同行都專業,當年爲了做統一密鑰管理和加解密加驗籤平臺,啃了好幾本密碼學和信息安全的大部頭書。但我今天以產品經理都能看懂的白話講清楚支付安全體系,不涉及複雜的數學知識。前言在電子支付的萬億級市場中,安全無疑是核心中的核心。大部分人都知道支付安全很重要,但支付安全具體包括哪些方面,面臨的問題,以及有哪些具體技術或方案來應對,包括在支付行業從業多年的老支付人,卻未必 ⌘ Read more
在計算機網絡的世界裏,數據的傳輸與處理猶如一場精密的交響樂演奏。當內核收到了一個網絡包,就如同指揮家收到了新的樂譜信號,接下來一系列的操作將決定這個‘音符’如何在系統中奏響。從硬件底層到軟件上層,從網卡驅動到協議棧處理,每一個環節都緊密相扣,共同完成數據的接收、解析與傳遞。現在,讓我們深入探究一下,當內核收到一個網絡包後,究竟會發生什麼。一、網卡 “迎接” 網絡包-------------1.1 ⌘ Read more
問題背景假設你擁有一個包含大量聯繫人信息的 CSV 文件,需要將這些信息遷移到數據庫中。這些聯繫人信息可能包含姓名、電話號碼、郵箱地址等。如果使用傳統的單線程方式,逐條處理數據,遷移過程可能會非常緩慢,尤其是在數據量很大時。在處理大量的 CSV 文件數據並遷移到數據庫時,使用併發可以顯著提升處理效率。Go 語言的 goroutine 和通道(channel)非常適合用來併發地處理數據。下面我將給出 ⌘ Read more
整理列舉一下全球各國的主要 999 個支付方式不用都記住,但可以收藏起來,沒事看一看,養養眼,需要時查一查,非常方便首先了解一下主要的卡組織全球主要的卡組織在信用卡和支付領域扮演着至關重要的角色,在全球範圍內提供着廣泛的支付和金融服務,促進了商業活動的便利性和全球化。以下是一些全球範圍內知名的卡組織: Visa(維薩):覆蓋全球範圍內幾乎所有國家。涉及信用卡、借記卡、電子錢包等支付服務,以及跨境 ⌘ Read more
線程池解決了兩個不同的問題:在執行大量異步任務時,由於減少了每個任務的調用開銷,線程池通常能提高性能;在執行一系列任務時,線程池提供了一種約束和管理資源(包括線程)消耗的方法。const std = @import("std");const print = std.debug.print;pub fn main() @void { var arena = std.heap.ArenaAllo ⌘ Read more=
我們可以用 Stale-While-Revalidate 加速頁面訪問,策略分 3 步在收到頁面請求時首先檢查緩存,如果命中緩存就直接從緩存中返回給用戶 將緩存返回用戶的同時,在後臺異步發起網絡請求,嘗試獲取資源的最新版本 獲取成功後更新緩存,下次使用 而這一切的幕後功臣便是 Service Worker,作爲一個後臺代理在網絡與緩存之間搭建橋樑,提供了豐富的緩存管理和資源控制能 ⌘ Read more
傳統的三層架構-----------1.1 Controller 層: 接收用戶請求, 調用 Service 完成業務操作, 並將 Service 輸出拼裝爲響應報文向客戶端返回。1.2 Service 層: 初衷是在 Service 層實現業務邏輯, 往往還需要與基礎設施 (數據庫、緩存、外部服務等) 交互。1.3 Dao 層: 負責數據庫讀 / 寫。1.4 Model 層: 貧血模型, 往往與 ⌘ Read more
在日常工作中,分享報價單、企劃案等重要文檔時,我們通常會選擇網盤或即時通訊軟件。但商業文檔常常被識別爲敏感內容導致無法分享,文件的訪問權限也難以管控。更重要的是,我們無法知道對方是否認真閱讀了文檔內容。專業的文檔分享平臺如 DocSend 確實能解決這些問題,但昂貴的費用,讓很多小團隊和個人都望而卻步。今天要和大家分享一個完全開源的文檔分享平臺: Papermark。它不僅提供了專業的文檔追蹤功能 ⌘ Read more
Hello,大家好,我是 Sunday。時間進入 2025 年,前端技術領域依然熱火朝天,各種開源項目層出不窮。那麼,今天 Sunday 就爲大家盤點幾款 2025 年值得關注的頂級前端開源項目!Vite-------作爲尤雨溪開發的前端構建工具,Vite 這幾年可真是風頭無兩。前段時間 Vite 6 的發佈,雖然只是一個 “過渡版本” 但是依然引起了前端圈號主的追捧。在現在,Vite 的聲望甚至 ⌘ Read more
Linux 這片充滿無限可能的操作系統天地裏,進程間通信猶如一條隱祕而強大的紐帶,將一個個獨立運行的進程緊密相連,編織出複雜而精妙的軟件生態網絡。想象一下,在一個龐大的 Linux 系統中,衆多進程如同忙碌的小工匠,各自專注於特定的任務。有的進程負責處理用戶輸入,有的在後臺默默管理着系統資源,還有的在進行復雜的數據運算。然而,若沒有進程間通信,這些進程就只是孤立的個體,無法協同工作,整個系統也將陷 ⌘ Read more
實驗介紹本實驗使用 Keepalived 爲 LVS 提供高可用服務,同時 LVS 爲後端的 Nginx1 和 Nginx2 提供負載均衡服務,最終通過 Keepalived+LVS 實現 Nginx 高可用負載均衡集羣。組網介紹如下圖所示,本實驗由 5 臺主機組成,Nginx1 和 Nginx2 提供 web 服務,LVS1 和 LVS2 通過 Keepalived 組成高可用集羣,向後端的 N ⌘ Read more
你是否曾經遇到過在 linux 系統中出現的各種內存問題?比如內存泄漏、內存碎片等等。這些問題都可以通過深入理解 linux 內存模型得到解決。一、前言在 linux 內核中支持 3 中內存模型,分別是 flat memory model,Discontiguous memory model 和 sparse memory model。所謂 memory model,其實就是從 cpu 的角度看, ⌘ Read more
springCloudStream簡介--Spring Cloud Stream是一個框架,用於構建與共享消息傳遞系統連接的高度可擴展的事件驅動微服務。該框架提供了一個靈活的編程模型,該模型建立在已經建立和熟悉的 Spring 習慣用語和最佳實踐之上,包括對持久發佈 / 訂閱語義、消費者組和有狀態分區的支持。核心模塊• Destination Binders: 負責提供與外部消息系統集成的組件 ⌘ Read more
在本地環境中配置 HTTPS 一直以來是開發者的痛點,手動創建 SSL 證書、配置信任存儲不僅繁瑣,還容易出錯。今天給大家介紹一個開源神器——mkcert!它能讓你快速生成本地受信任的 SSL/TLS 證書,輕鬆打造安全的 HTTPS 開發環境,成爲許多開發者的首選。什麼是 mkcert?mkcert 是由 Filippo Valsorda 開發的一款免費開源工具,專門用於生成受信任的本地 SSL ⌘ Read more
今天來給大家介紹一個實用功能,如何遍歷一個文件夾。Dir 裏提供了一個方便的 walk 方法,它可以直接實現這個目的:const std = @import("std");const fs = std.fs;const print = std.debug.print;pub fn main() @void { var gpa = std.heap.GeneralPurposeAllocato ⌘ Read more=
前言--在處理過的幾個千萬級 TPS 的 Kafka 集羣中,消息追蹤始終是一個既重要又棘手的問題。一條消息從 Producer 發出後,經過複雜的處理流程,最終被 Consumer 消費,中間可能會經歷重試、重平衡、多副本複製等多個環節。如果沒有完善的追蹤機制,一旦出現問題將很難定位。本文將詳細介紹 Kafka 消息軌跡的實現方案。Kafka 消息處理模型---------------在設計追蹤 ⌘ Read more
背景--需要爲服務配置 HTTPS 證書,並實現證書的自動更新功能。解決方案----使用 acme.sh 實現證書的自動更新。以下是具體的實施步驟:安裝 acme.sh-------------curl https://get.acme.sh \| sh安裝完成後,系統會自動添加定時任務:$ crontab -l23 2 "/home/xxxx/.acme.sh"/acme.sh --cron ⌘ Read more
LLM Agent 是什麼大語言模型智能體是一種程序,其執行邏輯由其底層模型控制。大語言模型智能體與少樣本提示或固定工作流程等方法的區別在於,它能夠定義和調整執行用戶查詢所需的步驟。通過使用一組工具(如代碼執行或網絡搜索),智能體可以決定使用哪個工具、如何使用它,並根據輸出對結果進行迭代。這種適應性使系統能夠以最小的配置處理各種用例。智能體架構存在於一個範圍內,從固定工作流程的可靠性到自主智能體的 ⌘ Read more
Redisson 的看門狗機制是其分佈式鎖實現中的一個關鍵特性。看門狗主要用於自動管理鎖的持有時間,確保在對共享資源進行操作時鎖不會意外過期,從而避免潛在的併發問題。什麼是看門狗“看門狗”(Watchdog)是一個廣泛應用於計算機科學和工程領域的術語,指的是一種監控機制,用於監督系統、應用程序或硬件的正常運行,並在檢測到異常或故障時採取預定義的恢復措施。看門狗的主要目的是提高系統的可靠性和穩定性, ⌘ Read more
有去 O(ORACLE 數據庫)、信創、國產化數據庫等項目實踐的同學應該都遇到過不同數據庫之前進行數據遷移的問題,雖然有各種工具可以實現,但是有些工具的部署、使用比較複雜,也有些工具遷移數據效率很低。本文將介紹一款開源且部署、使用簡單、遷移相對高效的數據庫中間件 DBSyncer 來進行數據遷移。該工具支持 Oracle、MySQL、PostgreSQL、 SQL SERVER、ES、Ka ⌘ Read more
作爲技術人員,撰寫產品需求文檔(PRD)並不是我的強項,但我始終相信,一個人也能像一支隊伍一樣去完成任務。我認爲,事情從來不是一次就做到完美,而是通過不斷試錯和打磨,逐步接近理想的狀態,直到最終成型,成爲大家喜歡的樣子。現在,我可能還做得不夠好,但我無法接受自己不去做這件事,只要開始,就能一點一點走向更好。1. PRD 的核心內容----------------PRD 需要簡潔地描述產品的目標、功 ⌘ Read more
前言--現在很多網站都開啓了 2FA(Two-Factor Authentication,雙因素認證),如 GitHub、Google、微軟等。這種額外的安全層顯著提高了賬戶的安全性。本文將深入探討如何使用 Go 語言實現 TOTP 生成器,並詳細解釋其工作原理和安全考慮原理解析----兩步驗證要求用戶提供兩種不同形式的身份驗證:知識因素:用戶知道的信息(如密碼) 所有權因素:用戶擁有的設 ⌘ Read more
HTTP 代理可以說是每個開發者都繞不開的工具。幾乎每天都會使用,但你真的瞭解 HTTP 代理的原理嗎? 說明:這裏討論的 HTTP 代理是指 HTTP Proxy Server,具體是正向 HTTP 代理服務端的原理和實現。想了解 HTTP 代理的原理,最嚴謹的方法是閱讀 RFC 文檔,但這同時也是最困難的方式。今天,我將介紹一種更直觀的學習技巧。從名字上就可以看出,HTTP 代理基於 HTT ⌘ Read more
作者:louis,作者公衆號:支付進階之路前言用過 DDD 的同學會知道,自己用倒沒什麼,一旦到了要推广部門內使用的時候就會非常困難。爲什麼會這樣?做爲一個有 8 年 DDD 實戰經驗的過來人,我想嘗試分析一下原因:過多的概念讓人望而生畏,這也是 DDD 飽受詬病的地方,在推廣 DDD 的過程中我不止一次聽到 “DDD 太複雜了,在我們這裏沒法落地”。 也是由於初始學習曲線過於陡峭,大部分人 ⌘ Read more
你想想,咱們每天使用的電腦、手機等各類智能設備,之所以能流暢運行形形色色的功能,背後離不開 Linux 內核驅動着海量的硬件。而在這繁雜的硬件驅動初始化過程中,initcall 機制宛如一位運籌帷幄的指揮官,不動聲色地將一切安排得井井有條。當系統啓動的號角吹響,衆多硬件驅動就像等待檢閱的士兵,急切地需要按恰當順序、在精準時機完成初始化,才能確保整個系統順利啓航。要是沒有 initcall 機制,這 ⌘ Read more
前言如果你看過Go 語言中Gin 框架的官方文檔,你可能會注意到一條重要的提醒:當在中間件或 handler 中啓動新的 Goroutine 時,不能使用原始的上下文,必須使用只讀副本。文檔中還提供了以下示例代碼:func main() { r := gin.Default() r.GET("/longasync", func(c gin.Context) {// 創建在 goroutine 中使 ⌘ Read more=
隨着微信小程序的普及,開發者需要一種高效的方式向用戶傳遞重要信息。訂閱消息作爲一種官方推送機制,可以在用戶授權的前提下主動發送消息。本文將詳細解析微信小程序訂閱消息的使用場景、實現流程及注意事項,幫助開發者高效利用這一能力。什麼是訂閱消息-------訂閱消息是一種無需用戶主動觸發即可發送的單向消息推送方式。不同於服務通知,訂閱消息需要用戶明確授權,開發者可以在特定場景下向用戶發送事先約定的信息。 ⌘ Read more
指針是 Go 語言中最強大但也最容易出錯的特性之一。本文將帶你從基礎概念到高級應用,全方位掌握 Go 指針的使用技巧。無論你是初學者還是老手,都能在這裏找到價值。一、指針基礎:從零開始什麼是指針? Go 語言中的指針是一個用來存儲變量內存地址的變量,可以使用 & 運算符獲取變量的地址,使用 \
\
運算符獲取指針所指向的變量的值,可以進行運算來移動指針。var a int = 10var p ⌘ Read more=
大家好,我是隱墨星辰,專注境內 / 跨境支付架構設計十餘年。今天串講支付系統的 7 大核心子域 / 模塊,包括收單結算,資金產品,收銀支付,渠道網關,會員平臺,商戶平臺,賬務中心等。一個完整的支付系統包含了很多模塊或子域,在跳過幾家公司後,發現各家支付公司的系統,從邏輯劃分上基本大同小異,有些名字不一樣,但本質是一樣的,因爲大家基本都脫胎於銀行,而銀行就那麼幾家供應商。當然,代碼實現或技術棧差異非 ⌘ Read more
Retrieval-Augmented Generation(RAG)架構正發揮着日益重要的作用。它通過在 AI 生成過程中引入外部知識檢索,極大地提升了 AI 回答的準確性和全面性,從基礎的文檔查詢逐步發展爲多模態、多智能體協同的智能架構。本文將概覽 RAG 架構從基礎到高級的 7 種模式及其核心組件。一、RAG 的 7 種模式(一)Naive RAG:基礎架構的構建Naive RAG 是 RA ⌘ Read more
在現代併發編程中,Rust 的 Tokio task 和 Go 的 goroutine 都是響噹噹的併發原語。今天,我們將深入剖析它們的區別,看看各自的優缺點!基本概念對比------Go Goroutinefunc main() { // 啓動一個goroutine go func() { fmt.Println("Hello from goroutine!") ⌘ Read more
前言--大家好,我是田螺。我們日常開發中,經常跟 MQ(消息隊列) 打交道。本文田螺哥梳理了 MQ 的 8 種使用場景。異步處理-------面試官在問我們 MQ 作用時,很多夥伴馬上想到異步處理、解耦、流量削鋒等等。MQ 最常見的應用場景之一就是異步處理。 比如,在用戶註冊場景中,當用戶信息保存成功後,系統需要發送一個短信、或者郵箱消息,通知用戶註冊成功。如果這個短信或者郵箱消息發送比較耗時, ⌘ Read more
在新生代做 GCRoots 可達性掃描過程中,可能會碰到跨代引用的對象的問題,如下圖所示: 在新生代掃面的時候會掃描不到 D 對象,如果這個 D 對象不去老年代掃描是否有被引用,那麼就會無法觸達,如下如所示: 但是 D 對象是有被引用的,如果直接回收 D 對象就會造成一些意想不到的問題,如果爲了掃描 D 對象是否存在跨代引用而對老年代整體掃描一遍,就會帶來整個垃圾回收的效率低下 ⌘ Read more
Kafka 是一個高吞吐量、可擴展的分佈式消息系統,廣泛應用於實時數據流處理場景。監控 Kafka 是確保其平穩運行和及時處理問題的關鍵。本文將介紹如何使用 Golang 來執行 Kafka 的監控任務。前置準備----安裝依賴庫: 安裝 Sarama,用於 Kafka 的操作$ go get github.com/Shopify/sarama 安裝 Kafka 管理擴展$ go get g ⌘ Read more
不管使用什麼語言,內存泄露是經常遇到的一類問題,然而使用 Go 語言編寫內存泄露的代碼卻不容易,本文將列舉幾個可能出現內存泄露的場景,從反例中學習如何避免內存泄露。資源泄露----不關閉打開的文件當你不再需要一個打開的文件, 正常你需要調用它的 Close 方法, 如果你不調用 Close,就有可能文件描述符達到最大限制,無法再打開新的文件或者連接, 程序會報too many open files ⌘ Read more
大家好,我是隱墨星辰,深耕境內 / 跨境支付架構設計十餘年。本文主要講清楚支付系統訂單號(或業務 ID)各種設計方案對比,各子域的訂單號(或業務 ID)爲什麼要統一規範,以及最佳實踐。最後還會簡單分析微信支付和支付寶的對客訂單號的組成差異。假如你也好奇爲什麼有了數據庫自增 ID 外還需要業務 ID,或者想了解如何在業務 ID 中編織進業務信息比如業務系統,數據版本,分庫分表位等,值得花幾分鐘瞭解一 ⌘ Read more
你有沒有想過,當你在電腦上同時打開多個程序,一邊聽音樂、一邊寫文檔,還掛着下載任務時,系統是怎麼有條不紊地運作,不讓這些程序 “打架” 爭內存的呢?答案就藏在這神奇的分頁機制裏。它就像是一位擁有超能力的空間魔法師,面對有限的物理內存“空間”,大手一揮,將虛擬的邏輯地址空間和物理內存空間,都精準地劃分成了一塊塊同等大小、排列規整的“魔法方塊”——也就是頁。然後,憑藉着一套如同精密齒輪組般的映射規則, ⌘ Read more
在 Linux 上,我們經常使用計劃任務來執行一些定時任務,比如,在凌晨執行數據庫備份、進行賬務日結操作等。在我們的 Golang 應用中,我們也想執行一些定時任務,怎麼辦?cron 是 Golang 的一個定時任務庫,被廣泛應用於 Golang 應用中。cron 目前使用的 V3 版本,默認支持 Linux cron 表達式,沒有秒的字段。Linux cron 表達式格式: comma ⌘ Read more
在互聯網業務中我們會遇到千萬級別數據量的表需要拆分成多表存儲,或者底層的數據存儲介質的變更等原因都需要做數據的遷移,今天我們來聊聊數據的遷移方案。 1、數據的遷移策略 假設現在又一張千萬級別的訂單明細表,我們需要拆分成多張子表存儲,那麼我們按照什麼規則來將訂單的明細放入子表中呢? (1)哈希取模方式 訂單明細中可以選擇訂單 id 作爲 key 進行哈希取模來確定數據應該 ⌘ Read more
Redis 作爲一個高性能的鍵值存儲系統,得益於其諸多巧妙的設計。這篇文章,我們將分析 Redis 源碼中 10 個典型設計示例,並詳細解析其設計理念和實現細節。1. 單線程事件驅動模型1.1 設計理念--------Redis 採用單線程的事件驅動模型來處理客戶端請求,這與傳統的多線程或多進程模型不同。單線程模型的核心理念是通過非阻塞的 I/O 多路複用技術,在一個線程中高效地處理大量併發連接, ⌘ Read more
行爲模式旨在解決對象間通信和交互相關的問題,專注於定義那些複雜到無法靜態設計的協作策略,這些協作策略使得程序可以在運行時動態地進行職責派遣以實現更好的擴展。今天我們開始第 8 個行爲模式的學習 —— Observer(觀察者模式)。問題背景:-----觀察者模式用於當對象之間存在一對多關係時,即一個對象的變化需要傳播給多個其他對象。它允許被觀察對象的狀態發生變化時,其他依賴對象能自動收到通知並進行 ⌘ Read more
大家好,我是君哥。Disruptor 是一款高性能的內存有界隊列,它通過內存預分配、無鎖併發、解決僞共享問題、使用 RingBuffer 取代阻塞隊列等措施來大幅提升隊列性能。但開發者們往往對它的使用場景不太瞭解,到底應該在哪些場景使用呢?今天咱們就來聊一聊 Disruptor 的使用場景。Disruptor 是一個生產 - 消費模式的隊列,這裏我們使用官網的示例,生產者發送一個 long 類型的 ⌘ Read more
啓動一個新的 Rust 項目就像運行 cargo new 一樣簡單,但是當你的項目需要特定的配置 (比如嵌入式開發) 時,這種簡單性可能會成爲一把雙刃劍。這就是 cargo-generate 發揮作用的地方,它作爲一個通用的項目模板工具,用自定義模板簡化了 Rust 項目的設置。什麼是 cargo-generate?cargo-generate 是一個開發人員工具,它使你能夠從存儲在 Git 存儲 ⌘ Read more
如何使用 Redis 構建一個簡單的聊天應用程序?下圖展示了我們如何利用 Redis 的 pub-sub 功能來開發聊天應用程序。第 1 階段:連接初始化------------第 1 和 2 步:Bob 打開聊天應用程序。在客戶端和服務器之間建立 Web Socket 連接。 第 3 和 4 步:pub-sub 服務器會與 Redis 建立多個連接。其中一個連接用於更新 Redis 數據模 ⌘ Read more
當計算機系統啓動,Linux 內核被加載到內存中,它就像是一位初來乍到的管理者,面臨着諸多棘手難題。一方面,內核在啓動的最初階段,常規的內存管理機制,如大名鼎鼎的夥伴系統(Buddy System)還尚未準備就緒,無法投入使用;另一方面,系統運行又急需內存,從內核自身的數據結構初始化,像進程控制塊(PCB)、各種內核模塊的加載,到早期硬件設備的驅動程序初始化,無一不需要內存空間來存儲信息。想象一下 ⌘ Read more
如今,我們的生活已經離不開便捷多樣的支付方式。無論是喫飯、看電影、網上購物,還是使用共享單車、繳納水電費、話費充值,所有跟支付相關的流程都可以通過各種支付手段輕鬆完成。我們可以選擇使用微信、支付寶,也可以選擇現金支付,或者通過銀行 APP 完成支付。甚至,我們還能通過跨境支付方式,購買到其他國家的優質商品。總之,支付已經滲透到生活的方方面面,無處不在。難以想象,如果突然失去了這些支付方式,我們的生 ⌘ Read more
Protobuf 是 Google 的語言中立的數據交換格式。早在 2020 年 3 月,就發佈了 google.golang.org/protobuf 模塊,這是對 Go protobuf API 的重大修訂。該包引入了對反射的一流支持、一個 dynamicpb 實現和 protocmp 包,以便於測試。現在,我們將爲生成的代碼發佈一個新的 API,我們將說明創建新 API 的動機,並展示如何在 ⌘ Read more
作者:jiayan 工作中的部分項目使用到了 gin 框架,因此從源碼層面學習一下其原理。1. 概述Gin 是一款高性能的 Go 語言 Web 框架,Gin 的一些特性:快速 基於 Radix 樹的路由,小內存佔用,沒有反射,可預測的 API 性能。 支持中間件 傳入的 HTTP 請求可以由一系列中間件和最終操作來處理,例如:Logger,Authorization,GZIP,最終操作 D ⌘ Read more
直播不同於普通的流媒體,因爲視頻內容是通過互聯網實時發送的,延遲時間通常只有幾秒鐘。下圖解釋了實現這一功能的過程。第 1 步:原始視頻數據由麥克風和攝像頭採集。數據被髮送到服務器端。 第 2 步:對視頻數據進行壓縮和編碼。例如,壓縮算法會分離背景和其他視頻元素。壓縮後,視頻按照 H.264 等標準進行編碼。經過這一步驟後,視頻數據的大小會小得多。 第 3 步:編碼後的數據被分成更小的片 ⌘ Read more
在討論了 RAG 的 chunking、embedding、評估指標、評估流程等技術後,我們進一步探討 RAG 系統的實際應用。在實際項目中,RAG(Retrieval-Augmented Generation)系統的檢索階段往往是影響生成效果的核心環節。RAG 系統的工作流程包括數據攝取(Data Ingestion)和數據查詢(Data Querying),其中檢索是至關重要的一步。本文介紹了 ⌘ Read more
命令行工具是程序員的好朋友,但在構建命令行工具時,解析命令行參數可能讓人有些頭疼。雖然 Rust 生態已經有了 clap 、 structopt 這樣的成熟庫,但自己實現一個簡單的命令行解析庫,不僅能幫助我們更好地理解 Rust 的特性,還能練習一些常用技巧,比如 字符串處理 、 錯誤處理 和 模式匹配 。今天就來寫一個屬於自己的命令行解析工具,功能雖然簡單,但足夠實用。目標設定:一個輕量的命令行 ⌘ Read more
Go 開發中,context 包已經成爲一個必不可少的工具。它提供了一種在不同的 goroutine 之間傳遞請求範圍內變量、取消信號和截止時間的方法。通過合理地使用 context,我們可以使代碼變得更智能、更安全,並且更易於擴展。本文將詳細探討 context 的作用以及如何在實際開發中應用它。什麼是 Context?------------context 是 Go 1.7 引入的一個標準庫 ⌘ Read more
行爲模式旨在解決對象間通信和交互相關的問題,專注於定義那些複雜到無法靜態設計的協作策略,這些協作策略使得程序可以在運行時動態地進行職責派遣以實現更好的擴展。 今天我們開始第 9 個行爲模式的學習 —— Strategy(策略模式)。問題背景:-----策略模式用於當有多種可以互換的算法或策略來完成特定任務時。使用這些算法的客戶端不需要知道算法的具體實現細節。解決方案:-----定義一個所 ⌘ Read more
如果您喜歡我的文章,還請您點擊頁面底部的 “關注” 按鈕,關注我的公衆號。您的關注對我很重要,感謝大家!在 Bash 編程中,錯誤處理和代碼健壯性往往是開發者容易忽略的領域。雖然許多開發者熟悉 set -e 選項(在腳本中啓用出錯退出),但 set -uo pipefail 提供了更全面的保護措施,可以顯著提高腳本的安全性和可靠性。本文將詳細介紹這些選項的作用、它們如何改進你的腳本,以及如何在實際 ⌘ Read more
今天我們就從頭到尾,用最簡單的大白話,把 CMake 的用法講清楚!看完這篇文章,你一定會覺得:“CMake 原來這麼簡單!”在正式開始之前,先通過一張思維導圖,幫你快速瞭解 CMake 的全貌,這樣你心裏會更有底:基礎篇---1. 什麼是 CMake?爲什麼用它?CMake 是一個跨平臺的項目構建工具,通俗點說,它會幫你生成 Makefile 或其他編譯系統需要的構建文件。用 CMake 的好處 ⌘ Read more
你好,我是猿 java現如今,微服務已經成了很多中大型互聯網公司的標配,不同的公司採用的設計模式可能不一樣,因此,這篇文章,我們來分析下微服務中常見的 9 種設計模式:API Gateway Pattern(網關模式) Service Registry Pattern(服務註冊表模式) Circuit Breaker Pattern(斷路器模式) Saga Pattern(Sag ⌘ Read more
Deno 和 Bun 是新一代的 JavaScript 運行時,在它們出現之前,服務端的 JavaScript 運行時就只有 Node.js 一個選擇。這倆的出現,一方面是開發者對現狀的不滿,從而想改進;另一方面是邊緣計算逐漸崛起,遵循 Web Standards 的輕量級運行時,市場上有需求。剛剛發佈的 Deno 2.0 聲稱自己是最快的 [1]。但是 Bun 也立刻跟進,說我們更快。這引起了我 ⌘ Read more
引言--在現代軟件開發中,數據庫是不可或缺的一部分。PostgreSQL 作爲一個功能強大且開源的關係型數據庫,廣泛應用於各種場景。而 Rust 作爲一種系統級編程語言,以其內存安全和高性能著稱。將 Rust 與 PostgreSQL 結合,不僅可以發揮兩者的優勢,還能爲開發者提供一種高效、安全的開發體驗。本文將帶你從零開始,學習如何在 Rust 中使用 PostgreSQL 進行數據庫操作,並通 ⌘ Read more
摘要檢索增強生成(RAG)技術在整合最新信息、減輕幻覺以及提升響應質量方面表現出色,特別是在專業領域。儘管許多 RAG 方法被提出以通過查詢依賴檢索來增強大型語言模型,但這些方法仍面臨複雜的實施和較長的響應時間問題。通常,RAG 工作流涉及多個處理步驟,每個步驟可以通過不同的方式執行。本文探討了現有的 RAG 方法及其潛在組合,以確定最佳 RAG 實踐。通過大量實驗,提出了一些部署 RAG 的策 ⌘ Read more
在 Rust 中處理高併發:tokio 的深度解析高併發 ,聽起來是不是很厲害的樣子?其實也沒啥,就是讓程序在同一時間幹更多的活兒。Rust 作爲一個追求 “安全” 和“速度”的語言,在高併發領域表現得相當亮眼。而在 Rust 生態中, tokio 是處理異步任務的王者,堪稱多線程場景下的 “工具人”。今天聊聊 tokio,看看它到底好在哪兒,以及怎麼用它寫出又快又穩的代碼。tokio 是個啥?爲 ⌘ Read more
提示工程(prompt engineering),簡而言之,是構建和優化輸入提示以引導 LLMs 生成準確且富有洞察力的輸出的藝術和科學。在 LLMs 的世界裏,一個精心設計的提示就如同一位經驗豐富的嚮導,能夠引領模型穿越複雜的信息海洋,找到用戶心中的答案。一、理解提示與提示工程(prompt engineering)---------------------------------------( ⌘ Read more
探索 Rust 中的 Zero-Copy 技術Rust 的性能經常被人吹得天花亂墜,其中一個重要原因就是它對內存的掌控力。今天聊聊一個很酷的技術 —— Zero-Copy ,翻譯過來就是 “零拷貝”。它聽起來有點像黑魔法,但其實背後很有邏輯。簡單來說,這個技術的目標就是:在處理數據時,儘可能少地複製或移動數據,直接在原始數據上操作,從而節省性能。Rust 的內存安全模型讓這個技術更容易實現,咱們來 ⌘ Read more
複製(Replication)什麼是複製----- 官網:https://dev.mysql.com/doc/refman/8.0/en/replication.htmlMySQL Replication 是官方提供的主從同步方案,也是用的最廣的同步方案。Replication(複製) 使來自一個 MySQL 數據庫服務器(稱爲源(Source))的數據能夠複製到一個或多個 MySQL 服務器( ⌘ Read more
微信在用的消息順序保障技術,背後到底有什麼祕訣? 在數字化時代的日常交流中,在線聊天工具已經深入人心。 可別小看這背後的技術難題,當你在手機上看到消息井然有序地滾動時,背後的系統已爲此歷經千辛萬苦。 尤其在即時通訊領域,維持消息按發送時間展示是門高深的學問——這就是我們今天要談的消息時序性。下面,我們將深入探討如何在個人項目中確保消息的時序性。 本文不只適用於聊天場景,對於有序消息處理、數 ⌘ Read more
前言衆所周知,如果我們想要開發一些帶有付費功能的系統,例如髮卡平臺、個人商城平臺或者具有付費包月開通功能權限的平臺,這些平臺都需要我們在系統中對外提供支付功能並能夠獲取支付狀態。很久之前,我爲了方便找了一個支付平臺,即第三方給你提供生成收款碼和讀取支付回調的渠道,它們的平臺支持各種聚合支付,微信支付寶銀聯等等。這種平臺非常容易跑路,因爲你的客戶在你平臺付款的錢,全都存放在你所對接的支付平臺的系統中 ⌘ Read more
交易過程中或者完結以後,記賬工作就開始了,賬務作爲支付交易的基礎設施非常重要,其關鍵並不是設計本身,而是賬務的設計理念、規範和原則。本文將詳細介紹賬務相關係統的設計方法,並從賬務原理、賬戶子系統、熱點賬戶、賬戶合併、會計日切原理、營銷類賬務處理、清結算的賬務實現模型等 10 方面瞭解賬務及賬戶的相關內容。賬務實現原理現代支付的底層就是賬務,無賬務不支付,無賬戶不資金。既然賬務這麼重要,那麼搭建一套 ⌘ Read more
根據《A survey on large language model based autonomous agents》智能體綜述文章,Agent 核心是需要具備以下幾個核心特性與模塊:Profile 模塊: Profile 模塊的目的主要是做 Agent 角色認定,回答的核心問題有: 我是誰?我在哪?我該幹什麼?無論是在當前的人與人之間的協同,還是人與智能體的協同,亦或是智能體與智能體間的協同。 ⌘ Read more
行爲模式旨在解決對象間通信和交互相關的問題,專注於定義那些複雜到無法靜態設計的協作策略,這些協作策略使得程序可以在運行時動態地進行職責派遣以實現更好的擴展。今天我們開始第 7 個行爲模式的學習 —— Mediator(中介者模式)。問題背景:-----中介模式用於當一組對象需要以鬆散耦合的方式相互通信時。在複雜系統中,對象之間的直接通信會導致緊耦合和增加複雜性。中介模式有助於集中和控制對象間的通信 ⌘ Read more
那麼,什麼是布隆過濾器?它有什麼特點?Redis 是怎麼支持布隆過濾器的?本文就試圖來回答這些問題,歡迎點贊、分享,謝謝!一什麼是布隆過濾器布隆過濾器是一種概率型的數據結構(Probabilistic Data Structure),它佔用空間少,運行效率高,但返回的結果是概率性而不是確切性的,它可以回答:某個元素在集合中肯定不存在,或者有可能存在。粗看起來好像有點奇怪,什麼叫有可能存在?存在就是 ⌘ Read more
大家好,我是隱墨星辰,深耕境內 / 跨境支付架構設計十餘年。今天介紹收單平臺。收單結算是支付系統最重要的子域之一,行業內經常把有牌照的支付平臺稱爲 “收單機構” 就可見一斑。有些監管嚴格的國家地區,沒有收單牌照就不能碰收單和結算,商戶必須入駐到有收單牌照的支付機構。不過,在我剛進入支付行業時,還沒有收單平臺的概念,那時系統還是單體應用,就只是建了一張商戶訂單表,用於保存商戶訂單信息,就是最簡單的收 ⌘ Read more
分佈式日誌系統是現代微服務架構中的重要組成部分。無論是調試還是排查問題,日誌都是開發者的眼睛。而分佈式環境下,日誌的收集和存儲就顯得尤爲複雜。今天,我們就來聊聊如何用 Rust 編寫一個簡單的分佈式日誌系統,從核心組件到實現邏輯,一步步拆解清楚。什麼是分佈式日誌系統?先搞清楚這個東西的意義。分佈式日誌系統,簡單來說,就是在多臺服務器或節點上,產生的日誌可以集中收集、存儲和查詢。對吧?你總不能跑到幾 ⌘ Read more
最近,使用了 Golang workspace,它是真的好。今日推薦給大家。Golang 在 1.18 版本開始支持多模塊工作區。使用多模塊工作區,可以幫助您同時在多個模塊中編寫代碼,並在這些模塊中輕鬆構建和運行代碼。要創建多模塊工作區,請確保你安裝的 Go 版本在 1.18 及以上纔行。我們以 Windows 爲例,演示如何創建工作區。一、創建一個目錄叫 workspace,這個是工作區的名稱。 ⌘ Read more
兩個主要原因。看了不少關於 REST 與 JSON 和 gRPC 的性能基準測試。其中一些測試顯示,gRPC 將每個請求的延遲減少了一半。那麼,它爲什麼這麼快呢?🤔⚡ 第一個原因是 HTTP/2。HTTP/1.1 的請求和響應是同步的,一次只能處理一個請求。而 HTTP/2 請求是異步的,可以同時發送多個請求,不需要等待前一個請求的響應。減少了等待前一個請求完成的時間,同時連接複用,也避免了 TC ⌘ Read more
本計劃今天發一篇萬字長文出來,但是,折騰一上午,就畫了一張圖,實在慚愧,是不是老了,寫作效率這麼低,當年那個一口氣幹出來一篇萬字長文的陳天宇宙去哪了,小感慨一下!閒話不多說,既然就畫了一張圖,那就先分享一下這張消耗了我一上午時間的圖吧!陳天宇宙 “超級支付清算生態” 架構圖每繪製一張架構圖,其實就是一次架構思維和支付認知的昇華,這張圖尤其如此爲什麼會有這張圖呢,因爲最近畫了很多新的架構圖——業務相 ⌘ Read more
大家好,我是隱墨星辰,深耕境內 / 跨境支付架構設計十餘年。曾經在多家頭部互聯網公司的多個核心項目組,都有發現一些工作多年的資深工程師打印的日誌也是亂七八糟的,無論對於監控還是排查問題都極爲困難,最後沒辦法只好安排重新改造日誌,費時又費力。所以聊聊這個話題。本次主要講結構清晰的日誌在支付系統中的核心作用,設計日誌規範需要遵守的一些基本原則,以及接口摘要日誌、業務摘要日誌、詳細日誌、異常日誌等常用日 ⌘ Read more
前言--Go 語言因其出色的併發處理能力和簡潔的語法,成爲開發微服務的理想選擇。而 GoFr 框架則是一個專門爲構建 Go 微服務而設計的框架,它提供了一套完整的工具和最佳實踐,幫助開發者快速構建可靠的微服務應用。GoFr 框架簡介---------GoFr 是一個專注於簡單性和性能的微服務框架。它的主要特點包括:零依賴:框架本身不依賴於任何第三方包 高性能:經過優化的路由和中間件系統 ⌘ Read more
在本文中,我們將探討如何在 Go 中構建一個可擴展且易於管理的 gRPC 服務。我們將使用 Buf 來管理 Protocol Buffers(Protobuf),並藉助 Nix 創建一個一致且可復現的開發環境。Buf 提供了一種高效且有組織的方式來管理 Protobuf,而 Nix 則確保開發環境在不同系統之間的一致性。通過本指南的學習,你將能夠構建一個具有清晰代碼結構和良好可維護性的完整 gRP ⌘ Read more
DNS(Domain Name System)即域名系統,是一種用於將域名轉換爲 IP 地址的分佈式命名系統。它充當了互聯網上的 “電話簿”,將人類可讀的域名轉換爲計算機可理解的 IP 地址。今天,老魚跟大家聊一聊 DNS 的工作原理。域名服務器的分類DNS 系統由多個層級的域名服務器組成,每個服務器負責管理特定區域內的域名和 IP 地址映射。這些服務器主要包括:根域名服務器:位於 DNS 層次結 ⌘ Read more
將開源的大語言預訓練模型部署到用戶設備上進行推理應用,特別是結合用戶專業領域知識庫構建 AI 應用,讓 AI 在回答時更具有專業性,目前已經有很多成熟的應用方案。其中,支持大模型本地化部署的平臺及工具很多,比較出名的有 ollama、vLLM、LangChain、Ray Serve 等,大大簡化了模型的部署工作,並提供模型全生命週期管理。對應地,需要知識庫構建的相應工具,能處理各種格式(doc/p ⌘ Read more
在本文中,我們將使用 Rust 構建一個加密虛擬機(VM),靈感來源於 TinyRAM 模型,並採用精簡的指令集以保持簡潔和高效。這個虛擬機能夠在執行計算的同時,原生生成零知識證明(ZKP)。對於從事加密系統或探索安全可驗證處理的人員來說,這是一個實用的工具。讓我們開始吧!架構--該項目分爲以下幾個模塊:核心虛擬機 (vm.rs)實現虛擬機的執行,包括指令集和狀態捕獲。 優雅地處理運行時錯誤 ⌘ Read more
一、MQTT 是什麼1.1、MQTT 基本概念 MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),是一種基於發佈 / 訂閱(publish/subscribe)模式的 "輕量級" 通訊協議,該協議構建於 TCP/IP 協議上,由 IBM 在 1999 年發佈。MQTT 最大優點在於,可以以極少的代碼和有限的帶寬,爲連接遠程設備提供實時可靠的 ⌘ Read more
1\. 業務背景有些業務請求,屬於耗時操作,需要加鎖,防止後續的併發操作,同時對數據庫的數據進行操作,需要避免對之前的業務造成影響。2. 分析流程使用 Redis 作爲分佈式鎖,將鎖的狀態放到 Redis 統一維護,解決集羣中單機 JVM 信息不互通的問題,規定操作順序,保護用戶的數據正確。梳理設計流程新建註解 @interface,在註解裏設定入參標誌 增加 AOP 切點,掃描特定註解 ⌘ Read more