J'ai essayé d'utiliser Amazon SQS avec django-celery

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.

Préparation

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

Créer un exemple de projet

$ django-admin.py startproject demo .
$ python manage.py startapp items

Modifier les paramètres.py

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é.

Créer une application

modèle

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')

tâche

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()

Vue

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'),
)

Courir

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

J'ai essayé d'utiliser Amazon SQS avec django-celery
J'ai essayé d'utiliser Amazon Glacier
J'ai essayé d'utiliser du sélénium avec du chrome sans tête
J'ai essayé d'utiliser paramétré
J'ai essayé d'utiliser argparse
J'ai essayé d'utiliser la mimesis
J'ai essayé d'utiliser anytree
J'ai essayé d'utiliser aiomysql
J'ai essayé d'utiliser Summpy
J'ai essayé d'utiliser coturn
J'ai essayé d'utiliser Pipenv
J'ai essayé d'utiliser matplotlib
J'ai essayé d'utiliser "Anvil".
J'ai essayé d'utiliser Hubot
J'ai essayé d'utiliser ESPCN
J'ai essayé d'utiliser openpyxl
J'ai essayé d'utiliser Ipython
J'ai essayé d'utiliser PyCaret
J'ai essayé d'utiliser cron
J'ai essayé d'utiliser ngrok
J'ai essayé d'utiliser face_recognition
J'ai essayé d'utiliser Jupyter
J'ai essayé d'utiliser doctest
J'ai essayé d'utiliser du folium
J'ai essayé d'utiliser jinja2
J'ai essayé d'utiliser du folium
J'ai essayé d'utiliser la fenêtre de temps
J'ai essayé d'utiliser mecab avec python2.7, ruby2.3, php7
J'ai essayé de démarrer Jupyter avec toutes les lumières d'Amazon
J'ai essayé DBM avec Pylearn 2 en utilisant des données artificielles
J'ai essayé d'utiliser la base de données (sqlite3) avec kivy
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python
J'ai essayé Learning-to-Rank avec Elasticsearch!
[J'ai essayé d'utiliser Pythonista 3] Introduction
J'ai fait une analyse émotionnelle d'Amazon Comprehend avec l'AWS CLI.
J'ai essayé d'utiliser easydict (mémo).
J'ai essayé la reconnaissance faciale avec Face ++
J'ai essayé d'utiliser RandomForest
J'ai essayé le clustering avec PyCaret
J'ai essayé d'utiliser BigQuery ML
J'ai essayé d'utiliser git inspector
J'ai essayé d'utiliser magenta / TensorFlow
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
J'ai essayé d'utiliser AWS Chalice
J'ai essayé d'utiliser l'émojinateur Slack
J'ai essayé d'utiliser la bibliothèque Python de Ruby avec PyCall
J'ai essayé d'envoyer un e-mail d'Amazon SES avec Python
J'ai essayé la reconnaissance de caractères manuscrits des caractères runiques avec CNN en utilisant Keras
J'ai essayé d'utiliser Rotrics Dex Arm # 2
J'ai essayé de résumer des phrases avec summpy
J'ai essayé l'apprentissage automatique avec liblinear
J'ai essayé webScraping avec python.
J'ai essayé de déplacer de la nourriture avec SinGAN
J'ai essayé d'utiliser Rotrics Dex Arm