Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Reliable messaging

715 views

Published on

  • Be the first to comment

  • Be the first to like this

Reliable messaging

  1. 1. Reliable Messaging<br />Marc de Graauw<br />
  2. 2.
  3. 3. Betrouwbaar transport<br />Netwerk is niet betrouwbaar<br />Het is niet te garanderen dat twee partijen beide 100% zeker weten dat communicatie geslaagd is<br />Het is wel te garanderen dat als de communicatie niet geslaagd is, tenminste een partij dat weet<br />Aanname: vroeg of laat is het netwerk weer beschikbaar<br />
  4. 4. Eisen betrouwbaar transport<br />Ieder bericht wordt minimaal een keer afgeleverd<br />Ieder bericht wordt maximaal een keer afgeleverd<br />Berichten worden afgeleverd in de volgorde waarin ze verzonden zijn<br />Afgeleverde berichten worden bewaard<br />
  5. 5. Het Issue<br />Transport over HTTP is niet betrouwbaar<br />Geen antwoord op een bericht:<br />door timeout, netwerk down, server down<br />niet zeker of het bericht al dan niet aangekomen en/of verwerkt is<br />
  6. 6. HTTP Methods (RFC 2616)<br />safe <br />heeft geen neveneffecten op de server<br />HTTP: GET<br />b.v.: opvragen informatie<br />idempotent<br />laat server in zelfde staat na herhaling <br />HTTP DELETE, PUT<br />b.v. verwijderen record<br />niet-idempotent<br />wijzigt server<br />HTTP POST<br />b.v. 100 aandelen kopen<br />
  7. 7. Zender<br />Ontvanger<br />Bericht<br />
  8. 8. Zender<br />Ontvanger<br />Bericht<br />Verwerk bericht<br />Kopie van bericht<br />Ontvangstbevestiging<br />
  9. 9. Zender<br />Ontvanger<br />Verwerk bericht<br />Bericht<br />Ontvangstbevestiging<br />Niet verwerken<br />Kopie van bericht<br />Ontvangstbevestiging<br />
  10. 10. Betrouwbare aflevering<br />Gegarandeerde aflevering<br />berichtnummers<br />ontvangstbevestiging<br />eventueel duplicaat zenden<br />Eenmalige aflevering<br />duplicaatdetectie<br />duplicaatverwijdering<br />Volgordelijke aflevering<br />oplopende berichtnummering<br />
  11. 11. Eisen aan betrouwbaar transport<br />Eis 1: duplicaatdetectie is nodig voor niet-idempotente acties<br />Eis 2: ontvangstbevestigingen zijn nodig bij niet-directe acties<br />Ontwerprichtlijn: Geef bij iedere interactie aan of deze veilig en/of idempotent is<br />Ontwerprichtlijn: Ieder bericht waarop niet direct een (ander) antwoord komt, krijgt een ontvangstbevestiging<br />Ontwerprichtlijn: Idempotente berichten waarop het verwachte antwoord niet komt, worden herhaald met een nieuw bericht-id. Geen duplicaat dus, maar een nieuw bericht<br />Ontwerprichtlijn: De ontvanger hoeft voor idempotente berichten geen status (bericht-id en verzonden antwoord) te bewaren<br />Ontwerprichtlijn: Niet-idempotente berichten waarop het verwachte antwoord niet komt, worden herhaald met een duplicaat.<br />
  12. 12. Transport Level Reliability<br />
  13. 13. WS-ReliableMessaging<br />Apache Sandesha 2 ondersteund WS-RM 1.1 voor Axis2 Java en C++<br />http://ws.apache.org/sandesha/sandesha2/index.html<br />WSO2 bevat Sandesha2 en ondersteund daarmee ook WS-RM 1.1.<br />Metro 3.0.1 (onderdeel van J2EE reference implementatie<br />"glassfish") ondersteund in ieder geval WS-RM 1.1.<br />https://metro.dev.java.net/<br />Apache CXF ondersteund gezien de source alleen WS-RM 1.0.<br />JBossWS vanaf versie 3.0.1: ondersteund 1.0 en 1.1.<br />https://jira.jboss.org/jira/browse/JBWS-515<br />http://jbossws.jboss.org/mediawiki/index.php?title=WS_Reliable_Messaging<br />Microsoft .Net ondersteund WS-RM 1.1 vanaf versie 3.5, Windows Communication Framework<br />
  14. 14.
  15. 15. WS-ReliableMessaging<br />CreateSequence<br />CreateSequenceResponse<br />Sequence<br />Sequence + AckRequested<br />SequenceAcknowledgement<br />TerminateSequence<br />TerminateSequenceResponse<br />
  16. 16. Infra 1<br />
  17. 17. Infra 2<br />tekenen<br />token, bericht<br />eindpunt<br />transport,<br />opslaan<br />
  18. 18. ZIM<br />GBZ 1<br />GBZ 2<br />app<br />opslag<br />ack<br />ack<br />app<br />
  19. 19. WSRM patronen<br />1-way<br />bidirectional<br />anonymous<br />veel berichten (atom. aanmelden)<br />plaatjes<br />
  20. 20. Ontvanger<br />Zender<br />HL7v3 Query<br />1. Queries<br />HL7v3 Antwoord<br />2. Bericht <br />zonder<br />antwoord<br />HL7v3 Bericht<br />HL7v3 Accept Acknowledgement<br />HL7v3 Bericht <br />3. Bericht <br />met<br />antwoord<br />HL7v3 BerichtResponse (Accept or Reject)<br />
  21. 21. ZIM<br />GBZ 1<br />CreateSequence<br />CreateSequenceResponse<br />HL7v3 bericht 1 + AckRequest<br />ack 1<br />TerminateSequence<br />TerminateSequenceResponse<br />
  22. 22. ZIM<br />GBZ 1<br />CreateSequence<br />CreateSequenceResponse<br />HL7v3 bericht 1<br />HL7v3 bericht 2<br />HL7v3 bericht 3<br />HL7v3 bericht 4<br />HL7v3 bericht 5 + AckRequest<br />ack 1..5<br />TerminateSequence<br />TerminateSequenceResponse<br />
  23. 23. ZIM<br />GBZ 1<br />CreateSequence<br />CreateSequenceResponse<br />HL7v3 bericht 1<br />HL7v3 bericht 2<br />HL7v3 bericht 3<br />HL7v3 bericht 4<br />HL7v3 bericht 5 + AckRequest<br />ack 2..5<br />HL7v3 bericht 1 + AckRequest<br />ack 1<br />TerminateSequence<br />TerminateSequenceResponse<br />
  24. 24. ZIM<br />GBZ 1<br />CreateSequence<br />CreateSequenceResponse<br />HL7v3 bericht a1<br />HL7v3 bericht a2<br />HL7v3 bericht b1<br />HL7v3 bericht a3<br />HL7v3 bericht a4 + AckRequest<br />HL7v3 bericht b2 + ackRequest<br />ack a1..a4<br />ack b1..b2<br />TerminateSequence<br />TerminateSequenceResponse<br />
  25. 25. ZIM<br />GBZ 1<br />HTTP Request + HL7v3 bericht 1 <br />HTTP Response + HL7v3 Accept Ack<br />
  26. 26. ZIM<br />GBZ 1<br />CreateSequence<br />CreateSequenceResponse<br />HTTP Request +<br />HL7v3 bericht 1 + <br />AckRequest<br />HTTP Response + ack 1<br />TerminateSequence<br />TerminateSequenceResponse<br />
  27. 27. ZIM<br />GBZ 1<br />CreateSequence<br />CreateSequenceResponse<br />HTTP Request +<br />HL7v3 bericht 1 + <br />AckRequest<br />HTTP 200 OK<br />HTTP Response +<br />ack 1<br />HTTP 200 OK<br />TerminateSequence<br />TerminateSequenceResponse<br />
  28. 28. Welke communicatiepatronen?<br />anonymous one-way, one message, one ack<br />anonymous one-way, many messages, many acks<br />addressed one-way, many messages, one ack?<br />bidirectional – (nog) niet?<br />alles anonymous?<br />
  29. 29. Business level Reliability<br />
  30. 30. business<br />document<br />business<br />document<br />Envelope<br />Headers:<br />Web Service Sender<br />Web Service Receiver<br />reliability<br />reliability module<br />messaging<br />reliability module<br />messaging<br />security<br />security module<br />security module<br />Payload:<br />transaction module<br />transaction module<br />business<br />document<br />et cetera<br />et cetera<br />
  31. 31. Scenario 1: Resending works<br />Sender<br />Receiver<br />Message<br />Duplicate Message<br />Process Message<br />Acknowledgement<br />
  32. 32. Scenario 2: Resending fails<br />Sender<br />Receiver<br />Message<br />Process Message<br />Acknowledgement<br />Duplicate Message<br />Process Message<br />Acknowledgement<br />
  33. 33. Scenario 3: Reliable messaging<br />Sender<br />Receiver<br />Message<br />Process Message<br />Acknowledgement<br />Duplicate Message<br />Discard Duplicate<br />Acknowledgement<br />
  34. 34. Sender’s<br />Transport<br />Module<br />Receiver’s<br />Transport<br />Module<br />Sender’s<br />Business<br />Module<br />Receiver’s<br />Business<br />Module<br />Place Order<br />Order<br />Message<br />Transport Ack<br />Submit <br />Order<br />Accept Order<br />Accept<br />Message<br />Transport Ack<br />Submit <br />Accept<br />
  35. 35. GP’s<br />Transport<br />Module<br />Pharmacists<br />Transport<br />Module<br />GP’s<br />Consultation<br />Application<br />Pharmacists<br />Prescription<br />Application<br />Prescription<br />Prescription<br />Prescription<br />prescription.id=x<br />prescription.id=x<br />prescription.id=x<br />Ack prescription<br />Prescription<br />Prescription<br />prescription.id=x<br />Prescription<br />prescription.id=x<br />prescription.id=x<br />Error<br />Error<br />Error<br />prescription.id=x<br />already exists<br />prescription.id=x<br />already exists<br />prescription.id=x<br />already exists<br />

×