12
Verteilte Datenbanken - Persistant Queues Arno Schmidhauser Letzte Revision: März 2011 Email: [email protected] Webseite: http://www.sws.bfh.ch/db

Persistant Message Queues

Embed Size (px)

Citation preview

Page 1: Persistant Message Queues

Verteilte Datenbanken -Persistant Queues

Arno SchmidhauserLetzte Revision: März 2011Email: [email protected]: http://www.sws.bfh.ch/db

Page 2: Persistant Message Queues

Nachteile des Two Phase Commit (2PC) in globalen Systemen

• 2PC verfolgt das ACID-Prinzip und erreicht damit eine globale Konsistenz unmittelbar nach jeder Transaktion.

• Die Verfügbarkeit der benötigten Datenbanken ist aber nicht immer kontrollierbar.

• Die Öffnung von Systemresourcen für das 2PC, wie der Zugriff auf die beteiligten Datenbanken, die 2PC-Fähigkeit, die Verfügbarkeit der gewünschten 2PC-API's für den Transaktionsmanager usw., ist nicht immer wünschens-wert oder möglich.

• Die Kontrolle über die Struktur der beteiligten Datenbanken, insbesondere über Unternehmen hinweg, ist nicht immer gegeben.

Page 3: Persistant Message Queues

BASE ergänzt ACID

• Zunehmender Paradigmenwechsel: Eine verfügbare Applikation ist in vielen Fällen wichtiger als globale Konsistenz. Das C im ACID wird abgeschwächt zu:

– Basically Available (Vorrangige Verfügbarkeit)– Soft State (Sichtbare Zwischenzustände erlaubt)– Eventually Consistent (Konsistenz mit Verzögerung)

• Persistent Message Queues (PMQ) sind eine wichtige Realisierung dieses Prinzips

Page 4: Persistant Message Queues

PMQ - Beispiel

• Das Bearbeiten und der Versand einer Bestellung hängen zeitlich unkritisch vom unmittelbaren Einkauf ab.

Shop/Bestellung(Amazon US)

DB 1

Lager/Versand(DE)

DB 2

PMQ Versandaufträge

begin transaction

// Message erstellen

// aus DB1

q.enqueue ( message )

commit

begin transaction

message = q.dequeue()

// Message in DB2

// hinein verarbeiten

commit

Page 5: Persistant Message Queues

PMQ – Grundsätze (1)

• Versenden, Empfangen und Bearbeiten einer Message kann als asynchrone Transaktion auf einem globalen Datenbestand, mit zwischenzeitlich inkonsistentem Zustand, angesehen werden.

• Versand und Empfang können asynchron stattfinden.• Werden die Message selbst in einer Datenbank

abgespeichert, ist deren Verarbeitung nach einer bestimmten Zeit garantiert.

• Die Verarbeitung ist skalierbar durch parallele arbeitende Message-Produzenten und Message-Konsumenten.

Page 6: Persistant Message Queues

PMQ – Grundsätze (2)

• Message Queues haben generische, aplikationsunab-hängige Eigenschaften, was ihre Verwendung einfach macht:– First-in / First-out Prinzip– enqueue() und dequeue() Methoden

• Hilfsmethoden ergänzen das generische Verhalten– Umgang mit vergifteten Messages– Timeouts für nicht abgeholte Meldungen– Filter für Typ, Absender, Empfänger etc.– Sortierung nach Priorität, Zeit etc.

Page 7: Persistant Message Queues

Applikation 2

lokale Transaktion

Applikation 1

lokale Transaktion

Messageing = zeitlich entkoppelte Transaktionen (1)

Messageing-System

DB 1

mDB

DB 2

MessageMessagebegin transaction DB1

// Message erstellen aus DB1

commit DB1

begin transaction mDB

// Message in mDB übertragen

q.enqueue ( message )

commit mDB

begin transaction mDB

// Message konsumieren

message = q.deueue ()

commit mDB

begin transaction DB2

// Message verarbeiten in DB2

commit DB2

Page 8: Persistant Message Queues

Applikation 2

lokale Transaktion

Applikation 1

lokale Transaktion

Messageing = zeitlich entkoppelte Transaktion (2)

Messageing-System

DB 1

mDB

DB 2

MessageMessagebegin transaction DB1

// Message erstellen aus DB1

begin transaction mDB

// Message in mDB übertragen

q.enqueue ( message )

commit mDB

commit DB1

begin transaction DB2

begin transaction mDB

// Message konsumieren

message = q.deueue ()

commit mDB

// Message verarbeiten in DB2

commit DB2

Page 9: Persistant Message Queues

Messageing mit Two Phase Commit

Messageing-System

Applikation 1

DB 1

mDB

Applikation 2

DB 2

MessageMessage

Two Phase CommitTwo Phase Commit

begin transaction DB1, mDB

// Message erstellen aus DB1

// Message in mDB übertragen

q.enqueue ( message )

commit DB1, mDB

begin transaction DB2, mDB

// Message aus mDB konsumieren

message = q.deueue ()

// Message verarbeiten

commit DB2, mDB

Page 10: Persistant Message Queues

Queue DB

PMQ Implementation mit Database API

• Zwei Prozesse greifen via API auf eine Queue-Datenbank zu (enqueue()/dequeue() Operationen über JDBC o.ä.).

• Die Queue-Datenbank befindet sich im lokalen Applikations-Umfeld.• Im einfachsten Fall alle drei DB's identisch.• 2PC ist jeweils zwischen DB1 und QueueDB resp. zwischen QueueDB

und DB2 möglich.

Prozess 1

Prozess DB 1

PMQ-API

Prozess 1

PMQ-API

Prozess DB 2

sql-Befehle

sql-Befehle

Page 11: Persistant Message Queues

PMQ Implementation mit SOA

• Die PMQ ist ein vollständig unabhängiger Dienst, ev. geografisch und unternehmensmässig getrennt von den Message-Produzenten und –Konsumenten.

• PMQ-System wird über REST/HTTP- oder Web-Service angesprochen.

• Die Queue-Datenbank wird von einem unabhängigen Datenbanksystem (Resource Manager) kontrolliert.

• Kein 2PC sinnvoll.• Beispiel Amazon SQS

– HTTP Interface– WSDL Interface

• Viele weitere professionelle Queueing Systeme, z.B. IBM WebSphere MQ, Microsoft, Oracle, Apache usw.

Page 12: Persistant Message Queues

Vollständig sicheres Messageing ohne Two Phase Commit

Messageing-Applikation

Sender

DB 1

Empfänger

DB 2

MessageNr 12

MessageNr 12

LMN

(z.B. 11)