使用Docker-compose来封装celery4.1+rabbitmq3.7服务,实现微服务架构

简介: 大家都知道,Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,在之前的一篇文章中:[python3.7+Tornado5.1.1+Celery3.1+Rabbitmq3.7.16实现异步队列任务](https://v3u.cn/a_id_99)详细阐述了如何进行安装部署和使用,但是过程太繁琐了,先得安装Erlang,再安装rabbitmq,然后各种配置,最后由于async关键字问题还得去修改三方库的源码,其实我们可以通过docker来将celery服务封装成镜像,如此一来,以后再使用celery或者别的系统依赖celery,我们只需要将该镜像以容器的形式跑服务即可,不需要繁琐的配

大家都知道,Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,在之前的一篇文章中:python3.7+Tornado5.1.1+Celery3.1+Rabbitmq3.7.16实现异步队列任务详细阐述了如何进行安装部署和使用,但是过程太繁琐了,先得安装Erlang,再安装rabbitmq,然后各种配置,最后由于async关键字问题还得去修改三方库的源码,其实我们可以通过docker来将celery服务封装成镜像,如此一来,以后再使用celery或者别的系统依赖celery,我们只需要将该镜像以容器的形式跑服务即可,不需要繁琐的配置与安装。

首先新建celery\_with\_docker文件夹,cdcelery\_with\_docker

建立dockerfile文件

FROM python
LABEL author="liuyue"
LABEL purpose = ''


RUN apt update
RUN pip3 install setuptools

ENV PYTHONIOENCODING=utf-8

# Build folder
RUN mkdir -p /deploy/app
WORKDIR /deploy/app
#only copy requirements.txt.  othors will be mounted by -v
#COPY app/requirements.txt /deploy/app/requirements.txt
#RUN pip3 install -r /deploy/app/requirements.txt
RUN pip3 install celery

# run sh. Start processes in docker-compose.yml
#CMD ["/usr/bin/supervisord"]
CMD ["/bin/bash"]

意思是基础镜像我们使用python,然后安装celery

然后新建docker-compose.yml

# Use postgres/example user/password credentials
version: '3.4'

services:
    myrabbit:
        #restart: always
        #build: rabbitmq/
        image: rabbitmq:3-management
        # hostname: rabbit-taiga
        environment:
            RABBITMQ_ERLANG_COOKIE: SWQOKODSQALRPCLNMEQG
            # RABBITMQ_DEFAULT_USER: "guest"
            # RABBITMQ_DEFAULT_PASS: "guest"
            # RABBITMQ_DEFAULT_VHOST: "/"
            # RABBITMQ_NODENAME: taiga
            RABBITMQ_DEFAULT_USER: liuyue
            RABBITMQ_DEFAULT_PASS: liuyue
        ports:
            - "15672:15672"
            # - "5672:5672"
    
    api:
        #restart: always
        stdin_open: true
        tty: true
        build: ./
        image: celery-with-docker-compose:latest
        volumes:
            - ./app:/deploy/app
        ports:
            - "80:80"
        command: ["/bin/bash"]

    celeryworker:
        image: celery-with-docker-compose:latest
        volumes:
            - ./app:/deploy/app
        command: ['celery', '-A', 'tasks', 'worker', '-c', '4', '--loglevel', 'info']
        depends_on:
            - myrabbit 

这个配置文件的作用是,单独拉取rabbitmq镜像,启动rabbitmq服务,用户名和密码为:liuyue:liuyue然后在镜像内新建一个celery工程,目录放在/deploy/app,随后通过挂载文件夹的方式将宿主的app目录映射到/deploy/app,最后启动celery服务

最后,我们只需要在宿主机建立一个app文件夹,新建一些任务脚本即可

新建tasks.py

from celery import Celery

SERVICE_NAME = 'myrabbit' 
app = Celery(backend = 'rpc://', broker = 'amqp://liuyue:liuyue@{0}:5672/'.format(SERVICE_NAME))


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

新建任务调用文件test.py

import time
from tasks import add
# celery -A tasks worker -c 4 --loglevel=info


t1 = time.time()
result = add.delay(1, 2)
print(result.get())
 
print(time.time() - t1) 

最后项目的目录结构是这样的

随后在项目根目录执行命令:docker-compose up --force-recreate

此时celery和rabbitmq服务已经启动

进入浏览器http://localhost:15672用账号登录 liuyue:liuyue


没有问题,此时我们进入容器内部

docker exec -i -t celery-with-docker-compose-master_api_1 /bin/bash

可以看到,容器内已经通过挂载将宿主机的app文件夹共享了进来

随后我们执行异步任务:python3 test.py

可以看到执行成功了

由此可知,在宿主机,什么环境都不需要配置,只需要安装一个docker即可,异步任务队列的搭建和执行全部在docker的内部容器内,完全隔绝,只是具体的代码和脚本通过docker的挂载命令来在宿主机编写,也就是研发人员只需要在宿主机专注编写代码,而不需要管配置和部署的问题。

最后,附上项目的完整代码:https://gitee.com/QiHanXiBei/celery-with-docker-composer

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
消息中间件 大数据 关系型数据库
RocketMQ实战—3.基于RocketMQ升级订单系统架构
本文主要介绍了基于MQ实现订单系统核心流程的异步化改造、基于MQ实现订单系统和第三方系统的解耦、基于MQ实现将订单数据同步给大数据团队、秒杀系统的技术难点以及秒杀商详页的架构设计和基于MQ实现秒杀系统的异步化架构。
1083 64
RocketMQ实战—3.基于RocketMQ升级订单系统架构
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
1117 4
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
3062 70
从单体到微服务:如何借助 Spring Cloud 实现架构转型
|
消息中间件 存储 设计模式
RocketMQ原理—5.高可用+高并发+高性能架构
本文主要从高可用架构、高并发架构、高性能架构三个方面来介绍RocketMQ的原理。
3854 21
RocketMQ原理—5.高可用+高并发+高性能架构
|
缓存 Cloud Native Java
Java 面试微服务架构与云原生技术实操内容及核心考点梳理 Java 面试
本内容涵盖Java面试核心技术实操,包括微服务架构(Spring Cloud Alibaba)、响应式编程(WebFlux)、容器化(Docker+K8s)、函数式编程、多级缓存、分库分表、链路追踪(Skywalking)等大厂高频考点,助你系统提升面试能力。
1863 0
|
运维 监控 持续交付
微服务架构解析:跨越传统架构的技术革命
微服务架构(Microservices Architecture)是一种软件架构风格,它将一个大型的单体应用拆分为多个小而独立的服务,每个服务都可以独立开发、部署和扩展。
4057 37
微服务架构解析:跨越传统架构的技术革命
|
Cloud Native Serverless 流计算
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
979 12
|
Linux Docker 容器
Linux 中停止 Docker 服务报 warning 导致无法彻底停止问题如何解决?
在 Linux 系统中,停止 Docker 服务时遇到警告无法彻底停止的问题,可以通过系统管理工具停止服务、强制终止相关进程、检查系统资源和依赖关系、以及重置 Docker 环境来解决。通过以上步骤,能够有效地排查和解决 Docker 服务停止不彻底的问题,确保系统的稳定运行。
1454 19