Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Tareas asíncronas y sistemas distribuidos en dj...

Diego
August 18, 2018

Tareas asíncronas y sistemas distribuidos en django

Tareas distribuidas o como desacoplar
ciertas tareas (usualmente pesadas o no) o
distribuir a otro servidor.

Diego

August 18, 2018
Tweet

Other Decks in Programming

Transcript

  1. Tareas asíncronas y sistemas distribuidos en Diego Puente – python

    dev @ Flyers Concierge Charla inspirada en la de Martin Alderete, pyconar 2014 PyCon Ar 2014 - Martín Alderete - Trabajando de forma asíncrona en Django / Python
  2. ¿De que va la charla? Tareas distribuidas o como desacoplar

    ciertas tareas (usualmente pesadas o no) o distribuir a otro servidor.
  3. Agenda • Repaso – ¿que es django? – HTTP (ciclo

    petición-respuesta) • Presentación del problema • Brokers de mensajes • Celery – Tasks – Routing – Workers – AsyncResult – Periodic tasks • Monitoreo • Ejemplo en código
  4. ¿Que es django? Framework web hecho en python. Muy bueno

    pero ... ¿Que es un framework web? Conjunto de herramientas que ayudan a desarrollar un sitio con mayor rapidez y robustez. Entre ellas: – ORM – Plantillas – Router – Caching – Logging – Autenticación – Permisos – Traducciones – Admin – Mucho mas ... Para mas info de django: https://www.djangoproject.com/
  5. Ciclo petición-respuesta HTTP: Protocolo de transferencia de hipertexto, es un

    protocolo sin estado es decir que no guarda información sobre conexiones anteriores.
  6. ¿Cual es el problema? ¿Como sacamos un proceso que tarda

    bastante del ciclo request-response para ejecutarlo en otro proceso/maquina?
  7. El problema en código def register_user(request): if request.method == 'POST':

    form = RegisterUserForm(request.POST) if form.is_valid(): user = form.save() send_registration_email(user) return redirect('main_page') else: form = RegisterUserForm() context = {'form': form} return render(request, 'auth/registration.html', context)
  8. Código bloqueante def register_user(request): if request.method == 'POST': form =

    RegisterUserForm(request.POST) if form.is_valid(): user = form.save() send_registration_email(user) return redirect('main_page') else: form = RegisterUserForm() context = {'form': form} return render(request, 'auth/registration.html', context)
  9. Brokers de mensajes Y varios mas ... RabbitMQ is feature-

    complete, stable, durable and easy to install. It’s an excellent choice for a production environment. Redis is also feature- complete, but is more susceptible to data loss in the event of abrupt termination or power failures. Detailed information about using Redis
  10. Ventajas y desventajas Ventajas: • Permite desacoplar el sistema. •

    Permite distribuir el sistema. • Permite la intercomunicación entre tecnologías. • Permite escalar. Desventajas: • Agrega complejidad al stack. • Necesita mantenimiento. • Dificultad para debugear.
  11. Solución propuesta: Celery Celery es un sistema distribuido simple, flexible

    y confiable para procesar grandes cantidades de mensajes, al tiempo que proporciona a las operaciones y las herramientas necesarias para mantener dicho sistema. Es una cola de tareas que se enfoca en el procesamiento en tiempo real y, al mismo tiempo, admite la programación de tareas.
  12. Celery Es un conjunto de herramientas que nos permite trabajar

    fácilmente con múltiples servicios, con algo de azúcar sintáctico. Es una forma de lanzar servicios viéndolos como tareas. – RabbitMQ o Redis: sistema de comunicaciones. – AMQP(advance message queuing protocol): como protocolo. – Kombu: Libreria de mensajes en python. Provee una interfaz de alto nivel para el protocolo AMQ.
  13. Celery application $ pip install celery from django.conf import settings

    • from celery import Celery app = Celery('celery_talk', backend='amqp', broker=settings.BROKER_URL) app.config_from_object('django.conf:settings') app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
  14. Celery tasks • Las tareas son la base de cualquier

    aplicación celery. • Es una clase que puede crear a partir de cualquier callable. • Tiene dos funciones principales: – Definir que sucede cuando se la llama (se enviá un mensaje) – Definir que sucede cuando se la recibe (un worker recibe un mensaje) • Tienen un nombre único. • Por convención van en un modulo tasks.py adentro de un app de django.
  15. Celery tasks • Se pueden crear de dos maneras por

    medio de decoradores: – @app.task: define una tarea en una app especifica – @shared_task: define una tarea sin depender de una app especifica. • Posee opciones que cambian la manera de ejecutarse: – name = None – queue = “celery” – max_retries = 3 – default_retry_delay = 180 (segundos) – rate_limit = None (cant. de tareas por periodo de tiempo) – time_limit = None – ignore_result = False
  16. Tasks.py @app.task(ignore_result=True, time_limit=3 * 60) def send_registration_email(user): """Account confirmation""" subject

    = 'un subject' message = 'un mensaje' from_email = '[email protected]' return send_mail(subject, message, from_email, ['[email protected]'])
  17. Routing • Routing automático – CELERY_CREATE_MISSING_QUEUES = True CELERY_ROUTES =

    { 'core.tasks.test_task': { 'queue': 'low_priority' }, 'core.tasks.test_task_2': { 'queue': 'low_priority' }, 'core.tasks.send_registration_email': { 'queue': 'high_priority' } }
  18. Routing manual from kombu import Queue CELERY_DEFAULT_QUEUE = "default" CELERY_DEFAULT_EXCHANGE

    = "tasks" CELERY_DEFAULT_EXCHANGE_TYPE = "topic" CELERY_DEFAULT_ROUTING_KEY = "task.default" CELERY_QUEUES = ( Queue('default', routing_key='task.#'), Queue('feed_tasks', routing_key='feed.#'), ) • CELERY_ROUTES = { 'feeds.tasks.import_feed': { 'queue': 'feed_tasks', 'routing_key': 'feed.import', } }
  19. Formas de lanzar una task • Síncrona: • Asíncrona: •

    Asíncrona con parámetros task() task.delay(*args,**kwargs) task.apply_async( args=[param1, param2], queue='feed_tasks', routing_key='feed.import' ) Algunos parámetros interesantes: • Linking • ETA y countdown • Expiration • Ignore result • retries
  20. Workers • For develop: • Consumiendo de una sola cola:

    • Levantar solo un beat: • En producción usando supervisor: python manage.py celery worker -B -l info python manage.py celery worker -Q queue_name -l info python manage.py celery beat [program:notifications] command=/home/d/venv/bin/python /home/webapp/manage.py celery worker -n notifications_staging -Q notifications -l info directory=/home/d/webapp stdout_logfile=/home/d/logs/webapp_notifications.log stderr_logfile=/home/d/logs/webapp_notifications.log autostart=true user=d group=workers autorestart=false killasgroup=true environment=DJANGO_SETTINGS_MODULE='settings.staging'
  21. AsyncResult • Celery nos devuelve un objeto de la clase

    AsyncResult el cual guarda el resultado de la ejecución una tarea. Donde lo guarda? En un backend. Para esto es necesario configurar en settings: CELERY_RESULT_BACKEND • Backends disponibles: redis, amqp, memcached, django orm, etc.
  22. AsyncResult API from celery.result import AsyncResult async_result = AsyncResult(task_id) async_result.status

    # u'SUCCESS' async_result.result # 3 async_result.ready() # True async_result.successful() # True
  23. Periodic tasks o Celery beat Un cron de tareas de

    celery, se puede configurar en settings o en el admin de django. Básicamente lo que se hace es elegir una tarea de las que creaste y decir cada cuanto tiempo se tiene que ejecutar o a que hora se tiene que ejecutar. Hay ejemplos en el código y lo voy a estar mostrando.
  24. Monitoreo con flower • Hay dos y flower es el

    mas completo • Monitoreo en tiempo real – Progreso de tareas e historial – Detalles de tareas – Gráfica y estadísticas • Control remoto – Estado de los workers y estadísticas – Reiniciar y apagar workers – Ver tareas programada(ETA/countdown) – Ver tareas que se ejecutan actualmente – Revocar o terminar tareas – Monitorear broker • HTTP API • Autenticación
  25. Muchas gracias! Eso fue todo, espero que les haya gustado.

    Email: [email protected] repo: https://github.com/diegoduncan21/celery_ta lk