【最后203篇系列】015 幾種消息隊列的思考

背景

隊列還是非常重要的中間件,可以幫助我們:提高處理效率、完成更復雜的處理流程

最初,我覺得只要掌握一種消息隊列就夠了,現在想想挺好笑的。

過去的探索

因為我用python,而rabbitmq比較貼合快速和復雜的數據處理,然后就選了這款。一開始我覺得不靠譜,服務老是斷了,后來發現,是因為ubuntu做服務器如果用wifi的話天然容易這樣。當時不明白為什么,所以棄用了rabbitmq一段時間。

后來再次使用時,功能倒是大體ok了,在早期版本好像直接支持延時消息啥的,當時都把插件裝上搞好了。后來又覺得rabbitmq的并發太小了,在大規模etl的時候比較吃不消。所以又棄用了。

再后來,我想搞一些簡單,使用一點的隊列,于是搞了redis stream。在某些方面的確也還挺好用,速度和吞吐都還比較大。但是是吃內存的,而且在后來也出過一次問題:在維持十幾個隊列進行大量流轉時,我發現有些隊列失效了,要刪除才能釋放內存。這樣的隱患看起來更大,所以又多少被打入冷宮。

兜兜轉轉又回到了kafka。這個是最早我比較排斥的,因為看起來比價麻煩,而且更偏向java。但搭起來的確很好用,吞吐大,也不需要內存,主要依賴硬盤。但是kafka搭起來稍微麻煩一點,組要zookeeper,而且對網絡和機器資源的要求很高。有一次,我不確定是不是kafka的問題,把我一臺機器的網絡整個帶崩了。當然大部分時候也是沒問題的。

后來也陸續看了一些隊列,但類型也就是上面三種了,差異不大。還有個zmq,感覺是更底層的隊列轉發,沒去管了。

一些對應的結論:

  • 1 rabbitmq 可以在稍微小的場景用,功能可以比較全面,方便重試等
  • 2 redis 把持久化去掉,不需要了,這樣萬一stream出問題重啟服務就行
  • 3 kafka 適合保存大量的對話日志,有7天滾動刪除,需要用資源稍微高一點的機器運行

新的思考

最近碰到一些問題,又觸發了我關于這方面的思考。

問題1:一個同事抱怨請求的微服務失敗率過高,任務失敗后他的重試比較難搞?

問題2:機器人會有很多零散的數據需要向量化,而現有的向量化微服務是處理批量的,這樣導致了能力無法輸出?

問題3:大模型不斷出新的模型,以及現有的接口價格還是稍貴(雖然已經是業內最低),如何能確保替換?

對于問題1,后來我發現還是數據連接失活的問題,已經解決掉了。但如果是大模型接口不穩定導致的問題,應該如何解決呢? – RabbitMQ

由于調用大模型處理的需求一般都是比較昂貴且緩慢的,這意味著天然的并發就不會太高。RabbitMQ即使在消息體很大的情況下,應該也能做到2000左右的并發(這個后續我可以壓一下),那樣在并發處理上就夠了。

然后利用rabbitmq本身豐富的機制,比如死信隊列這種來完成重試。
在這里插入圖片描述
這樣可以應對接口的不穩定調用情況,減少我們自己進行失敗的檢查和調度。

對于問題2,應該就是做一個微批次服務了。服務端用隊列接收請求,只有到一定批次時或者到指定輪詢時間(1s),服務才會處理隊列的數據,此時就可以發揮服務的批量處理效率了。這對于矩陣處理類的服務特別有效,使用redis stream這樣簡單的隊列來完成這種服務正好。 – Redis Stream。

對于問題3,那么就是一個廣播的過程。用kafka比較合適,一方面可以支持很大的吞吐,然后對于不同的消費者,這時應該是不同的模型都可以重復消費。每一個input,只存一次,在kafka,然后可以被重復消費,消費的結果進行實時比對。勝利的模型上臺,失敗的模型退位。

還有一個比較讓我本能抗拒的問題,但其實應該是可以的,后面我也要嘗試。

【實時隊列服務】服務只是一個消息入口,并不直接處理,而是發到kafka。然后由多個worker盯著kafka進行消費。

這種間接服務是有點不靠譜的,拋開入口服務不談,這里有kafka隊列和worker兩個不穩定因素。但如果可行的話,這樣反而是比較好的:

  • 1 數據存在歷史(7天緩存),必要的時候可以追溯和回放
  • 2 數據存到kafka,可以有更高的彈性處理能力,對那些延時要求不高的,比如允許timeout 30秒的任務來說肯定是可以的

worker處理完之后進行返回 ,可以采用webhook, websocket或者sse的方式將結果實時的返給請求。

【復雜ETL流轉】將數據的處理抽象為在若干個kafka之間進行流轉。

這樣最大的好處是可以讓不同人/流程之間的交互變的簡單,可能會稍微費點硬盤,但應該是值得的。

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

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

相關文章

TensorFlow 與 TensorFlow Lite:核心解析與層應用

1. 引言 TensorFlow 是 Google 開發的開源機器學習框架,支持從數據預處理、模型訓練到推理部署的完整生命周期。然而,在嵌入式和移動設備上,原生 TensorFlow 過于龐大,因此 Google 推出了輕量級版本——TensorFlow Lite&#xff…

DeepSeek大模型在政務服務領域的應用

DeepSeek大模型作為國產人工智能技術的代表,近年來在政務服務領域的應用呈現多點開花的態勢。通過多地實踐,該技術不僅顯著提升了政務服務的效率與智能化水平,還推動了政府治理模式的創新。以下從技術應用場景、典型案例及發展趨勢三個維度進…

電子電氣架構 --- 分布到集中的動カ系統及基于域控制器的架構

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 所有人的看法和評價都是暫時的,只有自己的經歷是伴隨一生的,幾乎所有的擔憂和畏懼,都是來源于自己的想象,只有你真的去做了,才會發現有多快樂。…

深入理解C/C++堆數據結構:從原理到實戰

一、堆的本質與特性 1.1 什么是堆數據結構? 堆(Heap)是一種特殊的完全二叉樹,它滿足以下核心性質: 堆序性:每個節點的值都滿足特定順序關系 結構性:完全二叉樹的結構特性(除最后一…

Python學習第十七天

Django框架-SQLite3 介紹 Django內置了對 SQLite3 數據庫的支持。SQLite3 是一個輕量級的嵌入式數據庫引擎,非常適合開發、測試和小型項目。以下是關于 Django 中 SQLite3 的介紹和應用指南。(除了這些還支持mysql、oracle以及其他查詢文檔,…

Docker 》》Docker Compose 》》network 網絡 compose

docker 默認的網絡 三種模式 # 列出所有當前主機上或Swarm集群上的網絡 docker network ls#查看網絡詳情 docker network inspect network名稱# 清除未使用的docker網絡 docker network prune -f# 創建網絡 ocker network create -d bridge 網絡名稱 docker network create –s…

Python數字信號處理之最佳等波紋濾波器階數估計原理

Matlab中的階數估計函數 在MATLAB中,使用firpmord函數可以估算等波紋FIR濾波器的最小階數。該方法基于Parks-McClellan算法,通過通帶和阻帶的頻率邊界、幅度響應及允許的最大誤差來自動計算參數。 rp 3; % Passband ripple in dB rs 40; …

JumpServer基礎功能介紹演示

堡壘機可以讓運維人員通過統一的平臺對設備進行維護,集中的進行權限的管理,同時也會對每個操作進行記錄,方便后期的溯源和審查,JumpServer是由飛致云推出的開源堡壘機,通過簡單的安裝配置即可投入使用,本文…

C++和C的區別

C和C語言雖然共享相似的語法,但在設計理念和功能特性上有顯著區別。以下是兩者的主要差異: 1. 編程范式 C:純過程式編程,強調函數和步驟。C:支持多范式,包括面向對象編程(類、繼承、多態&…

Android LeakCanary 使用 · 原理詳解

一、簡介 LeakCanary 是 Square 公司開源的 Android 內存泄漏檢測工具,通過自動化監控和堆轉儲分析,幫助開發者快速定位內存泄漏根源。其核心設計輕量高效,已成為 Android 開發中必備的調試工具。 二、使用方式 1. 集成步驟 在項目的 buil…

每日一題---dd愛框框(Java中輸入數據過多)

dd愛框框 實例: 輸入: 10 20 1 1 6 10 9 3 3 5 3 7 輸出: 3 5 這道題要解決Java中輸入的數過多時,時間不足的的問題。 應用這個輸入模板即可解決: Java中輸入大量數據 import java.util.*; import java.io.*;pu…

redis部署架構

一、redis多實例部署 實例1 安裝目錄:/app/6380 數據目錄:/app/6380/data 實例2 安裝目錄:/app/6381 數據目錄:/app/6381/data 1、創建實例安裝目錄 2、拷貝實例的配置文件 3、編輯實例的配置文件 第…

vscode python相對路徑的問題

vscode python相對路徑的問題 最近使用使用vscode連接wsl2寫python時,經常遇到找不到包中的方法的問題,最終發現vscode在執行python代碼時目錄不是從當前python文件開始算起,而是從當前工作區的目錄開始算起,比如說我打開的是/ho…

面試vue2開發時怎么加載編譯速度(webpack)

可以輸入命令獲取默認 webpack 設置 vue inspect > set.js 1.使用緩存 configureWebpack: {cache: {type: filesystem, // 使用文件系統緩存類型buildDependencies: {config: [__filename] // 緩存依賴,例如webpack配置文件路徑}}}, 2.啟用 vue-loader (測試明…

uv命令介紹(高性能Python包管理工具,旨在替代pip、pip-tools和virtualenv等傳統工具)

文章目錄 **主要功能**1. **快速安裝和管理 Python 包**2. **生成和管理鎖文件 (requirements.lock)**3. **創建虛擬環境**4. **與 poetry 兼容** **核心優勢**1. **極快的速度**:基于 Rust 實現,利用多線程和緩存大幅加速依賴解析。2. **輕量且獨立**&a…

企業數據管理的成本與效率革命

在數字經濟時代,企業每天產生的數據量正以指數級速度增長。IDC預測,到2025年全球數據總量將突破180 ZB。面對海量數據存儲需求和有限的IT預算,企業逐漸意識到:將每字節數據都存儲在昂貴的高性能存儲設備上,既不經濟也不…

深度學習-服務器訓練SparseDrive過程記錄

1、cuda安裝 1.1 卸載安裝失敗的cuda 參考:https://blog.csdn.net/weixin_40826634/article/details/127493809 注意:因為/usr/local/cuda-xx.x/bin/下沒有卸載腳本,很可能是apt安裝的,所以通過執行下面的命令刪除: a…

洛谷每日1題-------Day20__P1401 [入門賽 #18] 禁止在 int 乘 int 時不開 long long

題目描述 在比賽中,根據數據范圍,分析清楚變量的取值范圍,是非常重要的。int 類型變量與 int 類型變量相乘,往往可能超出 int 類型可以表示的取值范圍。 現在,給出兩個 int 類型變量 x,y 及其取值范圍,請…

3.15刷題

P6337 [COCI 2007/2008 #2] CRNE - 洛谷 #include<bits/stdc.h> using namespace std; int main(){int n;cin>>n;//橫加豎 最大。n/2,n/21if(n%20){cout<<(n/21)*(n/21);}else cout<<(n/22)*(n/21);return 0; }P6338 [COCI 2007/2008 #2] PRVA - 洛…

Browser Copilot 開源瀏覽器擴展,使用現有或定制的 AI 助手來完成日常 Web 應用程序任務。

一、軟件介紹 文末提供源碼和開源擴展程序下載 Browser Copilot 是一個開源瀏覽器擴展&#xff0c;允許您使用現有或定制的 AI 助手來幫助您完成日常 Web 應用程序任務。 目標是提供多功能的 UI 和簡單的框架&#xff0c;以實現和使用越來越多的 copilots&#xff08;AI 助手&…