Upload
marc-de-graauw
View
485
Download
0
Embed Size (px)
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