Celery est un framework pour traiter les tâches Python dans une file d'attente. Vous pouvez utiliser Redis en tant que courtier de Celery, mais lors de l'utilisation d'Azure Redis Cache, j'étais accro à la partie qui utilise SSL, donc je vais laisser l'utilisation ici.
En supposant qu'il soit utilisé dans Flask, une application Web, je pense que c'est la même chose dans d'autres environnements.
Selon Quoi de neuf dans Celery 4.0 (appel latent), Celery pourra utiliser une connexion SSL avec Redis à partir de la version 4.0. C'est.
On dit qu'il peut être utilisé en paramétrant broker_use_ssl, mais dans le cas de Redis, cette information Cela ne fonctionne pas même si je l'ai réglé en avalant.
Error while reading from socket: (104, 'Connection reset by peer')
Vous serez en proie à l'erreur. Cette erreur est due à l'utilisation de redis.connection.Connection
de Redis au lieu de redis.connection.SSLConnection
pour se connecter à Redis dans Celery.
Correction de la prise en charge de Redis SSL Si vous ne définissez pas cette pull request comme référence, vous ne pourrez pas utiliser SSL.
from celery import Celery
from redis.connection import SSLConnection
from .config import broker_use_ssl
def make_celery(app):
celery = Celery(app.import_name, backend=app.config['CELERY_BACKEND'],
broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)
celery.conf.update(broker_use_ssl=broker_use_ssl)
# URL: https://github.com/celery/kombu/pull/634
if celery.conf.broker_use_ssl:
celery.backend.connparams.update(celery.conf.broker_use_ssl) # <-ici
celery.backend.connparams['connection_class'] = SSLConnection # <-ici
TaskBase = celery.Task
class ContextTask(TaskBase):
abstract = True
def __call__(self, *args, **kwargs):
with app.app_context():
return TaskBase.__call__(self, *args, **kwargs)
celery.Task = ContextTask
return celery
ʻApp, qui est passé comme argument de
make_celery, est le contexte d'application de Flask. Après avoir défini
broker_use_ssl, vous devez définir
celery.backend.connparams ['connection_class'] = SSLConnection`.
De plus, la documentation indique que broker_use_ssl
peut être défini sur True
ou sur un dictionnaire, mais définir ** True
ne fonctionne pas. ** Vous devez définir le dictionnaire. Contrairement à Ruby, le dictionnaire sera jugé comme «False» s'il est vide.
broker_use_ssl = {'ssl_cert_reqs': ssl.CERT_NONE}
Je pense que c'est une bonne idée de le garder.
Dans Céleri, définissez un mot de passe
CELERY_BROKER_URL = "redis://:password@hostname:port/db_number"
Doit être défini au format. J'ai gaspillé ma connaissance de HTTP, alors? Puis-je inclure le mot de passe dans l'URI? J'ai pensé, mais quand j'ai regardé l'implémentation interne, l'URI a été correctement analysé en interne.
L'implémentation interne de Celery était étonnamment compliquée et difficile à lire. En outre, la documentation Azure indique Comment utiliser Azure Redis Cache avec Python
Par défaut, les ports non SSL sont désactivés pour les nouvelles instances Azure Redis Cache car certains clients Redis ne prennent pas en charge SSL. Au moment d'écrire ces lignes, le client redis-py ne prend pas en charge SSL.
Cependant, en ce qui concerne le journal de validation, redis-py
prend en charge SSL à partir de 2014. J'aimerais que vous mettiez à jour l'ancienne description. C'est plutôt déroutant.
Recommended Posts