【Django+Vue3 线上教育平台项目实战】Celery赋能:优化订单超时处理与自动化定时任务调度

在这里插入图片描述


文章目录

  • 前言⭐✨💫🔥📖
  • 一、Celery⭐
    • 1.基本概念及介绍:✨
    • 2.使用步骤💫
  • 二、订单超时 取消订单(Celery)🔥
    • 具体实现流程📖


前言⭐✨💫🔥📖

    在构建复杂的Web应用,如线上教育平台时,异步任务处理与定时任务调度成为提升性能和用户体验的关键。Celery 作为分布式任务队列框架,以其高效、灵活和可扩展性在Python项目中广泛应用。

    本文将简述Celery的基本概念,并详细指导如何在Django项目中集成Celery,以实现订单超时自动取消的功能。同时,我们还将探讨如何设置定时任务,对成功和失败的订单进行统一处理,以优化业务流程和提高系统自动化水平。


一、Celery⭐

在这里插入图片描述

项目仓库:https://github.com/celery/celery/
官方文档:https://docs.celeryproject.org/en/latest/
中文文档(3.1):http://docs.jinkan.org/docs/celery/getting-started/index.html

1.基本概念及介绍:✨

  • Celery是一个由Python编写的分布式任务队列和异步处理框架,它使得开发者能够轻松地在后台处理耗时任务,而不会阻塞主程序的执行。
  • Celery的设计基于生产者消费者模型,通过消息中间件(Broker)来协调任务的发布和执行。

Celery的核心组件包括:

  • 1.任务(Tasks):定义了要异步执行的功能。它们通常是一个普通的Python函数,通过装饰器标记为Celery任务
  • 2.工作者(Workers):运行在后台的进程,不断地从消息队列中取出任务并执行。你可以运行多个工作者来并行处理任务。
  • 3.消息中间件(Message Broker):用于***接收任务并将它们放入队列中,同时负责结果的存储。Celery 支持多种中间件,如RabbitMQ、Redis、Amazon SQS等。
  • 4.定时任务配制(beat):三种模式 cron模式、date模式、interval模式
  • 5.任务结果后端(Result Backend):用于存储任务的结果,以便任务完成后可以查询。后端可以是数据库、缓存系统等,Celery支持包括Redis、RabbitMQ、SQLAlchemy在内的多种存储方式。

Celery的整体流程:

  • 应用程序将一个任务添加到任务队列中。
  • 消息中间件接收这个任务并将它存储在适当的消息队列里。
  • Celery 工作者监听这些队列,一旦发现新任务,就会取出并执行它。
  • 任务执行的结果可以被存储在结果后端,供后续查询。

    Celery 支持任务的链式执行、定时任务(使用celery beat)、任务优先级设置、任务结果的跟踪和重试机制等高级特性,非常适合需要高性能异步处理和任务调度的场景。


2.使用步骤💫

1.创建Celery:web_back/celery.py

import os
from celery import Celery# 必须在实例化celery应用对象之前执行
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'web_back.settings')# 实例化celery应用对象
app = Celery('web_back')
# 指定任务的队列名称
app.conf.task_default_queue = 'Celery'
# 也可以把配置写在django的项目配置中
app.config_from_object('django.conf:settings', namespace='CELERY') # 设置django中配置信息以 "CELERY_"开头为celery的配置信息
# 自动根据配置查找django的所有子应用下的tasks任务文件
app.autodiscover_tasks()

2.使用Celery:web_back/__init__.py

import pymysql
pymysql.version_info=(1,4,3,"final",0) # 指定了pymysql的版本:1.4.3,按照版本修改
pymysql.install_as_MySQLdb()from .celery import app as celery_app__all__ = ['celery_app']

3.settings.py 配置

# Celery配置
# from kombu import Exchange, Queue
# 设置任务接受的类型,默认是{'json'}
CELERY_ACCEPT_CONTENT = ['application/json']
# 设置task任务序列列化为json
CELERY_TASK_SERIALIZER = 'json'
# 请任务接受后存储时的类型
CELERY_RESULT_SERIALIZER = 'json'
# 时间格式化为中国时间
CELERY_TIMEZONE = 'Asia/Shanghai'
# 是否使用UTC时间
CELERY_ENABLE_UTC = False
# 指定borker为redis 如果指定rabbitmq CELERY_BROKER_URL = 'amqp://guest:guest@localhost:5672//'
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0'
# 指定存储结果的地方,支持使用rpc、数据库、redis等等,具体可参考文档
# CELERY_RESULT_BACKEND = 'db+mysql://scott:tiger@localhost/foo'
# mysql 作为后端数据库
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
# 设置任务过期时间 默认是一天,为None或0 表示永不过期
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24
# 设置worker并发数,默认是cpu核心数
# CELERYD_CONCURRENCY = 12
# 设置每个worker最大任务数
CELERYD_MAX_TASKS_PER_CHILD = 100
# 指定任务的位置
CELERY_IMPORTS = ('base.tasks',
)
# 使用beat启动Celery定时任务
# schedule时间的具体设定参考:https://docs.celeryproject.org/en/stable/userguide/periodic-tasks.html# 定时任务
CELERY_BEAT_SCHEDULE = {"orders_notpay": {  # 定时任务'task': 'base.tasks.cancelorders','schedule': 3,  # 定时任务的调用时间,10表示每隔10秒调用一次任务,5*60表示每5分钟# "schedule": crontab(hour=7, minute=30, day_of_week=1),,  # 定时任务的调用时间,每周一早上7点30分调用一次add任务},"syn_mysqlEs": {  # 定时任务:每一分钟同步一次mysql到es的数据'task': 'base.tasks.syn_mysql_es','schedule': 3,  # 定时任务的调用时间,10表示每隔10秒调用一次任务,5*60表示每5分钟# "schedule": crontab(hour=7, minute=30, day_of_week=1),,  # 定时任务的调用时间,每周一早上7点30分调用一次add任务},}

4.设置tasks 任务:

#base/tasks.py
from celery import shared_task
from ronglianyunapi import send_sms as sms
# 记录日志:
import logging
logger = logging.getLogger("django")@shared_task(name="send_sms")
def send_sms(tid, mobile, datas):"""异步发送短信"""try:return sms(tid, mobile, datas)except Exception as e:logger.error(f"发送短信失败: {e}")

5.启动定时任务:

  • 第一个终端:celery -A web_back worker -l INFO -P eventlet
  • 第二个终端:celery -A web_back beat

二、订单超时 取消订单(Celery)🔥

实现流程:

  • 1.生成订单把当前时间+1800,和订单号存入队列中
  • 2.在支付完的回调接口中,同步根据订单号查询订单,根据查询结果改变订单状态。异步从请求中获取状态,100000支付成功,队列中删除订单号
  • 3.此时队列中的就是没支付的,1分钟执行一次,查询时间<当前时间,说明已经过期了,把订单改为失败状态,积分优惠券恢复

具体实现流程📖

1.生成订单接口 OrderView
在这里插入图片描述
2.在支付完的回调接口中,同步根据订单号查询订单,根据查询结果改变订单状态。异步从请求中获取状态,100000支付成功,队列中删除订单号
在这里插入图片描述

Celery定时任务:

  • 订单超时取消订单
  • 处理订单成功队列
  • 处理订单失败队列
@shared_task
def cancelorders():# 获取订单号 0 小于等于int(time.time())# 遍历订单号列表# 根据订单号查询订单表,把订单更新为失败状态# 查看订单是否使用积分和优惠券,如果使用更新,写入积分记录表,用户表中的积分+,优惠券+orderno = r.get_str("orderno")order = OrdersModel.objects.filter(transaction=orderno).first()pay_status = order.pay_statusif pay_status == 1: #生成订单-未支付状态order.orders_status = 7 #订单-->取消状态#...print("取消订单操作")
@shared_task
def ordersuccess():#读取成功的队列,获取到订单号len = r.list_len("ordersuccess")while len > 0:sid = r.list_pop("ordersuccess")# 根据订单号查询订单order = OrdersDetailModel.objects.filter(orders_id=sid).first()# 更新用户课程表UserCourseModel.objects.create(user_id=order.user_id,course_id=order.course_id)# 更新用户课程章节表UserCourseChapterModel.objects.create(user_id=order.user_id,course_id=order.course_id,name=order.course.name)print("订单成功时,更新用户课程表和用户课程章节表")@shared_task
def orderfail():# 读取失败的队列,获取到订单号,len = r.list_len("orderfail")while len > 0:fid = r.list_pop("orderfail")# 根据订单号查询订单order = OrdersModel.objects.filter(orders_id=fid).first()# 更新积分记录表、用户表中总积分、优惠券srecord = ScoreRecordModel.objects.filter(user_id=order.user_id).first()srecord.type = 1srecord.score = order.scoresrecord.save()user = UsersModel.objects.filter(user_id=order.user_id).first()user.points += order.scoreuserCoupon = UserCouponModel.objects.filter(user_id=order.user_id).first()userCoupon.status = "未使用"print("订单失败时,更新数据完成")

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/48586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GIT命令学习 二

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

开源智能助手平台Dify是什么?

1.背景 对于国内小公司&#xff0c;怎样通过Ai 将内部流程、产品重新做一次&#xff0c;从而提高人效、给客户带来价值&#xff0c;这是老板们在考虑的问题 &#xff1f; 当前市面上的你大模型例如&#xff1a;通义千问、文心一言、kimi、智谱清言、盘古 等&#xff0c;底层能…

JavaWeb服务器-Tomcat(Tomcat概述、Tomcat的下载、安装与卸载、启动与关闭、常见的问题)

Tomcat概述 Tomcat服务器软件是一个免费的开源的web应用服务器。是Apache软件基金会的一个核心项目。由Apache&#xff0c;Sun和其他一些公司及个人共同开发而成。 由于Tomcat只支持Servlet/JSP少量JavaEE规范&#xff0c;所以是一个开源免费的轻量级Web服务器。 JavaEE规范&…

python-网络并发模型

3. 网络并发模型 3.1 网络并发模型概述 什么是网络并发 在实际工作中&#xff0c;一个服务端程序往往要应对多个客户端同时发起访问的情况。如果让服务端程序能够更好的同时满足更多客户端网络请求的情形&#xff0c;这就是并发网络模型。 循环网络模型问题 循环网络模型只能…

逻辑回归损失函数

文章目录 1.基础简析交叉熵损失函数&#xff08;Cross-Entropy Loss&#xff09;对数似然损失函数&#xff08;Log-Likelihood Loss&#xff09; 2.关键步骤3.案例 1.基础简析 逻辑回归&#xff08;Logistic Regression&#xff09;是一种广泛应用于分类问题的统计模型&#x…

C++进阶 继承

目录 继承的概念及定义 继承概念 继承定义 定义格式 继承关系和访问限定符 继承基类成员访问方式的变化 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 构造函数 拷贝构造函数 赋值运算符重载 析构函数 总结 继承与友元 继承与静态成员 浅谈复杂…

Scott Brinker:消除噪音越来越难?这是一个越来越有效的营销渠道

合作伙伴成为更有效的渠道 对于普通读者来说&#xff0c;我看好生态系统并不奇怪。我一直主张&#xff0c;平台生态系统可以解决不断变化、高度多样化的市场格局中的许多挑战。这也是我在HubSpot和公司的技术合作伙伴生态系统所关注的。 在本月早些时候的文章中&#xff0c;我…

SpringMVC源码深度解析(中)

接上一遍博客《SpringMVC源码深度解析(上)》继续聊。最后聊到了SpringMVC的九大组建的初始化&#xff0c;以 HandlerMapping为例&#xff0c;SpringMVC提供了三个实现了&#xff0c;分别是&#xff1a;BeanNameUrlHandlerMapping、RequestMappingHandlerMapping、RouterFunctio…

AI一站式科研写作利器:PaperPal

文章目录 在线编辑Word 插件 在线编辑 PaperPal是一款面向科研人员的写作工具&#xff0c;支持在线编辑以及Word插件。下面以在线编辑为例&#xff0c;详述PaperPal的润色功能。 进入网页后&#xff0c;点击【新建在线文档】&#xff0c;即可开启润色功能&#xff0c;界面如下…

《昇思25天学习打卡营第24天|基于 MindSpore 实现 BERT 对话情绪识别》

1. BERT 模型概述 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一个预训练的语言表示模型&#xff0c;可以应用于多种自然语言处理任务&#xff0c;包括对话情绪识别。BERT 通过双向 Transformer 编码器&#xff0c;能同时考虑句子…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 图像物体的边界(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

word 设置目录中英文字母大写改为小写

选中目录右击“字体”&#xff0c;设置“小型大写字母”。

【Vue3】工程创建及目录说明

【Vue3】工程创建及目录说明 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日…

【LeetCode】从中序与后序遍历序列构造二叉树

目录 一、题目二、解法完整代码 一、题目 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], …

谷粒商城实战笔记-40-前端基础-Vue-计算属性、监听器、过滤器

文章目录 一&#xff0c;计算属性1&#xff0c;用途2&#xff0c;用法2.1 定义View2.2 声明计算属性 3&#xff0c;注意事项 二&#xff0c;监听器1. 使用 watch 监听属性的变化 三&#xff0c;过滤器1&#xff0c;定义局部过滤器2&#xff0c;定义全局过滤器3&#xff0c;使用…

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(六)-无人机直接C2通信

目录 引言 5.4 直接C2通信 5.4.1 概述 5.4.2 A2X直接C2通信服务的授权策略 5.4.3 USS使用A2X直接C2通信服务的C2授权程序 5.4.4 直接C2通信建立程序 引言 3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别…

bs4模块使用(一)

1. 安装BS4 pip install beautifulsoup4 pip install lxml2. 对象种类 bs4将html文档解析成一个树形结构&#xff0c;每个节点都是python对象&#xff0c;大概可分为下面四种&#xff1a; 2.1 Tag 后面再详细介绍&#xff0c;先介绍最重要的两个属性 name soup Beautiful…

数据结构——队列(链式结构)

一、队列链式结构定义 队列的链式存储结构是一种用链表实现的队列,它不像顺序存储结构那样需要预先分配固定大小的空间。链式存储结构的队列由节点组成,每个节点包括数据和指向下一个节点的指针。队列的链式存储结构可以动态地分配内存,更灵活地处理数据。在链式存储结构中…

【java SE语法篇】1.运算符

目录 1. 运算符和表达式2. 算数运算符3. 隐式转换4. 强制转换5. 自增自减运算符6. 赋值运算符7. 扩展运算符8. 关系运算符9. 逻辑运算符9.1 & 和 | 的使用&#xff1a;9.2 ^&#xff08;异或&#xff09;的使用&#xff1a;9.3 !&#xff08;取反&#xff09;的使用&#x…

监控易直播回放2407期:IT监控平台可视化运维

主播&#xff1a;监控易技术经理 刘美玲 大家好&#xff0c;现在是7月18号下午2点&#xff0c;欢迎大家来到本次的直播分享。今天&#xff0c;我们将深入探讨IT监控平台的可视化实现。在这个信息化时代&#xff0c;IT设备的稳定性对于业务的连续性起着至关重要的作用。而IT监控…