Skip to content

Commit b6b91eb

Browse files
committed
1 parent 0b048e1 commit b6b91eb

File tree

4 files changed

+64
-10
lines changed

4 files changed

+64
-10
lines changed

core/common/backends.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,21 @@
1+
from celery_once.backends import Redis
12
from django.conf import settings
23
from django.contrib.auth.backends import ModelBackend
34
from mozilla_django_oidc.auth import OIDCAuthenticationBackend
45
from pydash import get
6+
from redis import Sentinel
7+
8+
9+
class QueueOnceRedisSentinelBackend(Redis):
10+
def __init__(self, backend_settings):
11+
self._sentinel = Sentinel(backend_settings['sentinels'])
12+
self._sentinel_master = backend_settings['sentinels_master']
13+
self.blocking_timeout = backend_settings.get("blocking_timeout", 1)
14+
self.blocking = backend_settings.get("blocking", False)
15+
16+
@property
17+
def redis(self):
18+
return self._sentinel.master_for(self._sentinel_master)
519

620

721
class OCLOIDCAuthenticationBackend(OIDCAuthenticationBackend):

core/settings.py

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -306,12 +306,27 @@
306306
REDIS_HOST = os.environ.get('REDIS_HOST', 'redis')
307307
REDIS_URL = f"redis://{REDIS_HOST}:{REDIS_PORT}"
308308

309+
REDIS_SENTINELS = os.environ.get('REDIS_SENTINELS', None)
310+
REDIS_SENTINELS_MASTER = os.environ.get('REDIS_SENTINELS_MASTER', 'default')
311+
REDIS_SENTINELS_LIST = []
312+
309313
# django cache
310314
if ENV and ENV not in ['ci']:
315+
OPTIONS = {}
316+
if REDIS_SENTINELS:
317+
for REDIS_SENTINEL in REDIS_SENTINELS.split(','):
318+
SENTINEL = REDIS_SENTINEL.split(':')
319+
REDIS_SENTINELS_LIST.append((SENTINEL[0], int(SENTINEL[1])))
320+
OPTIONS.update({
321+
'CLIENT_CLASS': 'django_redis.client.SentinelClient',
322+
'SENTINELS': REDIS_SENTINELS_LIST
323+
})
324+
311325
CACHES = {
312326
'default': {
313-
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
327+
'BACKEND': 'django_redis.cache.RedisCache',
314328
'LOCATION': REDIS_URL,
329+
'OPTIONS': OPTIONS
315330
}
316331
}
317332

@@ -337,25 +352,44 @@
337352
'core.common.tasks.populate_indexes': {'queue': 'indexing'},
338353
'core.common.tasks.rebuild_indexes': {'queue': 'indexing'}
339354
}
340-
CELERY_RESULT_BACKEND = f'redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB}'
341-
CELERY_RESULT_EXTENDED = True
355+
356+
CELERY_BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 259200} # 72 hours, the longest ETA
342357
CELERY_RESULT_BACKEND_TRANSPORT_OPTIONS = {
343358
'retry_policy': {
344359
'timeout': 10.0
345360
}
346361
}
362+
363+
if REDIS_SENTINELS:
364+
CELERY_RESULT_BACKEND = ''
365+
for REDIS_SENTINEL in REDIS_SENTINELS.split(','):
366+
CELERY_RESULT_BACKEND = CELERY_RESULT_BACKEND + f'sentinel://{REDIS_SENTINEL}/0;'
367+
CELERY_BROKER_TRANSPORT_OPTIONS.update({'master_name': REDIS_SENTINELS_MASTER})
368+
CELERY_RESULT_BACKEND_TRANSPORT_OPTIONS.update({'master_name': REDIS_SENTINELS_MASTER})
369+
else:
370+
CELERY_RESULT_BACKEND = f'redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB}'
371+
372+
CELERY_RESULT_EXTENDED = True
347373
CELERY_RESULT_EXPIRES = 259200 # 72 hours
348374
CELERY_BROKER_URL = CELERY_RESULT_BACKEND
349375
CELERY_BROKER_POOL_LIMIT = 50 # should be adjusted considering the number of threads
350376
CELERY_BROKER_CONNECTION_TIMEOUT = 10.0
351-
CELERY_BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 259200} # 72 hours, the lon
352377
CELERY_ACCEPT_CONTENT = ['application/json']
353-
CELERY_ONCE = {
354-
'backend': 'celery_once.backends.Redis',
355-
'settings': {
356-
'url': CELERY_RESULT_BACKEND,
378+
if REDIS_SENTINELS:
379+
CELERY_ONCE = {
380+
'backend': 'core.common.backends.QueueOnceRedisSentinelBackend',
381+
'settings': {
382+
'sentinels': REDIS_SENTINELS_LIST,
383+
'sentinels_master': REDIS_SENTINELS_MASTER
384+
}
385+
}
386+
else:
387+
CELERY_ONCE = {
388+
'backend': 'celery_once.backends.Redis',
389+
'settings': {
390+
'url': CELERY_RESULT_BACKEND,
391+
}
357392
}
358-
}
359393
CELERYBEAT_SCHEDULE = {
360394
'healthcheck-every-minute': {
361395
'task': 'core.common.tasks.beat_healthcheck',

docker-compose.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,14 @@ services:
1212
volumes:
1313
- postgres-data:/usr/share/postgres/data
1414
redis:
15-
image: redis:6.0.6-alpine
15+
image: bitnami/redis:7.0.12
1616
restart: "always"
17+
environment:
18+
- ALLOW_EMPTY_PASSWORD=yes
1719
healthcheck:
1820
test: "redis-cli ping"
21+
volumes:
22+
- redis-data:/bitnami/redis/data
1923
api:
2024
image: openconceptlab/oclapi2:${ENVIRONMENT-production}
2125
restart: "always"
@@ -171,3 +175,4 @@ services:
171175
volumes:
172176
postgres-data:
173177
es-data:
178+
redis-data:

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ celery[redis]==5.2.7
1818
celery_once==3.0.1
1919
git+https://github.com/snyaggarwal/flower # use until https://github.com/mher/flower/issues/1231 issue is resolved
2020
redis==4.5.5
21+
django-redis==5.3.0 # needed for redis sentinel support
2122
kombu==5.3.1
2223
django-elasticsearch-dsl==7.3
2324
drf-yasg==1.21.5

0 commit comments

Comments
 (0)