1. 程式人生 > >分散式非同步任務佇列 Celery + rabbitmq (or redis )

分散式非同步任務佇列 Celery + rabbitmq (or redis )

最近的專案要使用非同步的任務佇列,初步選用了Celery,比較輕量級,但是對Task,Broker,Worker等概念有些理解的不透徹,找到以下文章,甚是透徹。 
當我們需要處理一些比較耗時的任務時,我們就需要考慮啟用“非同步”這個概念。 
比如以下兩種情況:

一,頻繁讀寫 
比如說,現在你一條“微博”,如果是使用 push 的機制,那則需要將這條“微博”告知所有關注你的人。 
(這裡是假設。實際的微博是使用推拉結合的方式) 
關注你的人是100,則 insert 100次。 
假如你是個大V,關注你的人有100000人,則需要 insert 100000次。 
如果使用同步的方式,那恭喜你,你發完一條微博,這個時間夠你喝杯咖啡了。

二,使用“不可靠”的服務 
這裡的不可靠,指的並不是它不能使用,而是指它不穩定。 
當你呼叫第三方的簡訊介面,app push介面,無法預計呼叫介面的時間,這次呼叫,可能使用0.01s,但下次則變成3s。 
這在生產環境是完全可能發生的。高併發,網路異常都可能造成這種情況。

如果這個任務不需要及時返回結果,那我們就可以將這些任務丟給後臺去處理,某些實時性要求比較高的任務,還是隻能同步進行。 
常規的使用場景:簡訊服務、圖片處理服務、群發email、第三方介面呼叫。 
mx

在這裡我推薦 celery 。Celery 是一個非同步任務佇列/基於分散式訊息傳遞的作業佇列。 
celery_128

這裡有幾個概念,task、worker、broker。 
顧名思義,task 就是老闆交給你的各種任務,worker 就是你手下幹活的人員。

那什麼是 Broker 呢?

老闆給你下發任務時,你需要 把它記下來, 這個它 可以是你隨身攜帶的本子,也可以是 電腦裡地記事本或者excel,或者是你的 任何時間管理工具。

Broker 則是 Celery 記錄task的地方。 
作為一個任務管理者的你,將老闆(前端程式)發給你的 安排的工作(Task) 記錄到你的本子(Broker)裡。接下來,你就安排你手下的IT程式猿們(Worker),都到你的本子(Broker)裡來取走工作(Task)

tasks

Celery本身不儲存“資料”,需要配合各種後端訊息佇列一起工作。 
官方推薦的是 rabbitmq。 
rabbitmq有些臃腫(需要安裝erlang),但效能比較穩健。在大資料高併發的情況下,出隊與入隊的速度基本持平。 
redis, 作為一個支援list的key-value資料庫,也可以當成小型的佇列服務來使用。

相關推薦

分散式非同步任務佇列 Celery + rabbitmq (or redis )

最近的專案要使用非同步的任務佇列,初步選用了Celery,比較輕量級,但是對Task,Broker,Worker等概念有些理解的不透徹,找到以下文章,甚是透徹。  當我們需要處理一些比較耗時的任務時,我們就需要考慮啟用“非同步”這個概念。  比如以下兩種情況: 一,頻繁

Kubernetes(k8s)中文文件 示例: 分散式任務佇列 Celery, RabbitMQ和Flower_Kubernetes中文社群

譯者:White 介紹 Celery是基於分散式訊息傳遞的非同步任務佇列。它可以用來建立一些執行單元(例如,一個任務),這些任務可以同步,非同步的在一個或者多個工作節點執行。 Celery基於Python實現。 因為Celery基於訊息傳遞,需要一些叫作訊息代理的中介軟體(他們用來在傳送者和接受者之

django非同步任務celery+rabbitmq+flower視覺化)

文章目錄 安裝rabbitmq 安裝django-celery,flower 配置過程 安裝rabbitmq sudo apt-get install rabbitmq-server 新增使用者,myuser為

Celery非同步任務佇列的使用

版權宣告:本文為博主原創文章,未經博主允許不得轉載。https://mp.csdn.net/mdeditor/83016539 任務傳送者,任務執行者,中間人 安裝: pip install celery 使用: 1)建立一個Celery類的例項物件 from celer

分散式任務佇列Celery的介紹

架構組成 一個完整的Celery分散式佇列架構應該包含一下幾個模組: 訊息中間人 Broker 訊息中間人,就是任務排程佇列,通常以獨立服務形式出現。它是一個生產者消費者模式,即主程式將任務放入佇列中,而後臺職程則會從佇列中取出任務並執行。任務可以按順序排程,也可以按計劃時間排程。Celery元件本

在python下比celery更加簡單的非同步任務佇列RQ

廖雪峰 /程式設計 / 2013-8-27 19:33 / 閱讀: 21 Celery是Python開發的分散式任務排程模組,今天抽空看了一下,果然介面簡單,開發容易,5分鐘就寫出了一個非同步傳送郵件的服務。 Celery本身不含訊息服務,它使用第三方訊息服務來

分散式任務佇列 Celery —— 詳解工作流

目錄 前文列表 前言 Celery 的工作流具有非常濃厚的函數語言程式設計風格,在理解工作流之前,我們需要對「簽名」、「偏函式」以及「回撥函式」有所瞭解。 文中所用的示例程式碼緊接前文,其中 taks.py 模組有少量修改。 # fi

分散式任務佇列--Celery的學習筆記

一、Celery簡介   Celery是一個簡單,靈活,可靠的分散式系統,用於處理大量訊息,同時為操作提供維護此類系統所需的工具。它是一個任務佇列,專注於實時處理,同時還支援任務排程。   所謂任務佇列,是一個邏輯上的概念,可以將抽象中的任務傳送到指定的執行任務的元件,任務佇列可以跨執行緒或機器執行。

分散式後臺任務佇列模擬(Golang)

         最近研究了下gowoker,這東西程式碼少而精,Golang真是很適合實現這類東西。 我去掉引數配置,JSON,Redis這些東西,用goworker的方式做了個最簡單的實現。   實現如下功能:     1. worker向JobServer註冊可執行的

非同步任務神器 Celery 簡明筆記

在程式的執行過程中,我們經常會碰到一些耗時耗資源的操作,為了避免它們阻塞主程式的執行,我們經常會採用多執行緒或非同步任務。比如,在 Web 開發中,對新使用者的註冊,我們通常會給他發一封啟用郵件,而發郵件是個 IO 阻塞式任務,如果直接把它放到應用當中,就需要等郵件發出去之後才

非同步任務佇列的兩種處理方法

先對這裡的非同步任務做下解釋: 這裡的意思是,該任務有幾種狀態,建立,等待,執行,結束;其中等待是因為,該任務要正常執行,需要其他執行緒(或程序)提供相應的條件(或觸發事件),然後才會執行。    

php +swoole實現非同步任務佇列

假如要發100封郵件,for迴圈100遍,使用者直接揭竿而起,什麼破網站!但實際上,我們很可能有超過1萬的郵件。怎麼處理這個延遲的問題?答案就是用非同步。把“發郵件”這個操作封裝,然後後臺非同步地執行1萬遍。這樣的話,使用者提交網頁後,他所等待的時間只是“把發郵件任務請求推送

java 非同步任務佇列執行--需要注意的地方

參照1寫的非同步任務佇列過程中,發現一些java基礎知識掌握不夠。 1)Iterable 類的forEach方法和for迴圈方法的不同: try { List<Future<Object>> futures = exe

協程、同步非同步、併發、並行、rabbitmq分散式任務佇列

http://docs.jinkan.org/docs/celery/ 協程 協程不是程序或執行緒,其執行過程更類似於不帶返回值的函式呼叫。 一個程式可以包含多個協程,可以對比與一個程序包含多個執行緒。我們知道多個執行緒相對獨立,有自己的上下文,切換受系統控制;而協程也相對獨立,有自己的上下文,但是

Django+celery+ RabbitMQ實現非同步任務

一,首先安裝celery pip install django-celery 二,安裝rabbitmq ubuntu環境下執行以下 sudo apt-get install rabbitmq-server 新增使用者,myuser為使用者名稱,mypassword為使用者

Celery 分散式任務佇列快速入門 Celery 分散式任務佇列快速入門

Celery 分散式任務佇列快速入門   本節內容 Celery介紹和基本使用 在專案中如何使用celery 啟用多個workers Celery 定時任務 與django結合 通過django配置celery periodic task

使用rediscelery執行非同步任務時報錯AttributeError: 'str' object has no attribute 'iteritems'

程式碼基本配置正常,但是執行Celery -A myproject worker -l info執行的時候了一個AttributeError: ‘str’ object has no attribute 'iteritems’錯誤,找了兩天看到一個部落格裡的文章,錯誤問題和我的問題內容差

Redis實現分散式鎖與任務佇列的思路

一, 實現思路 1.Redis實現分散式鎖思路 思路很簡單,主要用到的redis函式是setnx(),這個應該是實現分散式鎖最主要的函式。首先是將某一任務標識名(這裡用Lock:order作為標識名的例子)作為鍵存到redis裡,併為其設個過期時間,如果是還有Lock:order請求過來,先

Celery分散式任務佇列框架--基於flask實現

使用Celery的方法 Celery是分散式的任務佇列 特點: 簡單、靈活、高可用 1) 安裝Celery pip install celery 2) 安裝 redis redis可以使用list結構,提供訊息佇列的功能 3)建立Celery物件

關於redis中使用鎖機制,( 實現分散式鎖和任務佇列

場景:       電商網站上有很多秒殺活動,會迎來一個使用者請求的高峰期,可能會有幾十萬幾百萬的併發量,來搶這個手機,在高併發的情形下會對資料庫伺服器或者是檔案伺服器應用伺服器造成巨大的壓力,嚴重時說不定就宕機了;       另一個問題是,秒殺的東西都是有量的,一款手