0% fanden dieses Dokument nützlich (0 Abstimmungen)
51 Ansichten25 Seiten

Kaninchen & Schlangen: RabbitMQ & Python

RabbitMQ ist ein Message Broker, der das Advanced Message Queuing Protocol (AMQP) nutzt. Man kann RabbitMQ zum Entkoppeln der verschiedenen Teile einer Applikation nutzen und die Nachrichten asynchron verarbeiten. Das bringt mehr Flexibilität, Skalierbarkeit und Performance. In diesem Vortrag werden verschiedene Python-Bibliotheken zur Nutzung des AMQP und ein Distributed Task Queue, der mit RabbitMQ arbeitet, vorgestellt.
Copyright
© Attribution ShareAlike (BY-SA)
Wir nehmen die Rechte an Inhalten ernst. Wenn Sie vermuten, dass dies Ihr Inhalt ist, beanspruchen Sie ihn hier.
Verfügbare Formate
Als PDF, TXT herunterladen oder online auf Scribd lesen
0% fanden dieses Dokument nützlich (0 Abstimmungen)
51 Ansichten25 Seiten

Kaninchen & Schlangen: RabbitMQ & Python

RabbitMQ ist ein Message Broker, der das Advanced Message Queuing Protocol (AMQP) nutzt. Man kann RabbitMQ zum Entkoppeln der verschiedenen Teile einer Applikation nutzen und die Nachrichten asynchron verarbeiten. Das bringt mehr Flexibilität, Skalierbarkeit und Performance. In diesem Vortrag werden verschiedene Python-Bibliotheken zur Nutzung des AMQP und ein Distributed Task Queue, der mit RabbitMQ arbeitet, vorgestellt.
Copyright
© Attribution ShareAlike (BY-SA)
Wir nehmen die Rechte an Inhalten ernst. Wenn Sie vermuten, dass dies Ihr Inhalt ist, beanspruchen Sie ihn hier.
Verfügbare Formate
Als PDF, TXT herunterladen oder online auf Scribd lesen

Kaninchen & Schlangen

RabbitMQ & Python


Markus Zapke-Gründemann
11. DZUG-Tagung zu Zope, Plone und Python
Markus
Zapke-Gründemann
• Softwareentwickler seit 2001
• Schwerpunkt: Web Application Development
mit Python und PHP
• Django, symfony & Zend Framework
• Freier Softwareentwickler und Berater
seit 2008
• [Link]
Übersicht
• Warum Queues?
• AMQP
• RabbitMQ
• Python Bibliotheken
• Carrot
• Celery
Warum Queues?

• Entkoppeln von Informationsproduzenten


und -konsumenten
• Asynchrone Verarbeitung
• Load Balancing
• Skalierbarkeit
AMQP

• Advanced Message Queuing Protocol


• Offenes Protokoll
• Plattformunabhängig
• Port 5673/tcp
• [Link]
AMQP

• Offener Standard für Messaging Middleware


• Virtual Hosts
• Exchange (durable oder auto-deleted)
• Binding
• Queue (durable oder auto-deleted)
Producer - Consumer

Quelle: [Link]
Fanout Exchange

Quelle: [Link]
Direct Exchange

Quelle: [Link]
Topic Exchange

Quelle: [Link]
RabbitMQ
• AMQP Message Broker
• Erlang
• Open Source
• Mitglied in der AMQP Working Group
• XMPP, SMTP, STOMP und HTTP (mit
Adaptern)
• [Link]
Virtual Host Access Control
mit RabbitMQ

$ rabbitmqctl add_user username secret


$ rabbitmqctl add_vhost message-vhost
$ rabbitmqctl set_permissions -p message-vhost username ".*" ".*" ".*"

Konfiguration
Schreiben
Lesen
Python Bibliotheken

• amqplib - Python AMQP Client


• carrot - AMQP Messaging Framework
• pika - Python AMQP Client
• txAMQP - Python AMQP Library für Twisted
Carrot
• AMQP Messaging Framework
• High-Level Interface
• Benutzt amqplib
• Serialisierung (Pickle, JSON,YAML)
• Autor: Ask Solem
• [Link]
[Link]
exchange = 'messaging'
queue = 'mbox'
routing_key = 'message'

[Link]
from [Link] import BrokerConnection

conn = BrokerConnection(hostname='localhost', userid='username',


password='secret', virtual_host='message-vhost')
[Link]
import datetime

from [Link] import Publisher


from [Link] import gen_unique_id

from conf import exchange, queue, routing_key


from connection import conn

publisher = Publisher(connection=conn, exchange=exchange,


routing_key=routing_key, queue=queue,
serializer='pickle')
data = {'message_id': gen_unique_id(),
'timestamp': [Link](),
'message': 'Lorem ipsum dolor sit amet.'}
[Link](data)
[Link]
from [Link] import Consumer

from conf import exchange, queue, routing_key


from connection import conn

class MessageConsumer(Consumer):
def receive(self, message_data, message):
data = (message.delivery_tag, message_data['message'],
message_data['message_id'],
message_data['timestamp'].isoformat())
print 'Message %d "%s" with id %s sent at %s.' % data
[Link]()

if __name__ == '__main__':
consumer = MessageConsumer(connection=conn, queue=queue,
exchange=exchange, routing_key=routing_key)
[Link]()
Celery
Distributed Task Queue
• Backends: RabbitMQ, STOMP, Redis, Ghetto
Queue
• Clustering mit RabbitMQ
• Webhooks
• Django-Integration (optional)
• Autor: Ask Solem
• [Link]
Celery
Distributed Task Queue

• Serialisierung (Pickle, JSON,YAML)


• Parallele Ausführung
• Zeitgesteuerte Ausführung
• SQLAlchemy, carrot, anyjson
Python Task
# Task als Klasse
from [Link] import Task
from [Link] import User

class CreateUserTask(Task):
def run(self, username, password):
[Link](username, password)

>>> from tasks import CreateUserTask


>>> CreateUserTask().delay('john', 'secret')

# Task als Funktion mit Decorator


from [Link] import task
from [Link] import User

@task()
def create_user(username, password):
[Link](username, password)

>>> from tasks import create_user


>>> create_user.delay('john', 'secret')
Python Task
@task() # Benutzt pickle, um das Objekt zu serialisieren.
def check_means(user):
return user.has_means()

>>> from tasks import check_means


>>> result = check_means.delay(user)
>>> [Link]() # Gibt True zurück wenn der Task beendet ist.
False
>>> [Link] # Task ist noch nicht beendet, kein Ergebnis verfügbar.
None
>>> [Link]() # Warten bis der Task fertig ist und Ergebnis zurückgeben.
93.27
>>> [Link] # Jetzt ist ein Ergebnis da.
93.27
>>> [Link]() # War der Task erfolgreich?
True
Python Task
Konfiguration
# [Link]
BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "myuser"
BROKER_PASSWORD = "mypassword"
BROKER_VHOST = "myvhost"

CELERY_RESULT_BACKEND = "database"
CELERY_RESULT_DBURI = "mysql://user:password@host/dbname"

CELERY_IMPORTS = ("tasks", )

$ celeryd --loglevel=INFO
Zeitgesteuerter Task
# Periodic task
from [Link] import periodic_task
from datetime import timedelta

@periodic_task(run_every=timedelta(seconds=30))
def every_30_seconds():
print("Running periodic task!")

# crontab
from [Link] import crontab
from [Link] import periodic_task

@periodic_task(run_every=crontab(hour=7, minute=30, day_of_week=1))


def every_monday_morning():
print("Execute every Monday at 7:30AM.")

$ celerybeat
$ celeryd -B
Fotos der Titelfolie

• Kaninchen: Gidzy [Link]


photos/gidzy/3614942864/
• Grüne Python: Frank Wouters - http://
[Link]/photos/frank-wouters/
540417590/
Lizenz
Dieses Werk ist unter einem Creative Commons
Namensnennung-Weitergabe unter gleichen
Bedingungen 3.0 Unported Lizenzvertrag lizenziert.
Um die Lizenz anzusehen, gehen Sie bitte zu
[Link] oder
schicken Sie einen Brief an Creative Commons, 171
Second Street, Suite 300, San Francisco, California
94105, USA.

Das könnte Ihnen auch gefallen