1. 程式人生 > >Beanstalkd 分散式記憶體佇列系統

Beanstalkd 分散式記憶體佇列系統

beanstalkd訊息佇列

Beanstalkd 是一個高效能的訊息佇列中介軟體,本博文宅鳥將介紹一下這個東東的使用。

一、先通過概念讓大家瞭解Beanstalkd的特性和工作場景。

        Beanstalkd 是一個輕量級訊息中介軟體,它最大特點是將自己定位為基於管道  (tube) 和任務 (job) 的工作佇列 (work-queue):

Beanstalkd 支援任務優先順序 (priority), 延時 (delay), 超時重發 (time-to-run) 和預留 (buried), 能夠很好的支援分散式的後臺任務和定時任務處理。

它的內部實現採用 libevent, 伺服器-客戶端之間用類似 memcached 的輕量級通訊協議,具有有很高的效能。

儘管是記憶體佇列, beanstalkd 提供了 binlog 機制, 當重啟 beanstalkd 時,當前任務狀態能夠從紀錄的本地 binlog 中恢復。

管道 (tube):

       管道類似於訊息主題 (topic), 在一個 Beanstalkd 中可以支援多個管道, 每個管道都有自己的釋出者 (producer) 和消費者 (consumer). 管道之間互相不影響。

任務 (job):

       Beanstalkd 用任務 (job) 代替訊息 (message) 的概念。與訊息不同,任務有一系列狀態:


READY- 需要立即處理的任務,當延時 (DELAYED) 任務到期後會自動成為當前任務;

DELAYED- 延遲執行的任務, 當消費者處理任務後, 可以用將訊息再次放回 DELAYED 佇列延遲執行;

RESERVED- 已經被消費者獲取, 正在執行的任務。Beanstalkd 負責檢查任務是否在 TTR(time-to-run) 內完成;

BURIED- 保留的任務: 任務不會被執行,也不會消失,除非有人把它 "踢" 回佇列;

DELETED- 訊息被徹底刪除。Beanstalkd 不再維持這些訊息。

任務優先順序 (priority):

       任務 (job) 可以有 0~2^32 個優先順序, 0 代表最高優先順序。 beanstalkd 採用最大最小堆 (Min-max heap) 處理任務優先順序排序, 任何時刻呼叫 reserve 命令的消費者總是能拿到當前優先順序最高的任務, 時間複雜度為 O(logn).

延時任務 (delay):

       有兩種方式可以延時執行任務 (job): 生產者釋出任務時指定延時;或者當任務處理完畢後, 消費者再次將任務放入佇列延時執行 (RELEASE with <delay>)。這種機制可以實現分散式的 java.util.Timer,這種分散式定時任務的優勢是:如果某個消費者節點故障,任務超時重發 (time-to-run) 能夠保證任務轉移到另外的節點執行。

任務超時重發 (time-to-run):

       Beanstalkd 把任務返回給消費者以後:消費者必須在預設的 TTR (time-to-run) 時間內傳送 delete / release/ bury 改變任務狀態;否則 Beanstalkd 會認為訊息處理失敗,然後把任務交給另外的消費者節點執行。如果消費者預計在 TTR (time-to-run) 時間內無法完成任務, 也可以傳送 touch 命令, 它的作用是讓 Beanstalkd從系統時間重新計算 TTR (time-to-run).

任務預留 (buried):

       如果任務因為某些原因無法執行, 消費者可以把任務置為 buried 狀態讓 Beanstalkd 保留這些任務。管理員可以通過 peek buried 命令查詢被保留的任務,並且進行人工干預。簡單的, kick <n> 能夠一次性把 n 條被保留的任務踢回佇列。

Beanstalkd 協議:

       Beanstalkd 採用類 memcached 協議, 客戶端通過文字命令與伺服器互動。這些命令可以簡單的分成三組:    

       生產類 - use <tube> / put <priority> <delay> <ttr> [bytes]:  

       生產者用 use 選擇一個管道 (tube), 然後用 put 命令向管道釋出任務 (job).    

       消費類 - watch <tubes> / reserve / delete <id> / release <id> <priority> <delay> / bury <id> / touch <id>

       消費者用 watch 選擇多個管道 (tube), 然後用 reserve 命令獲取待執行的任務,這個命令是阻塞的。客戶端直到有任務可執行才返回。當任務處理完畢後, 消費者可以徹底刪除任務 (DELETE), 釋放任務讓別人處理 (RELEASE), 或者保留 (BURY) 任務。

       維護類 - peek job / peek delayed / peek ready / peek buried / kick <n>

用於維護管道內的任務狀態, 在不改變任務狀態的條件下獲取任務。可以用消費類命令改變這些任務的狀態。

被保留 (buried) 的任務可以用 kick 命令 "踢" 回佇列。

Beanstalkd 不足:

Beanstalkd 沒有提供主備同步 + 故障切換機制, 在應用中有成為單點的風險。實際應用中,可以用資料庫為任務 (job) 提供持久化儲存。


另外, 和 memcached 類似, Beanstalkd 依賴 libevent 的單執行緒事件分發機制, 不能有效利用多核 cpu 的效能。這一點可以通過單機部署多個例項克服。

二、部署安裝:

Beanstalkd 的安裝非常簡單:

在Ubuntu下使用下面命令:

sudo apt-get install beanstalkd

安裝後編輯配置檔案:

vim /etc/default/beanstalkd


把START=NO改為:START=yes即可

更多關於安裝可以參考官網

通過命令可以啟動、停止Beanstalk

/etc/init.d/beanstalkd start
lsof -i:11300
/etc/init.d/beanstalkd stop


啟動後,就可以通過客戶端進行呼叫了:

Beanstalk支援多種客戶端語言:

php,java,perl,c,c++,lua,python,go,ruby等等(瞭解更多可以來官網)。

相關推薦

Beanstalkd 分散式記憶體佇列系統

beanstalkd訊息佇列 Beanstalkd 是一個高效能的訊息佇列中介軟體,本博文宅鳥將介紹一下這個東東的使用。 一、先通過概念讓大家瞭解Beanstalkd的特性和工作場景。         Beanstalkd 是一個輕量級訊息中介軟體,它最大特點是將自己定位為基於管道  (tube) 和

Beanstalk分散式記憶體佇列系統

Beanstalk是一個高效能、輕量級的、分散式的、記憶體型的訊息佇列系統。最初設計的目的是想通過後臺非同步執行耗時的任務來降低高容量Web應用系統的頁面訪問延遲。其實Beanstalkd是典型的類Memcached設計,協議和使用方式都是同樣的風格。其基本設計思想很簡單:高效能離不開非同步,非同步

大資料時代——分散式記憶體檔案系統:Tachyon

Tachyon是一個分散式記憶體檔案系統,可以在叢集裡以訪問記憶體的速度來訪問存在tachyon裡的檔案。把Tachyon是架構在最底層的分散式檔案儲存和上層的各種計算框架之間的一種中介軟體。主要職責是將那些不需要落地到DFS裡的檔案,落地到分散式記憶體檔案系統中,來達到共

好久沒更新了,推出beanstalkd php後臺佇列系統利器

開頭語:     最近使用了phalcon的php c語言編寫的框架,在我們專案組由我推進了這個框架的使用,現在基本初步閱讀了下c原始碼,同時將phalcon-php-framework-documentation.pdf 熟讀於胸,di router mvc view c

從構建分散式秒殺系統聊聊Disruptor高效能佇列

前言 秒殺架構持續優化中,基於自身認知不足之處在所難免,也請大家指正,共同進步。文章標題來自碼友的建議,希望可以把阻塞佇列ArrayBlockingQueue這個佇列替換成Disruptor,由於之前曾接觸過這個東西,聽說很不錯,正好藉此機會整合進來。 簡介 LMAX

Memcached 分散式記憶體物件快取系統在Java Web專案收藏欄中的使用

Memcached工具類程式碼 import com.danga.MemCached.MemCachedClient; import com.danga.MemCached.SockIOPool; import java.util.ArrayList; import java.util.List; /

基於記憶體分散式檔案儲存系統Alluxio

如果是隻有欄位快取的話,redis應該是夠用了。但是如果涉及到大量檔案,尤其是用hdfs作為底層儲存結構的,建議用alluxio升級一下。一方面有利於spark資源控制,另一方面也可以統一入口便於擴充套件。 1 叢集規劃 三臺伺服器hadoop-ma

分散式訊息佇列(Message Queue)系統:kafka掃盲

分散式系統很重要的一個設計原則是鬆耦合,即儘量減少子系統間的依賴。這樣各個子系統可以相互獨立的進行演進,維護,重用等。Message Queue (MQ)是一種很好的解耦手段。要了解MQ在系統整合中的作用,可以看Enterprise Integration Pattern

分散式系統設計:批處理模式之作業佇列系統

之前的文章講述了關於可靠的、長時間執行的應用(long-running server applications)的設計模式,本篇介紹批處理的模式。與先前介紹的長時間執行應用所不同的是,批處理的過程預計只能執行很短的時間。例如,通過彙總使用者的資料來分析每

高效能的分散式記憶體快取伺服器系統——memcached核心原理詳細剖析

memcached是什麼? 許多Web應用都將資料儲存到RDBMS中,應用伺服器從中讀取資料並在瀏覽器中顯示。 但隨著資料量的增大、訪問的集中,就會出現RDBMS的負擔加重、資料庫響應惡化、 網站顯示延遲等重大影響。 這時就該memcached

分散式持久記憶體檔案系統Octopus(ATC-17 )分析(五)

清華課題 Octopus 原始碼分析(五) 前言 由於專案工作的需要,我們團隊閱讀了清華在檔案系統方面的一個比較新穎的工作:Octopus。Octopus是一個基於持久記憶體 NVM 和遠端直接記憶體訪問 RDMA 技術的分散式記憶體檔案系統。清華

【2018中國計算機大會】阿里雲高階總監談超大規模超高效能分散式快儲存系統

新型硬體(如NVRAM、RDMA、GPU/TPU等)及其構建的異構複雜環境,與既有硬體環境的巨大差異,導致傳統的演算法、資料結構甚至是涉及原則和經驗法則等難以為繼,對計算智慧與大資料處理帶來新的挑戰和機遇。 10月27日下午,2018中國計算機大會上舉辦了主題“新型硬體環境下大資料處理技術”的技術論壇,一起

Alluxio檔案系統在搜狗的實踐Alluxio記憶體檔案系統在搜狗的實踐

本次分享主要包括了Spark shuffle 基於Alluxio的優化,以及基於Alluxio對於臨時表的效能改進:1.在搜狗大量的資料分析, 知識圖譜的資料製作使用Spark/SparkSQL來進行平行計算,大部分由於Spark On Yarn存在各類問題導致業務SLA水平僅為96%,結合

分散式版本控制系統:Git學習筆記

文章目錄 概述 Git是什麼 Git的安裝 建立版本庫 編寫檔案上傳 使用GitHub 概述 身為DBA的我前夕確實對於程式碼比較陌生啊,Git也是很少聽過。

大型網站架構系列:分散式訊息佇列(一)(轉)

以下是訊息佇列以下的大綱,本文主要介紹訊息佇列概述,訊息佇列應用場景和訊息中介軟體示例(電商,日誌系統)。 本次分享大綱 訊息佇列概述 訊息佇列應用場景 訊息中介軟體示例 JMS訊息服務(見第二篇:大型網站架構系列:分散式訊息佇列(二)) 常用訊息佇列(見第二篇:大型網站架構系列:分

Linux 記憶體檔案系統

Linux記憶體檔案系統:可滿足高IO的要求 ramdisk: 基於虛擬在記憶體中的其他檔案系統(ex2fs)。 掛載方式:mount /dev/ram /mnt/ramdisk ramfs: 實體記憶體檔案系統,只存在於實體記憶體中。其大小也不是固定的,而是隨著所需要的

阿里雲高階總監談超大規模超高效能分散式快儲存系統

摘要: 10月27日下午,2018中國計算機大會上舉辦了主題“新型硬體環境下大資料處理技術”的技術論壇,一起探討新型硬體帶來的變化。論壇上,阿里雲高階總監馬濤針對超大規模超高效能分散式塊儲存系統ESSD進行了報告分析。 新型硬體(如NVRAM、RDMA、GPU/TPU等)及其構建的異構複雜環境,與既有硬體環

git--分散式版本管理系統

參考部落格:廖雪峰的官方網站 一、window安裝git Git官網直接下載安裝程式,預設選項安裝即可。 1、設定自己的git(cmd命令或者git bash進入) git config --global user.name "myname" git config --global user.e

分散式版本控制系統】GIT問題彙總

一.Git 安裝(on Windows) 版本:git-2.12.1-64-bit.exe 官網即可下載(慢) ✓ Use Git from the Windows ✓ Use the OpenSSL library ✓ Checkout Windo

分散式版本控制系統GIT的使用

一、什麼是Git   Git是一個分散式版本控制系統,Git 和其他版本控制系統的主要差別在於,Git 只關心檔案資料的整體是否發生變化,而大多數其他系統則只關心檔案內容的具體差異(如CVS、Subversion等)。而Git並不儲存這些前後變化的差異資料。Git更像是把變化的檔案作快照後記錄在一個微型的檔