Reliable messaging

Preview:

Citation preview

Reliable Messaging

Marc de Graauw

Betrouwbaar transport

• Netwerk is niet betrouwbaar

• Het is niet te garanderen dat twee partijen beide 100% zeker weten dat communicatie geslaagd is

• Het is wel te garanderen dat als de communicatie niet geslaagd is, tenminste een partij dat weet

• Aanname: vroeg of laat is het netwerk weer beschikbaar

Eisen betrouwbaar transport

• Ieder bericht wordt minimaal een keer afgeleverd

• Ieder bericht wordt maximaal een keer afgeleverd

• Berichten worden afgeleverd in de volgorde waarin ze verzonden zijn

• Afgeleverde berichten worden bewaard

Het Issue

• Transport over HTTP is niet betrouwbaar

• Geen antwoord op een bericht:

– door timeout, netwerk down, server down

– niet zeker of het bericht al dan niet aangekomen en/of verwerkt is

HTTP Methods (RFC 2616)

• safe – heeft geen neveneffecten op de server

– HTTP: GET

– b.v.: opvragen informatie

• idempotent– laat server in zelfde staat na herhaling

– HTTP DELETE, PUT

– b.v. verwijderen record

• niet-idempotent– wijzigt server

– HTTP POST

– b.v. 100 aandelen kopen

Zender Ontvanger

Bericht

Zender Ontvanger

Bericht

Kopie van bericht

Ontvangstbevestiging

Verwerk bericht

Zender Ontvanger

Kopie van bericht

Ontvangstbevestiging

Bericht

Ontvangstbevestiging

Verwerk bericht

Niet verwerken

Betrouwbare aflevering

• Gegarandeerde aflevering– berichtnummers

– ontvangstbevestiging

– eventueel duplicaat zenden

• Eenmalige aflevering– duplicaatdetectie

– duplicaatverwijdering

• Volgordelijke aflevering– oplopende berichtnummering

Eisen aan betrouwbaar transport

• Eis 1: duplicaatdetectie is nodig voor niet-idempotente acties• Eis 2: ontvangstbevestigingen zijn nodig bij niet-directe acties• Ontwerprichtlijn: Geef bij iedere interactie aan of deze veilig en/of

idempotent is• Ontwerprichtlijn: Ieder bericht waarop niet direct een (ander) antwoord

komt, krijgt een ontvangstbevestiging• Ontwerprichtlijn: Idempotente berichten waarop het verwachte antwoord

niet komt, worden herhaald met een nieuw bericht-id. Geen duplicaat dus, maar een nieuw bericht

• Ontwerprichtlijn: De ontvanger hoeft voor idempotente berichten geen status (bericht-id en verzonden antwoord) te bewaren

• Ontwerprichtlijn: Niet-idempotente berichten waarop het verwachte antwoord niet komt, worden herhaald met een duplicaat.

Transport Level Reliability

WS-ReliableMessaging

• Apache Sandesha 2 ondersteund WS-RM 1.1 voor Axis2 Java en C++• http://ws.apache.org/sandesha/sandesha2/index.html• WSO2 bevat Sandesha2 en ondersteund daarmee ook WS-RM 1.1.

• Metro 3.0.1 (onderdeel van J2EE reference implementatie• "glassfish") ondersteund in ieder geval WS-RM 1.1.• https://metro.dev.java.net/

• Apache CXF ondersteund gezien de source alleen WS-RM 1.0.

• JBossWS vanaf versie 3.0.1: ondersteund 1.0 en 1.1.• https://jira.jboss.org/jira/browse/JBWS-515• http://jbossws.jboss.org/mediawiki/index.php?title=WS_Reliable_Messaging

• Microsoft .Net ondersteund WS-RM 1.1 vanaf versie 3.5, Windows Communication Framework

Infra 1

Infra 2tekenentoken, bericht

eindpunttransport,opslaan

ZIMGBZ 1 GBZ 2

app

opslagack

ack

app

WSRM patronen

• 1-way

• bidirectional

• anonymous

• veel berichten (atom. aanmelden)

• plaatjes

OntvangerZender

HL7v3 Antwoord

HL7v3 Query

HL7v3 Accept Acknowledgement

HL7v3 Bericht

HL7v3 BerichtResponse (Accept or Reject)

HL7v3 Bericht

1. Queries

2. Bericht zonder

antwoord

3. Bericht met

antwoord

ZIMGBZ 1

ack 1

HL7v3 bericht 1 + AckRequest

CreateSequenceResponse

CreateSequence

TerminateSequenceResponse

TerminateSequence

ZIMGBZ 1

ack 1..5

HL7v3 bericht 1

CreateSequenceResponse

CreateSequence

TerminateSequenceResponse

TerminateSequence

HL7v3 bericht 2

HL7v3 bericht 3

HL7v3 bericht 4

HL7v3 bericht 5 + AckRequest

ZIMGBZ 1

ack 2..5

HL7v3 bericht 1

CreateSequenceResponse

CreateSequence

TerminateSequenceResponse

TerminateSequence

HL7v3 bericht 2

HL7v3 bericht 3

HL7v3 bericht 4

HL7v3 bericht 5 + AckRequest

ack 1

HL7v3 bericht 1 + AckRequest

ZIMGBZ 1

ack a1..a4

HL7v3 bericht a1

CreateSequenceResponse

CreateSequence

TerminateSequenceResponse

TerminateSequence

HL7v3 bericht a2

HL7v3 bericht b1

HL7v3 bericht a3

HL7v3 bericht a4 + AckRequest

HL7v3 bericht b2 + ackRequest

ack b1..b2

ZIMGBZ 1

HTTP Response + HL7v3 Accept Ack

HTTP Request + HL7v3 bericht 1

ZIMGBZ 1

HTTP Response + ack 1

HTTP Request +HL7v3 bericht 1 +

AckRequest

CreateSequenceResponse

CreateSequence

TerminateSequenceResponse

TerminateSequence

ZIMGBZ 1

HTTP 200 OK

HTTP Request +HL7v3 bericht 1 +

AckRequest

CreateSequenceResponse

CreateSequence

TerminateSequenceResponse

TerminateSequence

HTTP 200 OK

HTTP Response +ack 1

Welke communicatiepatronen?

• anonymous one-way, one message, one ack

• anonymous one-way, many messages, many acks

• addressed one-way, many messages, one ack?

• bidirectional – (nog) niet?

• alles anonymous?

Business level Reliability

businessdocument

EnvelopeHeaders:

businessdocument

reliability

security

Payload:

Web Service Sender

reliability module

transaction module

security module

et cetera

messagin

g

businessdocument

Web Service Receiver

reliability module

transaction module

security module

et cetera

messagin

g

Sender Receiver

Duplicate Message

Message

Process Message

Acknowledgement

Scenario 1: Resending works

Sender Receiver

Duplicate Message

Acknowledgement

Message

Acknowledgement

Process Message

Process Message

Scenario 2: Resending fails

Sender Receiver

Duplicate Message

Acknowledgement

Message

Acknowledgement

Process Message

Discard Duplicate

Scenario 3: Reliable messaging

Sender’sTransportModule

Receiver’sTransportModule

OrderMessage

Transport Ack Submit Order

Sender’sBusinessModule

Place Order

Receiver’sBusinessModule

Accept OrderAcceptMessage

Transport AckSubmit Accept

GP’sTransportModule

PharmacistsTransportModule

GP’sConsultationApplication

Prescription

PharmacistsPrescriptionApplication

Ack prescription

prescription.id=x

Prescription

prescription.id=x

Prescription

prescription.id=x

Prescription

prescription.id=x

Prescription

prescription.id=xPrescription

prescription.id=x

Error

prescription.id=xalready exists

Error

prescription.id=xalready exists

Error

prescription.id=xalready exists

Recommended