Archery icon indicating copy to clipboard operation
Archery copied to clipboard

celery队列替代django-q队列

Open woshiyanghai opened this issue 1 year ago • 9 comments

因为django-q无法实现多队列,且项目已经很久没更新了。django-q2虽然还在更新,但是依然不支持多队列,和优先级。 之前的pr比较乱,重新提交下,发现改动点好多。。好多单元测试都需要。。。

woshiyanghai avatar Sep 14 '24 05:09 woshiyanghai

这个PR确实很大! 我有一个建议, 你分成几步:

  1. 梳理所有异步任务的调用点
  2. 把调用的参数和返回都做成可序列化的参数, 比如 dict, json 等
  3. 替换 django-q 至 celery

这样你可以把这个任务分解成小任务, 我们其他的有需要的有时间的人也可以帮你完成.

LeoQuote avatar Sep 14 '24 06:09 LeoQuote

第二步里面, 可以尝试做一些 decorator 或者转换的相关函数, 这样可能后续是可以复用的

LeoQuote avatar Sep 14 '24 06:09 LeoQuote

https://benninger.ca/posts/celery-serializer-pydantic/ 还有类似这样的自动序列化工具, 也有可能是一个可行的方向

LeoQuote avatar Sep 14 '24 06:09 LeoQuote

https://benninger.ca/posts/celery-serializer-pydantic/ 还有类似这样的自动序列化工具, 也有可能是一个可行的方向

好的感谢,目前所有的任务调用点,和任务修改成celery这种基本完成了,我手动部署再本地,完成了,基本测试原来所有通知,都已经可以正常用。 1.目前存在一个是否将task任务结果保存django-db的问题,有时候会报出mysql has gone away?我也在尝试找文档解决https://github.com/celery/celery/pull/4292?代码只有很少的地方需要用到task result ,当然也可以使用task_id 来获取,有没有必要来保存到db?

2.目前存在有多个worker接受到同一task ,任务重复执行问题 https://github.com/celery/celery/issues/4400 ? 3.我在想有没有再archery 再单独启动celery beat 支持定时任务? 目前只有一个地方用到了,同步钉钉用户信息,当然支持是更好的,可以从后台直接添加注册果的task 比较方便。 4.很多的单元测试,需要改动。

woshiyanghai avatar Sep 14 '24 06:09 woshiyanghai

  1. mysql has gone away 应该是连接池的问题, 应该是worker 超时时间和 mysql 配置的超时时间不一致导致的.
  2. 任务重复执行可能是需要再做一个状态, 或者分片, 或者保证 worker 只有一个来解决.
  3. 定时任务要有的, 有定时执行是需要的吧

LeoQuote avatar Sep 14 '24 06:09 LeoQuote

  1. mysql has gone away 应该是连接池的问题, 应该是worker 超时时间和 mysql 配置的超时时间不一致导致的.
  2. 任务重复执行可能是需要再做一个状态, 或者分片, 或者保证 worker 只有一个来解决.
  3. 定时任务要有的, 有定时执行是需要的吧
  1. mysql has gone away 应该是连接池的问题, 应该是worker 超时时间和 mysql 配置的超时时间不一致导致的.
  2. 任务重复执行可能是需要再做一个状态, 或者分片, 或者保证 worker 只有一个来解决.
  3. 定时任务要有的, 有定时执行是需要的吧

好的,我先尝试解决以下前两个问题,感谢大佬的建议

woshiyanghai avatar Sep 14 '24 06:09 woshiyanghai

https://github.com/celery/celery/pull/6983

1.可以考虑使用beat 实现 ETA任务 2.考虑将rabbitmq consumer_timeout = 31622400000

woshiyanghai avatar Sep 14 '24 08:09 woshiyanghai

  1. mysql has gone away 应该是连接池的问题, 应该是worker 超时时间和 mysql 配置的超时时间不一致导致的.

这个问题你有解决方法么?可以指导以下,目前我依然在本地出现这个问题

woshiyanghai avatar Sep 14 '24 09:09 woshiyanghai

@LeoQuote 目前看所有功能都能通过了,这个单元测试需要大佬们帮忙看下

woshiyanghai avatar Sep 24 '24 06:09 woshiyanghai