Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

celery队列替代django-q队列 #2809

Open
wants to merge 5 commits into
base: master
Choose a base branch
from

Conversation

woshiyanghai
Copy link
Contributor

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

@LeoQuote
Copy link
Collaborator

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

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

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

@LeoQuote
Copy link
Collaborator

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

@LeoQuote
Copy link
Collaborator

LeoQuote commented Sep 14, 2024

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

@woshiyanghai
Copy link
Contributor Author

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

@LeoQuote
Copy link
Collaborator

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

@woshiyanghai
Copy link
Contributor Author

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

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

@woshiyanghai
Copy link
Contributor Author

celery/celery#6983

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

@woshiyanghai
Copy link
Contributor Author

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

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

@woshiyanghai
Copy link
Contributor Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants