[PYTHON] Ich habe versucht, Amazon SQS mit Django-Sellerie zu verwenden

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.

Vorbereitung

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

Erstellen Sie ein Beispielprojekt

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

Bearbeiten Sie settings.py

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.

Erstellen Sie eine Anwendung

Modell-

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

Aufgabe

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

Aussicht

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

Lauf

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

Ich habe versucht, Amazon SQS mit Django-Sellerie zu verwenden
Ich habe versucht, Amazon Glacier zu verwenden
Ich habe versucht, Selen mit Headless-Chrom zu verwenden
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, anytree zu verwenden
Ich habe versucht, aiomysql zu verwenden
Ich habe versucht, Summpy zu verwenden
Ich habe versucht, Coturn zu verwenden
Ich habe versucht, Pipenv zu verwenden
Ich habe versucht, Matplotlib zu verwenden
Ich habe versucht, "Anvil" zu verwenden.
Ich habe versucht, Hubot zu verwenden
Ich habe versucht, ESPCN zu verwenden
Ich habe versucht, openpyxl zu verwenden
Ich habe versucht, Ipython zu verwenden
Ich habe versucht, PyCaret zu verwenden
Ich habe versucht, Cron zu verwenden
Ich habe versucht, ngrok zu verwenden
Ich habe versucht, face_recognition zu verwenden
Ich habe versucht, Jupyter zu verwenden
Ich habe versucht, doctest zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, jinja2 zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, das Zeitfenster zu verwenden
Ich habe versucht, Mecab mit Python2.7, Ruby2.3, PHP7 zu verwenden
Ich habe versucht, Jupyter mit allen Amazon-Lichtern zu starten
Ich habe DBM mit Pylearn 2 unter Verwendung künstlicher Daten ausprobiert
Ich habe versucht, die Datenbank (sqlite3) mit kivy zu verwenden
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, mit Elasticsearch Ranking zu lernen!
[Ich habe versucht, Pythonista 3 zu verwenden] Einführung
Ich habe eine emotionale Analyse von Amazon Comprehend mit der AWS CLI durchgeführt.
Ich habe versucht, easydict (Memo) zu verwenden.
Ich habe versucht, das Gesicht mit Face ++ zu erkennen
Ich habe versucht, RandomForest zu verwenden
Ich habe versucht, mit PyCaret zu clustern
Ich habe versucht, BigQuery ML zu verwenden
Ich habe versucht, Git Inspector zu verwenden
Ich habe versucht, Magenta / TensorFlow zu verwenden
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, AWS Chalice zu verwenden
Ich habe versucht, Slack Emojinator zu verwenden
Ich habe versucht, die Python-Bibliothek von Ruby mit PyCall zu verwenden
Ich habe versucht, mit Python eine E-Mail von Amazon SES zu senden
Ich habe versucht, die handschriftliche Zeichenerkennung von Runenzeichen mit CNN mithilfe von Keras zu erkennen
Ich habe versucht, Rotrics Dex Arm # 2 zu verwenden
Ich habe versucht, Sätze mit summpy zusammenzufassen
Ich habe maschinelles Lernen mit liblinear versucht
Ich habe versucht, WebScraping mit Python.
Ich habe versucht, Essen mit SinGAN zu bewegen
Ich habe versucht, Rotrics Dex Arm zu verwenden