1. 程式人生 > >django_rq無法監聽兩個佇列問題

django_rq無法監聽兩個佇列問題

  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,日誌監聽變為兩個佇列,一切正常了。