最近在做一款测试平台,需要用到实时日志系统,所以就采用了Django+channels+celery+redis架构。
以下为windows平台!
过程并不顺利,原因有:
1.对websocket不太熟
2.第一次接触channels、celery
3.第一次搞实时日志系统,没有经验
虽然这些技术以前略看过,但用起来是另一回事,特此记录踩坑记录,相关教程可以参考:
https://mp.weixin.qq.com/s/hqaPrPS7w3D-9SeegQAB2Q
https://mp.weixin.qq.com/s/r5SpyTjRl0jJeAuYE4Q_-Q
该教程使用Linux,而本人脑残使用了windows,所以除了很多问题,也刚好学习了很多,所幸最后都搞定了。
问题1:部署了channels收不到消息?
答案:多半是redis没有配置好
问题2:部署了celery,但是报错Celery ValueError: not enough values to unpack (expected 3, got 0)?
答案:celery版本太高,你一定是安装了celery4.x。建议退回到celery3.1.25
问题3:celery版本是3,但是报错:redis celery AttributeError: 'str' object has no attribute 'items'?
答案:降级了celery,也要降级redis,降redis降级到2.10.6
问题4:日志系统终于好了,但是前端关闭socket后再打开就收不到信息了?
答案:其实看celery日志就明白,channles_name没变,还是上一次的记录。是因为你使用了--pool=solo参数启动selery导致的,去掉该参数,使用 celery -A webset worker -l info启动,此时如果报错,大概率是因为上述问题2、3
问题5:celery启动了,redis也启动了,但是calery收不到消息?
答案:多半是你redis配置没弄好,查看webset/celery.py文件,查看redis配置,此时需注意celery3.x和celery4.x的配置有点区别
celery4.x:
app.autodiscover_tasks()
app.config_from_object('django.conf:settings',namespace='CELERY')
celery3.x:
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda :settings.INSTALLED_APPS)