前言
項目中有場景 需要用到 分布式事務業務,經過查下資料把學習相關筆記做記錄方便他人或者自己后面查看。
- 場景
在網站A業務中有個操作 是 要在網站B中新建一台服務器跑業務。A中執行B中的接口創建服務器 中間需要的時間很長。A如果一直等着B放回結果會超時。B 執行命令 很耗資源,而且不能執行太多的並發。 這這種需求下 我們想到的就是 傳說中的
“消息列隊“
來解決這種分布式事務。
- 解決辦法
我們在A中 創建 消息列隊機制。 當有新建機器任務時 在列隊中新增加任務 任務執行完成后回掉相關接口通知A 你的任務已完成,同時在列隊任務結果中刪除結果(任務完成后有專門的表來存放完成的任務),
軟件
-
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>