Reference Architectures
To describe how interactions could work, a collection of reference architectures are described below. All contain at least two clinical systems;
Prescribing System, the creator of
MedicationRequest
resourcesDispensing System, the creator of
MedicationDispense
resources
Some reference architecture include a Message Broker system which is akin or could be part of a Shared Records platform. In some implementations, especially those within an acute trust, there may be an Integration Engine system/service sitting between the clinical systems and the Message Broker or Shared Record. Combinations of the architectures described below would also be feasible.
The first architectural decision will be to choose between a point-to-point messaging or a query shared records high level architecture.
Point-to-Point Messaging
These are the most simple architectures for interoperability between a single prescribing system and a single dispensing system.
- Simple architecture
- Suitable for a initial implementation or when only two systems need to be interoperable.
- Which system acts as the Provider and which acts as the Consumer?
Prescribing and Dispensing systems act as FHIR servers
(1) The prescribing system creates the MedicationRequest
with a valid externally referencable identifer
and POSTs to the dipensing system which adds the logical id
on receipt. The MedicationRequest
is triggered when the MedicationRequest.status
= active
.
(2) The dispensing system creates the MedicationDispense
with a valid externally referencable identifer
and POSTs to the prescribing system which adds the logical id
on receipt. The MedicationDispense
is triggered when the MedicationDispense.status
= completed
.
(3) On receipt, the prescribing system can set the MedicationRequest.status
= completed
.
Dispensing system acts as the FHIR server
(1) The prescribing system creates the MedicationRequest
with a valid externally referencable identifer
and POSTs to the dipensing system which adds the logical id
on receipt. The MedicationRequest
is triggered when the MedicationRequest.status
= active
.
(2) The prescribing system queries the dispending system via a GET using the unique identifer
from the MedicationRequest
, i.e. "get the dispensing record for this request". The dispensing system assigns the logical id
. The GET request may be sent at any time so the dispensing system may choose to expose MedicationDispense.status
values that represent both in-progress and end-states for the dispensing record.
(3) When the dispensing system returns a MedicationDispense.status
of completed
, the prescribing system can set the MedicationRequest.status
= completed
.
Prescribing system acts as the FHIR server
(1) The prescribing system sends an event notification to the pharmacy system when a new MedicationRequest
is ready for processing. The notification must include the external externally referencable identifer
. The prescirbing system assigns the logical id
.
(2) The prescribing system GETs the MedicationRequest using the identifer
. The GET request may be sent at any time so the pharmacy system may choose to expose MedicationRequest.status
values that represent both in-progress and end-states for the prescribing record.
(3) The dispensing system creates the MedicationDispense
with a valid externally referencable identifer
and POSTs to the prescribing system which adds the logical id
on receipt. The MedicationDispense
is triggered when the MedicationDispense.status
= completed
.
(4) On receipt, the prescribing system can set the MedicationRequest.status
= completed
.
- Does not scale for multiple provider and consumer systems with risk of bespoke interfaces.
Point-to-point messaging interoperability gets very complex when multiple provider and consumer systems are introduced. The number of point-to-point connections needed to integrate a given number of systems increases exponentially as additional systems are added.
To link up two ePMA system plus the hospital pharmacy system will require three point-to-point connections. By adding only two more systems, this changes to 10 connections. With N systems number of connections is N(N-1)/2. With 10 systems, that is 45 separate point-to-point implementations.
Add to that if each system wants subtly difference interfaces the complexity becomes unmanagable. Compare that to using a Shared Record, where the Shared Record sets the standard. All systems implement just one interface, to the Shared Record.