消息列隊 分布式事務解辦法 celery flower使用總結


前言

項目中有場景 需要用到 分布式事務業務,經過查下資料把學習相關筆記做記錄方便他人或者自己后面查看。

  • 場景

在網站A業務中有個操作 是 要在網站B中新建一台服務器跑業務。A中執行B中的接口創建服務器 中間需要的時間很長。A如果一直等着B放回結果會超時。B 執行命令 很耗資源,而且不能執行太多的並發。 這這種需求下 我們想到的就是 傳說中的 “消息列隊“ 來解決這種分布式事務。

  • 解決辦法

我們在A中 創建 消息列隊機制。 當有新建機器任務時 在列隊中新增加任務 任務執行完成后回掉相關接口通知A 你的任務已完成,同時在列隊任務結果中刪除結果(任務完成后有專門的表來存放完成的任務),

軟件

  • https://github.com/mher/flower

  • redes / rabbitmq 列隊數據庫 我用redis

  • celery 開源列隊任務工具 寫任務用(添加任務 / 執行任務)全靠他

  • flower 列隊工具celery 的web版監控工具 方便查看

我的流程 (我用docker 我們在rancher編排工具)

由於我們用的是docker容器所以免去了中間的相關軟件安裝編譯 只需要下載鏡像即可

  • hub.03in.com:5002/ranmufei/docker-celery-flower 這是我們自己的鏡像 這中間集成了 我們的工具 celery , flower

  • hub.03in.com:5002/dev/redis redis數據庫 存放列隊任務 和 任務執行結果的數據庫

rancher 編排
redis:
  tty: true
  image: hub.03in.com:5002/dev/redis
  stdin_open: true
celery-flower:
  ports:
  - 5555:5555/tcp
  environment:
    CELERY_BROKER_URL: redis://redis:6379/1
  labels:
    broker_api: http://rabbit:15672/api/
  tty: true
  image: hub.03in.com:5002/ranmufei/docker-celery-flower
  volumes:
  - /home/soft/celery:/celery
  stdin_open: true

給容器掛載 /home/soft/celery:/celery 這個目錄是用來存放python寫的任務的目錄

代碼 (/celery/tasks.py)


#!/usr/bin/env python
# _*_ coding:utf-8 _*_

from celery import Celery
from time import sleep

# broker="redis://redis:6379/1" 列隊數據庫存放點
# backend="redis://redis:6379/2" 任務執行完成后數據庫存放點 
app=Celery("tasks",broker="redis://redis:6379/1",backend="redis://redis:6379/2")

@app.task
def add(x,y):
        return x + y

@app.task
def jj(x,y):
        sleep(30)
        return x - y
@app.task
def ranmufei(name):
        return name

進入celery-flower 創建的容器 首先給編寫的任務創建 一個執行worker
   # 進入到 存放python的寫的celery任務的目錄 執行如下 啟動worker; 
   # 在tasks.py 所在的目錄下才能執行下面代碼 切記 
   celery -A tasks worker --loglevel=info

另外提醒 如果在生成環境中量大 情況下 還可以啟動多個worker 在容器中是否可以考慮分布是部署 一個容器只跑一個worker 有待研究 。。。。 暫時沒深究 奉上參考資料 https://my.oschina.net/siddontang/blog/284107

測試發布任務
curl -X POST -d '{"args":[131,15]}' http://localhost:5555/api/task/send-task/tasks.add

如果沒問題 可以在 flower 提供的web 界面中看到 這個任務的執行情況,不怕麻煩也可以直接去 redis 中看看

參考資料


作者:鵲橋仙
出處:http://www.cnblogs.com/freefei/
關於作者:專注於Linux平台項目架構、管理和企業解決方案。基於linux 容器技術 微服務架構 雲計算領域有一點點經驗。如有問題或建議,請多多賜教!
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。如有問題,可以郵件:ranmufei@qq.com  微博:鵲橋仙  聯系我,非常感謝。

        </p>
    </div>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM