440 likes | 617 Views
Implementing Web Services for Healthcare . Lessons & Pitfalls - Marc de Graauw -. NICTIZ & Dutch Healthcare. Standardization authority for data exchange in Dutch healthcare Short term goal: national exchange of medication data operational in 2006
E N D
Implementing Web Services for Healthcare Lessons & Pitfalls - Marc de Graauw -
NICTIZ & Dutch Healthcare • Standardization authority for data exchange in Dutch healthcare • Short term goal: national exchange of medication data operational in 2006 • 90.000 people are hospitalized yearly due to wrong medication • "The question is not whether the electronic medical file will become obligatory, but how" – Min. Hoogervorst
NICTIZ & Dutch Healthcare • Communication between: • Healthcare Provider (GP, hospital etc.) • Healthcare Information Broker (HIB) • HIB provides: • index of which parties have patient data • no patient data itself • messaging services • aggregation services • Health Level Seven version 3 (HL7v3)
Healthcare Information System Healthcare Information Broker Healthcare Information System Messa- ging Services Healthcare Information System Healthcare Information System Patient Registry Healthcare Information System
Just enough HL7 • HL7 version 2 : currently used • HL7v3: • XML based • Reference Information Model • HL7v3 Message contains: • medical payload • Trigger Event Wrappers (Query Control etc.) • Transmission Wrapper • Example: QURX_EX990001NL-1.xml
HL7v3 Layered Model HTTP, SSL SOAP / XML HL7 Transmission Wrapper HL7 Query Control Wrapper HL7 Medical Data TCP lower protocol layers
Transmission Wrapper • Addressing information (Sender, Receiver) • MessageId (unique id / message) • duplicate detection is requirement • Accept Acknowledgement Code • request accept acknowledgement (Never / Always, Error, Succes) • is syntactical – not semantic – acceptance • more... • Contains other wrappers • Transmission Wrapper intersects web services stack
Which standards? • The basics were pretty clear: • HL7v3 • XML 1.0 & Namespaces • XML Schema • SOAP 1.1 (not a real standard!) • In 2003 when work started: • SOAP 1.2 not finished • WSDL 1.1 finished, 2.0 not • WS-stack not finished (Reliability, Security etc.) • ebXML Messaging (ebMS)
SOAP in one slide • Envelope, Headers, Body <soap:Envelope ... namespaces ... > <soap:Header mustUnderstand = ‘1’> ... headers ... </soap:Header> <soap:Body> ... payload ... </soap:Body> </soap:Envelope> • HTTP Binding POST / HTTP/1.1 bla bla... SOAPAction: "urn:hl7-org:v3/QURX_AR990120NL“ <?xml version="1.0" encoding="utf-8"?> <soap:Envelope ... namespaces ... > • SOAP Encoding: legacy, forget it
Which standards?(cont.) • Security? No. • we use HTTPS • intermediaries (HIB) are trusted • this is secure • later: WS-Security, XML Signature, XML Encryption • Addressing? No. • HL7v3 provides own addressing scheme • Description? Maybe. • HL7v3 has own interaction modelling methodology
Which standards? • Reliability? Yes. • transport over HTTP is not reliable • The options? • ebMS 2.0 • no IBM, Microsoft adoption • WS-Reliability (Sun, Oracle et. al.) • not finished • WS-ReliableMessaging (IBM< Microsoft et. al.) • not finished, (was?) proprietary • HL7v3 Accept Acks • Confused?
Sender Receiver Message
Sender Receiver Message Copy of Message Receipt Ack
Sender Receiver Message Receipt Ack Copy of Message Receipt Ack Does duplicate detection
Which standards? (cont.) • Basics were clear (XML, XSD, SOAP) • WSDL added (well standardized & used) • No need for discovery / repository specs • Future of some WS standards uncertain • Adopt as few standards as possible • No lock-in to wrong (= losing) ‘standard’ • Facilitate later adoption • SOAP Headers make transition easier
Lessons & Pitfalls • Lesson 1: Do not adopt standards too soon!
‘Real world’ complexity • HL7v3 XML Schema <include> stacks of 10 – 15 schemas • HL7v3 typing system (mapped onto XSD datatypes) • HL7v3 vocabulary • Layered ‘wrapper’ approach • SOAP (Transmission (Query (Medical Data)))
WSDL in one slide • WSDL defines a web service • Which schemas are used? • Which messages are used & which schemas are involved? • Which operations are used & which messages go in and which go out? • How do operations assemble to make a web service (PortType, Service)? • Binding to SOAP and HTTP
Medication Query Service Medication Query PortType Query Schema QueryResponse Operation Binding Query Message Response Message Response Schema Other Operation Other PortType Other PortType
‘Real world’ complexity (cont.) • WSDL is a: • description of a web service • generate WSDL from code? • generate code from WSDL? • WSDL code generation • map XML to programming object • <birthdate>19610306</birthdate> • maps to: date • <name><first>Marc</first><last>de Graauw</last></name> • maps to: struct of string, string • <gender>M</gender> • maps to: char(1) or: enum(‘M’, ‘F’) or: GenderType • map operations, HTTP Binding et cetera
‘Real world’ complexity (cont.) • WSDL code generation: • reserved word clashes • creates object for each XML construct • 15 schemas -> Gargantuan objects! • all of vocabulary.xsd • all objects in one module • Code generation: fine for • float FahrenheitToCelsius(float) • currency StockQuote(string)
Lessons & Pitfalls • Lesson 1: Do not adopt standards too soon • Lesson 2: Do not count on code generation
Dynamic response types • WSDL: operation with defined message types with defined Schemas • HL7v3 has attributes where content co-determines response Schema
Dynamic response • HLv3 responseModalityCode = “R” Some HL7v3 Query Schema Some HL7v3 PortType Some HL7v3 Query Binding Some HL7v3 Query HL7v3 Query Response HL7v3 Query Response Schema
Dynamic response (cont.) • HLv3 responseModalityCode = “B” Some HL7v3 Query Schema Some HL7v3 PortType Some HL7v3 Query Binding Some HL7v3 Query HL7v3 Response Batch HL7v3 Batch Response Schema
Dynamic response (cont.) • More HL7v3 attributes (=XML elements) • acceptAckCode • responsePriority • continuationQuantity • content co-determines response Schema • Solutions: • multiple PortTypes = clutter, bad design • <choice> in Schema = undescriptive, hard to read
Lessons & Pitfalls • Lesson 1: Do not adopt standards too soon • Lesson 2: Do not count on code generation • Pitfall 1: Dynamic response types
Generic vs. specific WSDL • Specific WSDL: HL7v3 Medication Query Schema HL7v3 Medication PortType HL7v3 Medication QueryResponse Operation Binding HL7v3 Medication Query HL7v3 Medication Response HL7v3 Medication Response Schema
Generic vs. specific WSDL • Generic WSDL: HL7v3 Message Schema HL7v3 Message PortType HL7v3 Message Operation Binding HL7v3 MessageOut HL7v3 MessageIn HL7v3 Message Schema
Generic vs. specific WSDL • Generic WSDL uses generic Schemas • Possibly with Transmission Wrapper <xs:schema targetNamespace="urn:hl7-org:v3"> <xs:element name="hl7Message"> <xs:complexType> <xs:sequence> <xs:any/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
HL7 Medical Application HL7v3 medical content HL7 Control Query Processing Application HL7v3 CQ Wrapper & payload HL7 Transmission Wrapper Adapter HL7v3 messages HL7 web services Messaging Adapter SOAP messages HTTP Client / Server
Generic WSDL • Pro: • eases separation of layers • no problems with dynamic response • code generation is useful again • Con: • does not describe actual web service neatly
Lessons & Pitfalls • Lesson 1: Do not adopt standards too soon • Lesson 2: Do not count on code generation • Pitfall 1: Dynamic response types • Lesson 3: Consider generic WSDL
Reliability Issues • We chose HL7v3 Accept Acks • unclarity in standards situation • 2003/4: standards not finished • SOAP allows extension • but: commit / accept blur!
Reliability Issues • Delegated to HTTP 200 OK HL7v3 Medication Query Schema HL7v3 Medication PortType HL7v3 Medication QueryResponse Operation Binding HL7v3 Medication Query HL7v3 Medication Response HL7v3 Medication Response Schema
Reliability Issues • Using Accept Acknowledgements HL7v3 Medication PortType HL7v3 Medication Query Operation Binding HL7v3 Medication Query HL7v3 Accept Ack HL7v3 Medication Response Operation Binding HL7v3 Med. Response HL7v3 Accept Ack
Reliability Issues • Delegate to HTTP 200 OK • only for idempotent messages • synchronous • one side only needs SOAP client • single HTTP request – response pair • Accept Acks • works for all messages • asynchronous • both sides need SOAP server • two HTTP request – response pairs
Lessons & Pitfalls • Lesson 1: Do not adopt standards too soon • Lesson 2: Do not count on code generation • Pitfall 1: Dynamic response types • Lesson 3: Consider generic WSDL • Lesson 4: Carefully design Bindings
Wire signatures • We chose to follow WS-I Basic Profile • sensible set of guidelines • not an additional standard • refinement of SOAP 1.1 / WSDL 1.0 • R2710: operations MUST result in wire signatures that are different • R2710: wire signature = name of the child element of the soap:Body
Wire signatures • Continuation: continuationQuantity > 0 • Cancel: continuationQuantity = 0 HL7v3 Medication PortType HL7v3 Medication QueryContinuation Operation Binding HL7v3 QueryContinuation HL7v3 Med. Response HL7v3 Medication QueryCancel Operation Binding HL7v3 QueryCancel HL7v3 Accept Ack
Lessons & Pitfalls • Lesson 1: Do not adopt standards too soon • Lesson 2: Do not count on code generation • Pitfall: Dynamic response types • Lesson 3: Consider generic WSDL • Lesson 4: Carefully design Bindings • Pitfall: R2710 & wire signatures
The ebMS story • ebMS • used in NHS (British Healthcare) • Dutch Criminal Justice Chain • Dutch Social Security Chain (BKWI) • NICTIZ reconsidered • did not adopt ebMS now: stability of specs • Lesson 1: Do not adopt standards too soon
Marc de Graauw • Independent Consultant • ... and I like it! • not available till sometime in summer • www.marcdegraauw.com • marc@marcdegraauw.com • Feedback welcome! • QUESTIONS .... ???