Ich verwende Django-Sellerie + RabbitMQ für meinen aktuellen Job, aber da ich AWS für die Infrastruktur verwende, habe ich mich gefragt, ob es mit Amazon SQS verknüpft werden kann, also habe ich es versucht.
Den Quellcode finden Sie unter GitHub.
Installieren Sie die erforderlichen Bibliotheken mit 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
Bereiten Sie vor dem Bearbeiten von settings.py den Zugriffsschlüssel und den geheimen Schlüssel vor, da Amazon SQS verwendet wird. Sie können den Zugriffsschlüssel usw. direkt in settings.py schreiben, aber ich wollte ihn nicht mit git verwalten, also habe ich versucht, django-dotenv zu verwenden.
Die .env-Datei sieht folgendermaßen aus:
.env
AWS_SQS_ACCESS_KEY=XXXXX
AWS_SQS_SECRET_ACCESS_KEY=YYYYY
AWS_SQS_REGION=ap-northeast-1
Bearbeiten Sie dann settings.py.
demo/settings.py
#Import hinzugefügt
import os
import urllib
〜
#DB ist sqlite3
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'demo.db',
}
}
〜
#Ändern Sie vorerst die Zeitzone
TIME_ZONE = 'Asia/Tokyo'
〜
INSTALLED_APPS = (
〜
#Fügen Sie Folgendes hinzu
'djcelery',
'items',
)
〜
#Fügen Sie am Ende Folgendes hinzu
# urllib.Ich verwende Zitat, weil der Zugriffsschlüssel möglicherweise eine Zeichenfolge enthält, für die eine URL-Codierung erforderlich ist.
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-'}
Fügen Sie dann Folgendes zu manage.py hinzu:
manage.py
import dotenv
dotenv.read_dotenv()
Die .env-Datei ist jetzt geladen.
Angemessen.
items/models.py
from django.db import models
class Item(models.Model):
uuid = models.CharField(max_length=200)
created_at = models.DateTimeField('created at')
Erstellen Sie eine Aufgabe, die asynchron verarbeitet werden soll. Es scheint, dass diese Datei den Namen ** task.py ** haben muss.
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()
Dies ist auch angemessen.
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')
Bearbeiten Sie auch 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'),
)
Bereiten Sie vorher die DB vor. Eine Sellerie-bezogene Tabelle wird ebenfalls erstellt.
$ python manage syncdb
Starten Sie celeryd.
Fügen Sie -l info
hinzu, um das Protokoll zu überprüfen.
$ python manage.py celeryd
Zuerst wurde celeryd nicht gestartet und der folgende Fehler ist aufgetreten.
ValueError: invalid literal for int() with base 10: ‘XXXXXXXXXX’
> Die Ursache wird auch in der Bearbeitung von settings.py angegeben. Dies liegt jedoch daran, dass der AWS-Zugriffsschlüssel und der geheime Schlüssel manchmal eine Zeichenfolge enthalten, für die eine URL-Codierung erforderlich ist.
Starten Sie nach dem erfolgreichen Start von celeryd die Django-Anwendung.
$ python manage.py runserver
Versuchen Sie nach dem Start, auf http: // localhost: 4567 / items / zuzugreifen.
Wenn Sie das Protokoll von celeryd überprüfen, wird das folgende Protokoll angezeigt und Sie können bestätigen, dass Sie die Nachricht entgegennehmen können.
[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
Wenn Sie auch die Datenbank überprüfen, wird der Datensatz ordnungsgemäß erstellt.
$ sqlite3 demo.db
sqlite> select * from items_item; 1|c23bd4f4-720f-4488-a6b9-dc26ed495c71|2014-01-25 06:38:26.908489
Als ich SQS überprüfte, wurden die folgenden zwei Warteschlangen erstellt.
* celery_sqs_demo-celery
* celery_sqs_demo-celery_ {Hostname} -celery-pidbox
#### **`celery_sqs_Der Demo-Teil sind Einstellungen.BROKER mit py_TRANSPORT_Dies ist das in OPTIONS festgelegte Präfix.`**
```BROKER mit py_TRANSPORT_Dies ist das in OPTIONS festgelegte Präfix.
Ich bin nicht sicher, wozu die Warteschlange cellery_ {hostname} -celery-pidbox dient, also werde ich sie nachschlagen.
# Zusammenfassung
Ich dachte, es würde länger dauern, aber ich konnte die Operation ohne große Suchtpunkte problemlos bestätigen.
Die Zusammenarbeit mit SQS ist jedoch noch experimentell, sodass ich es kaum erwarten kann, stabil zu werden.
Beim nächsten Mal möchte ich Nachrichten von mehreren Hosts senden und versuchen, festzustellen, ob es doppelte Aufgaben gibt.
# Referenz
* [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)
* [Kurzanleitung für die asynchrone Verarbeitung mit django-cellery --hirokikys Blog](http://blog.hirokiky.org/2013/03/23/quick_start_guid_about_django_celery.html)
Recommended Posts