当前位置: 首页 > news >正文

做研究的网站网站建设制作过程

做研究的网站,网站建设制作过程,一二三四视频社区在线一中文,怎样做知道网站文章目录 为什么选择 RedBeat?方案坑事项记录 记一次工作上的问题 问题:项目上当前定时任务框架和服务端耦合,容易出现加载定时任务时间很长,影响后端服务启动,容易改动引发定时任务的问题。且能方便的动态的增加或删除…

文章目录

    • 为什么选择 RedBeat?
    • 方案
    • 坑事项记录

记一次工作上的问题

问题:项目上当前定时任务框架和服务端耦合,容易出现加载定时任务时间很长,影响后端服务启动,容易改动引发定时任务的问题。且能方便的动态的增加或删除定时任务而无需重启服务。
需求:将定时任务框架解耦,可以独立部署启动,不影响原来服务的功能,不会出现重复执行的定时任务和丢失定时任务
RedBeat是一个 Celery Beat 调度程序 ,它将计划任务和运行时元数据存储在Redis中。

为什么选择 RedBeat?

官方文档:https://redbeat.readthedocs.io/en/latest/intro.html
git仓库:https://github.com/sibson/redbeat

  1. 动态实时任务创建和修改,无需长时间停机
  2. 使用 Redis 绑定从任何语言外部管理任务
  3. 共享数据存储;Beat 不依赖于单个驱动器或机器
  4. 即使任务数量很多也能快速启动
  5. 防止意外运行多个 Beat 服务器
    用Celery-redbeat重构当前定时任务逻辑: Celery-redbeat是基于redis作为celery的中间件(broker)时的一个任务调度器(scheduler),有效提高调度器(scheduler)健壮性。

它最大的变化就是,它将调度器从原来Celery进程中的定时任务调度器(默认作为守护进程),改存在了Redis上。
因此,当任务创建或者发生变化的时候,调度器不再需要暂停和重载。利用Redis数据库的特性,我们只需要更新Redis中的键名,调度器就会随之发生改变。

方案

  1. 另起一个celery服务,不再跟随主服务启动
  2. 有一张数据库表用来针对动态定时任务做持久化存储以及做增删改查状态管理等。celery beat启动时会自动读取这张表的数据,将定时任务加载到redis中(每次会先清空再加载)
  3. 初始化完成后的redis数据, celery beat会根据redis里的scedule数据,如果满足执行条件,会将其推送到broker中,等待worker来消费
  4. 定时任务执行原理和之前可以保持一致,但不需要再往celery队列里插任务了,相当于直接执行celery队列中已有的任务,之前的锁逻辑还可以直接沿用
  5. 当用户对定时任务有任何更删改操作时,可以通过封装好的方法,先更新数据库中的值,然后直接更新redis中的值,从而同步更新队列中的定时任务,无需重启服务(此处需要保障数据库和redis的数据一致性,最后能有兜底or事务机制,要么都成功要么都失败)

坑事项记录

背景:发现线上服务会偶尔出现定时任务全部失效的情况,或者定时任务多次执行的情况
环境:k8s多pod部署服务来增加服务健壮性
分析线上日志,就是在某一个时间点突然报错:
LockNotOwnedError异常,表示无法释放或延长一个已经不再拥有的锁
所以一开始我们怀疑是redbeat存在bug,分析源码:
1、redbeat在启动时会触发 @beat_init.connect 装饰的 acquire_distributed_beat_lock 函数。使用 redis_client.lock() 方法创建一个分布式锁对象,通过 lock.acquire() 方法获取锁,此处会进行阻塞,直到成功获取到锁为止。最后,将获取到的锁对象赋值给调度器的 lock 属性。代码中生成的 time_task_:lock 锁用于在 Beat 启动时获取分布式锁,以实现在多个 Beat 进程或服务器之间协调任务调度的目的。这个锁对于 Beat 工作的用途是确保在分布式环境下只有一个 Beat 进程或服务器在执行任务调度。当多个 Beat 进程或服务器同时运行时,通过获取这个锁,只有获取到锁的进程或服务器可以执行任务调度,其他进程或服务器会被阻塞等待锁的释放。同时如果这个锁存在会给锁续期。(为了避免主进程 Readbeat 在执行任务时出现故障或长时间没有释放锁(例如进程崩溃、网络中断等情况),所以可能会有多个beat进程,虽然正常情况下永远只会有一个在工作。我们平台目前就只有一个beat服务)
2、然后Beat 服务会进入一个无限循环的进程,它会以一定的时间间隔进行轮询,检查是否需要执行任务。并且对time_task_:lock 锁进行续期。只有在进程终止时会释放

然后我们怀疑是,在某次续期时,这个锁会莫名其妙突然的消失,所以导致了报错问题
根据官方文档分析。time_task_:lock 锁仅仅是使用分布式锁来防止多个实例同时运行。我们当前仅设置一个实例服务,可以直接设置redbeat_lock_key = None关闭该功能。

本以为解决了问题,结果过了几天问题又再次出现,最后在偶然的灵机一动下发现
我们使用的k8s多pod服务,每个pod服务中的项目代码都是同一套一样的(不管是server还是celery还是beat),发现如果某个pod重启了,会将前面方案中的第二点中的预加载init函数(为了重置所有定时任务,防止异常数据残留)执行一次,就是会清空redis关于redbeat的数据然后重新加载数据,这就导致了所有数据和锁消失了~~

http://www.ds6.com.cn/news/68785.html

相关文章:

  • web可以做3d网站吗外包客服平台
  • 马可波罗网站做外贸采集站seo提高收录
  • 微名片网站怎么做今日小说百度搜索风云榜
  • 树莓派做影视网站浏览器网站大全
  • 保险做的好的网站有哪些沪深300指数基金
  • 城乡与建设部网站首页线上营销平台
  • 论坛类网站备案吗seo是怎么优化上去
  • 要网站开发费用短信网络营销推广方案前言
  • 成都手机网站制作重庆百度搜索优化
  • 建站报价天津seo建站
  • 企业网站的技术维护内容主要包括免费发帖的平台有哪些
  • 大学帮学校做网站百度福州分公司
  • 网站建设 软件优化推广网站怎么做
  • wordpress zhai主题百度竞价和优化的区别
  • 小米路由可以做网站吗网盘资源免费观看
  • 网站设计所用到的技术国产十大erp软件
  • 聊天软件怎么制作深圳抖音seo
  • 泊头市做网站清远今日头条最新消息
  • 上海做外贸网站设计网站创建免费用户
  • 贵阳手机网站建设宁波seo推广优化哪家强
  • 化妆品商城网站建设策划方案国外免费网站服务器
  • 响应式网站制作教程推广普通话宣传海报
  • 网页制作与网站建设技术大全电商广告网络推广
  • 杨凌企业网站建设seo怎么发布外链
  • 专业定制网吧桌椅seo的最终是为了达到
  • 如何做商业推广网站网络技术培训
  • wordpress电视直播代码湖北seo公司
  • 杭州做肉松饼的网站有多少家站长素材
  • 网站开发 php python重庆做优化的网络公司
  • 网站图标可以用ps 做吗武汉关键词排名提升