前言

项目中有场景 需要用到 分布式事务业务,经过查下资料把学习相关笔记做记录方便他人或者自己后面查看。

  • 场景

在网站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>

消息列队 分布式事务解办法 celery flower使用总结的更多相关文章

  1. 搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务

    搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务 初步认识RocketMQ的核心模块 rocketmq模块 rocketmq-broker:接受生产者发来的消息并存储(通过调用rocke ...

  2. .Net Core with 微服务 - 使用 AgileDT 快速实现基于可靠消息的分布式事务

    前面对于分布式事务也讲了好几篇了(可靠消息最终一致性 分布式事务 - TCC 分布式事务 - 2PC.3PC),但是还没有实战过.那么本篇我们就来演示下如何在 .NET 环境下实现一个基于可靠消息的分 ...

  3. 分布式消息队列RocketMQ--事务消息--解决分布式事务

    说到分布式事务,就会谈到那个经典的”账号转账”问题:2个账号,分布处于2个不同的DB,或者说2个不同的子系统里面,A要扣钱,B要加钱,如何保证原子性? 一般的思路都是通过消息中间件来实现“最终一致性” ...

  4. 浅谈分布式事务与TX-LCN

    最近做项目使用到了分布式事务,下面这篇文章将给大家介绍一下对分布式事务的一些见解,并讲解分布式事务处理框架TX-LCN的执行原理,初学入门,错误之处望各位不吝指正. 什么情况下需要使用分布式事务? 使 ...

  5. Zookeeper系列二:分布式架构详解、分布式技术详解、分布式事务

    一.分布式架构详解 1.分布式发展历程 1.1 单点集中式 特点:App.DB.FileServer都部署在一台机器上.并且访问请求量较少 1.2  应用服务和数据服务拆分  特点:App.DB.Fi ...

  6. 使用kafka消息队列解决分布式事务(可靠消息最终一致性方案-本地消息服务)

    微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务 本文转自:http://skaka.me/blog/2016/04/21/springcloud1/ 不同于单一 ...

  7. 微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务

    http://skaka.me/blog/2016/04/21/springcloud1/ 不同于单一架构应用(Monolith), 分布式环境下, 进行事务操作将变得困难, 因为分布式环境通常会有多 ...

  8. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案

    C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...

  9. [转帖]微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务

    微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务 http://skaka.me/blog/2016/04/21/springcloud1/ APR 21ST,  ...

随机推荐

  1. Lex与Yacc学习(二)之第一个Lex程序

    用lex识别单词 构建一个识别不同类型英语单词的简单程序.先识别词性(名词,动词等),然后再扩展到处理符合简单英语语法的多个单词的句子. 先列出要识别的一组动词: is    am   are   w ...

  2. PAT Basic 1027

    1027 打印沙漏 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号:各行 ...

  3. Knockout v3.4.0 中文版教程-6-计算监控-可写的计算监控

    2.可写的计算监控 初学者可能想要跳过本节 - 可写的计算监控是相当高级的部分,在大多数情况下不是必需的. 通常,计算监控是一个通过其他监控值计算出的值,因此是只读的. 令人惊讶的是,可以使计算监控值 ...

  4. pycharm的一些操作指令和技巧

    Alt+Enter 自动添加包Ctrl+t SVN更新Ctrl+k SVN提交Ctrl + / 注释(取消注释)选择的行Ctrl+Shift+F 高级查找Ctrl+Enter 补全Shift + En ...

  5. Java-构造一个字符串

    实用StringBuffer构造字符串 package com.tj; public class MyClass implements Cloneable { public static void m ...

  6. Redis学习笔记01---配置文件

    1.配置文件用法 启动redis的时候指定配置⽂件路径: ./redis-server /path/to/redis.conf 不指定配置⽂件的时候使⽤内置配置⽂件启动,此⽅法仅适⽤于开发和测试. 2 ...

  7. Python之注册表增删改查(干货)

    在Windows平台下,对注册表的增删改查的需求比较多,微软提供了很多用于访问,修改注册表等的API,我们可以使用诸如bat,或者C++等各种方式去访问修改注册表.无所不能的python下如何完成这些 ...

  8. [BZOJ3054] Rainbow的信号(考虑位运算 + DP?)

    传送门 BZOJ没数据范围... 其实数据范围是这样的.. 前20%可以直接n^3暴力枚举每个区间 前40%可以考虑每一位,因为所有数每一位都是独立的,而和的期望=期望的和,那么可以枚举每一位,再枚举 ...

  9. 【bzoj1193】[HNOI2006]马步距离

    [HNOI2006]马步距离 Description Input 只包含4个整数,它们彼此用空格隔开,分别为xp,yp,xs,ys.并且它们的都小于10000000. Output 含一个整数,表示从 ...

  10. 数字串(codevs 1394)

    题目描述 Description 给你一个长度为n的数字串,数字串里会包含1-m这些数字.如果连续的一段数字子串包含了1-m这些数字,则称这个数字字串为NUM串.你的任务是求出长度最短的NUM串是什么 ...