J'utilise django-celery + RabbitMQ dans mon travail actuel, mais comme j'utilise AWS pour l'infrastructure, je me demandais s'il pouvait être lié à Amazon SQS, alors je l'ai essayé.
Le code source peut être trouvé sur GitHub.
Installez les bibliothèques requises avec pip.
$ pip install django
$ pip install django-celery
$ pip install boto
$ pip install django-dotenv
$ pip freeze > requirements.txt
$ django-admin.py startproject demo .
$ python manage.py startapp items
Avant de modifier settings.py, préparez la clé d'accès et la clé secrète car Amazon SQS sera utilisé. Vous pouvez écrire la clé d'accès, etc. directement dans settings.py, mais je ne voulais pas la gérer avec git, j'ai donc essayé d'utiliser django-dotenv.
Le fichier .env ressemble à ceci:
.env
AWS_SQS_ACCESS_KEY=XXXXX
AWS_SQS_SECRET_ACCESS_KEY=YYYYY
AWS_SQS_REGION=ap-northeast-1
Puis modifiez settings.py.
demo/settings.py
#importation ajoutée
import os
import urllib
〜
#DB est sqlite3
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'demo.db',
}
}
〜
#Changer le fuseau horaire pour le moment
TIME_ZONE = 'Asia/Tokyo'
〜
INSTALLED_APPS = (
〜
#Ajoutez ce qui suit
'djcelery',
'items',
)
〜
#Ajoutez ce qui suit à la fin
# urllib.J'utilise quote car la clé d'accès peut contenir une chaîne qui nécessite un encodage URL.
import djcelery
djcelery.setup_loader()
BROKER_URL = 'sqs://%s:%s@' % (urllib.quote(os.environ['AWS_SQS_ACCESS_KEY'], ''),
urllib.quote(os.environ['AWS_SQS_SECRET_ACCESS_KEY'], ''))
BROKER_TRANSPORT_OPTIONS = {'region': os.environ['AWS_SQS_REGION'],
'queue_name_prefix': 'celery_sqs_demo-'}
Ajoutez ensuite ce qui suit à manage.py:
manage.py
import dotenv
dotenv.read_dotenv()
Le fichier .env est maintenant chargé.
Approprié.
items/models.py
from django.db import models
class Item(models.Model):
uuid = models.CharField(max_length=200)
created_at = models.DateTimeField('created at')
Créez une tâche à traiter de manière asynchrone. Il semble que ce fichier doive être nommé ** tasks.py **.
items/tasks.py
import time
from celery import task
from items.models import Item
@task
def add_item(uuid, created_at):
time.sleep(3)
item = Item(uuid=uuid, created_at=created_at)
item.save()
Ceci est également approprié.
items/views.py
import uuid
from django.http import HttpResponse
from django.utils import timezone
from items.tasks import add_item
def index(request):
add_item.delay(uuid.uuid4(), timezone.now())
return HttpResponse('success')
Modifiez également urls.py.
demo/urls.py
from django.conf.urls import patterns, include, url
# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()
urlpatterns = patterns('',
url(r'^items/$', 'items.views.index'),
)
Avant cela, préparez le DB. Une table liée au céleri est également créée.
$ python manage syncdb
Commencez céleri.
Ajoutez -l info
pour vérifier le journal.
$ python manage.py celeryd
Au début, celeryd n'a pas démarré et l'erreur suivante s'est produite.
ValueError: invalid literal for int() with base 10: ‘XXXXXXXXXX’
> La cause est également écrite dans la modification de settings.py, mais c'est parce que la clé d'accès AWS et la clé secrète contiennent parfois une chaîne de caractères qui nécessite un codage d'URL.
Après avoir lancé avec succès celeryd, lancez l'application Django.
$ python manage.py runserver
Après le démarrage, essayez d'accéder à http: // localhost: 4567 / items /.
Si vous consultez le journal de céleri, vous pouvez voir le journal suivant et vous pouvez confirmer que vous pouvez prendre le message.
[2014-01-25 15:38:27,668: INFO/MainProcess] Received task: items.tasks.add_item[XXXXXXXXXX] [2014-01-25 15:38:30,702: INFO/MainProcess] Task items.tasks.add_item[XXXXXXXXXX] succeeded in 3.031301742s: None
Si vous vérifiez également la base de données, l'enregistrement est créé correctement.
$ sqlite3 demo.db
sqlite> select * from items_item; 1|c23bd4f4-720f-4488-a6b9-dc26ed495c71|2014-01-25 06:38:26.908489
Lorsque j'ai vérifié SQS, les deux files d'attente suivantes ont été créées.
* celery_sqs_demo-celery
* celery_sqs_demo-celery_ {nom d'hôte} -celery-pidbox
#### **`celery_sqs_La partie démo concerne les paramètres.COURTIER avec py_TRANSPORT_Ce sera le préfixe défini dans OPTIONS.`**
```COURTIER avec py_TRANSPORT_Ce sera le préfixe défini dans OPTIONS.
Je ne sais pas à quoi sert la file d'attente celery_ {hostname} -celery-pidbox, alors je vais la chercher.
# Résumé
Je pensais que cela prendrait plus de temps, mais j'ai pu confirmer l'opération facilement sans gros points de dépendance.
Cependant, la coopération avec SQS est toujours expérimentale, j'ai donc hâte de devenir stable.
La prochaine fois, j'aimerais envoyer des messages à partir de plusieurs hôtes et essayer de voir s'il y a des tâches en double.
# référence
* [First steps with Django - Celery 3.1.8 documentation](http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html#using-celery-with-django)
* [Using Amazon SQS - Celery 3.1.8 documentation](http://docs.celeryproject.org/en/latest/getting-started/brokers/sqs.html)
* [Guide de démarrage rapide du traitement asynchrone avec django-celery - le blog dehirokiky](http://blog.hirokiky.org/2013/03/23/quick_start_guid_about_django_celery.html)
Recommended Posts