Reliable messaging

  • Published on
    03-Jul-2015

  • View
    485

  • Download
    0

Embed Size (px)

Transcript

  • 1. Reliable Messaging
    Marc de Graauw

2. 3. 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
4. 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
5. 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
6. 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
HTTPPOST
b.v. 100 aandelen kopen
7. Zender
Ontvanger
Bericht
8. Zender
Ontvanger
Bericht
Verwerk bericht
Kopie van bericht
Ontvangstbevestiging
9. Zender
Ontvanger
Verwerk bericht
Bericht
Ontvangstbevestiging
Niet verwerken
Kopie van bericht
Ontvangstbevestiging
10. Betrouwbare aflevering
Gegarandeerde aflevering
berichtnummers
ontvangstbevestiging
eventueel duplicaat zenden
Eenmalige aflevering
duplicaatdetectie
duplicaatverwijdering
Volgordelijke aflevering
oplopende berichtnummering
11. 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.
12. Transport Level Reliability
13. 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
14. 15. WS-ReliableMessaging
CreateSequence
CreateSequenceResponse
Sequence
Sequence + AckRequested
SequenceAcknowledgement
TerminateSequence
TerminateSequenceResponse
16. Infra 1
17. Infra 2
tekenen
token, bericht
eindpunt
transport,
opslaan
18. ZIM
GBZ 1
GBZ 2
app
opslag
ack
ack
app
19. WSRM patronen
1-way
bidirectional
anonymous
veel berichten (atom. aanmelden)
plaatjes
20. Ontvanger
Zender
HL7v3 Query
1. Queries
HL7v3 Antwoord
2. Bericht
zonder
antwoord
HL7v3 Bericht
HL7v3 Accept Acknowledgement
HL7v3 Bericht
3. Bericht
met
antwoord
HL7v3 BerichtResponse (Accept or Reject)
21. ZIM
GBZ 1
CreateSequence
CreateSequenceResponse
HL7v3 bericht 1 + AckRequest
ack 1
TerminateSequence
TerminateSequenceResponse
22. ZIM
GBZ 1
CreateSequence
CreateSequenceResponse
HL7v3 bericht 1
HL7v3 bericht 2
HL7v3 bericht 3
HL7v3 bericht 4
HL7v3 bericht 5 + AckRequest
ack 1..5
TerminateSequence
TerminateSequenceResponse
23. ZIM
GBZ 1
CreateSequence
CreateSequenceResponse
HL7v3 bericht 1
HL7v3 bericht 2
HL7v3 bericht 3
HL7v3 bericht 4
HL7v3 bericht 5 + AckRequest
ack 2..5
HL7v3 bericht 1 + AckRequest
ack 1
TerminateSequence
TerminateSequenceResponse
24. ZIM
GBZ 1
CreateSequence
CreateSequenceResponse
HL7v3 bericht a1
HL7v3 bericht a2
HL7v3 bericht b1
HL7v3 bericht a3
HL7v3 bericht a4 + AckRequest
HL7v3 bericht b2 + ackRequest
ack a1..a4
ack b1..b2
TerminateSequence
TerminateSequenceResponse
25. ZIM
GBZ 1
HTTP Request + HL7v3 bericht 1
HTTP Response + HL7v3 Accept Ack
26. ZIM
GBZ 1
CreateSequence
CreateSequenceResponse
HTTP Request +
HL7v3 bericht 1 +
AckRequest
HTTP Response + ack 1
TerminateSequence
TerminateSequenceResponse
27. ZIM
GBZ 1
CreateSequence
CreateSequenceResponse
HTTP Request +
HL7v3 bericht 1 +
AckRequest
HTTP 200 OK
HTTP Response +
ack 1
HTTP 200 OK
TerminateSequence
TerminateSequenceResponse
28. 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?
29. Business level Reliability
30. business
document
business
document
Envelope
Headers:
Web Service Sender
Web Service Receiver
reliability
reliability module
messaging
reliability module
messaging
security
security module
security module
Payload:
transaction module
transaction module
business
document
et cetera
et cetera
31. Scenario 1: Resending works
Sender
Receiver
Message
Duplicate Message
Process Message
Acknowledgement
32. Scenario 2: Resending fails
Sender
Receiver
Message
Process Message
Acknowledgement
Duplicate Message
Process Message
Acknowledgement
33. Scenario 3: Reliable messaging
Sender
Receiver
Message
Process Message
Acknowledgement
Duplicate Message
Discard Duplicate
Acknowledgement
34. Senders
Transport
Module
Receivers
Transport
Module
Senders
Business
Module
Receivers
Business
Module
Place Order
Order
Message
Transport Ack
Submit
Order
Accept Order
Accept
Message
Transport Ack
Submit
Accept
35. GPs
Transport
Module
Pharmacists
Transport
Module
GPs
Consultation
Application
Pharmacists
Prescription
Application
Prescription
Prescription
Prescription
prescription.id=x
prescription.id=x
prescription.id=x
Ack prescription
Prescription
Prescription
prescription.id=x
Prescription
prescription.id=x
prescription.id=x
Error
Error
Error
prescription.id=x
already exists
prescription.id=x
already exists
prescription.id=x
already exists