django_rq無法監聽兩個佇列問題
阿新 • • 發佈:2018-12-16
django_rq是為django整合redis佇列,這個用的少,一般會選擇celery,沒辦法專案中用到了。用起來很簡單,配置可以參考官方文件:https://pypi.org/project/django-rq/。
settings.py 只需要配置如下:
INSTALLED_APPS =( #other apps “django_rq”, ) RQ_QUEUES = { 'default': { 'HOST': 'localhost', 'PORT': 6379, 'DB': 0, 'PASSWORD': 'some-password', 'DEFAULT_TIMEOUT': 360, },'with-sentinel': { 'SENTINELS': [('localhost', 26736), ('localhost', 26737)], 'MASTER_NAME': 'redismaster', 'DB': 0, 'PASSWORD': 'secret', 'SOCKET_TIMEOUT': None, }, 'high': { 'URL': os.getenv('REDISTOGO_URL', 'redis://localhost:6379/0'), # If you're on Heroku 'DEFAULT_TIMEOUT': 500, }, 'low': { 'HOST': 'localhost', 'PORT': 6379, 'DB': 0, } } RQ_EXCEPTION_HANDLERS = ['path.to.my.handler'] # If you need custom exception handlers
遇到的問題1【keyerror:default】:線上的佇列配置如下:
RQ_QUEUES = { '{q}high': { 'HOST': '127.0.0.1', 'PORT': 6379, 'DB': 0, 'DEFAULT_TIMEOUT': 360, 'SOCKET_KEEPALIVE': True, }, '{q}default': { 'HOST': '127.0.0.1', 'PORT': 6379, 'DB': 0, 'DEFAULT_TIMEOUT': 360, 'SOCKET_KEEPALIVE': True, }, }
{q}無法識別,於是刪掉{q},專案就可以啟動起來(後面版本降級後佇列啟動跟名無關,帶{q}也可以)。
遇到的問題2【進入high佇列的job只能入隊,無法出佇列】,在排查日誌的時候發現:
# 線上日誌如下: 2016-11-02 11:44:08,883 *** Listening on {q}high, {q}default... 2016-11-02 11:44:08,883 Sent heartbeat to prevent worker timeout. Next one should arrive within 420 seconds. # 自己的日誌為: 2016-11-02 11:44:08,883 *** Listening on default...
並沒有去監聽high佇列,於是有部分任務無法去執行。
最後,程式碼各個配置都對了一遍,上git找到django_rq原始碼,依賴包的版本也很重要,果不其然,線上是直接git安裝的一個未釋出的版本0.9.2.1,我是安裝最新版本0.9.3,可以發現django_rq更新竟然不是向前相容的,無耐^~^,我只好降級為django_rq==0.9.2,日誌監聽變為兩個佇列,一切正常了。