...
For å sende meldinger benyttes den åpne, internasjonale standarden AMQP som transportprotokoll. Norsk Helsenett (NHN) har etablert en Meldingsutveksler (MU) realisert med Microsoft Service Bus Tjenestebuss som er tilgjengelig for alle virksomheter tilknyttet Norsk Helsenett.
...
Application properties er utvidet med attributter fra SOAP:Header i ebXML for å sikre at meldingsutveksling foregår på riktig måte og støtter bruk av kommunikasjonsparametre.
AMQP-blokk | Required/ Optional | Felt | Innhold |
---|---|---|---|
Properties | R | messageId | Unik id på UUID-format. messageId identifiserer en AMQP melding unikt og er uavhengig av eventuell meldingsId for fagmeldingen som sendes. |
O
userId
Ikke angitt.
R | To | Id for kø-en meldingen skal sendes til (f.eks. _sync). Det skal oppgis full id slik den er registrert i Adresseregisteret. |
R | Subject | Angir meldingsinnhold med kodeverdi fra kodeverk 8279 «Meldingens funksjon»: se Volven |
R | replyTo | Id for kø-en returmelding skal sendes til (f.eks. _sync). Det skal oppgis full id slik den er registrert i Adresseregisteret. |
R | correlationId | Unik id for et sett av transaksjoner som hører sammen. ID på UUID-format. Attributtet benyttes for synkrone meldinger, for å knytte svarmelding til forespørsel. |
R | contentType | Settes til |
verdien: |
|
|
Kun signert innehold: «application/pkcs7- mime; smime-type=signed-data»
Signert og kryptert innehold: «application/pkcs7-mime; smimetype=signed-and-enveloped-data»
Usignert og ukryptert soap melding: «application/soap+xml»
O
contentEncoding
Ikke angitt.
| ||
O | absoluteExpiryTime | Ikke angitt per melding. Kø har default time to live på 10 dager |
O
groupId
Ikke angitt.
O
groupSequence
Ikke angitt
O
replyToGroupId
Ikke angitt.
creationTime
Ikke angitt
Application Properties |
R | cpaId | Id for CPA-avtale |
O
Service
Id til Service fra CPA. Attributt under innføring
Action
Id til Action fra CPA. Attributt under innføring
R | applicationTimeStamp | Tidsstempel for generering av AMQPmeldingen. Formatet skal være i henhold til ISO 8601 (CCYY-MM-ddThh:mm:ssTZD). Tidspunkt skal oppgis i UTC. Dersom lokal tid benyttes skal tidssone angis. Eksempel: 2014-02-26T12:45:32+02:00. |
R | fromHerId | HER-id for avsender |
O
fromRole
Rolle til avsender av melding, satt i henhold til rolle fra CPA. Attributt under innføring
R | toHerId | HER-id til mottaker |
O
toRole
Rolle til mottager av melding, satt i henhold til rolle fra CPA. Attributt under innføring
O
ConversationId
Unik identifikasjon for et sett meldinger som utgjør en konversasjon. Ikke i bruk på transportnivå for meldinger til Helsenorge, her brukes referanser i hodemeldingen.
R2
R2 | originalMessageId | Feltet skal inneholde messageId fra den meldingen som AMQP-transportfeilmeldingen gjelder for |
R2 | receiverTimeStamp | Tidsstempel for når mottaker prøvde å behandle den meldingen som feilet. |
R2 | errorCondition | Lesbar og maskinlesbar kode som beskriver feilårsak |
R2 | errorDescription | Lesbar tekst som beskriver feilårsaken |
Applicationdata
R
Applicationdata |
errorConditionData
Inneholder tilleggsdata i forbindelse med feilmelding. F.eks. i forbindelse med manglende påkrevde felter kan man gjengi manglende felter på en maskinlesbar måte.
Dersom ikke tilleggsdata finnes skal feltet ikke tas med.
R | Den krypterte fagmeldingen (tilsvarende «Payload» i ebMS) plasseres direkte i «Application Data» uten noen form for MIMEencoding/konvertering. Dvs. at en skriver/leser de krypterte dataene til/fra AMQP-meldingen på samme måte som om en skriver til/fra en fil (dataene er en byte-array, byte[]). |
AMQP Køoppsett
Køer administeres ved hjelp av funksjoner i Adresseregisteret, og de køer som settes opp der, blir da automatisk opprettet i Tjenestebussen. Behovene til den enkelte virksomhet og tjeneste, sammen med kravene i de aktuelle forretningsprosessene, bestemmer hvilke køer som trengs.
...
Det er etablert løsning for arving av køer fra virksomhet, for å redusere antall køer og forenkle drift og vedlikehold. Det er også mulig å sette opp en mal for nye tjenester, som gjør at disse automatisk får ønsket oppsett ved opprettelse.
Type køer og kønavn
Type kø | Kønavn | Kommentar |
---|---|---|
Async | [her-id]_async | Asynkrone meldinger sendes over denne |
Sync | [her-id]_sync | Synkrone forespørsler/meldinger sendes via denne køen |
SyncReply | [her-id]_syncreply | Når man besvarer en synkron melding besvares denne til en SyncReply-kø. Denne skal denne alltid plukkes fra ReplyTo og ikke hardkodes |
Error | [her-id]_error | Se utfyllende beskrivelse av error-køen i AMQP-spesifikasjonen |
Deadletter | [her-id |
Meldinger som deadletteres havner på denne køen. En melding deadletteres etter at den er forsøkt lest X antall ganger. X settes på brokeren-siden og er i dag satt til 10 forsøk.
Time to live for meldingskøer
Inntil desember 2021 var defaultverdi for time to live ikke satt, slik at meldinger aldri ble slettet fra køer. Dette førte til mang køer med gamle, uavhentede meldinger. Dette er problematisk for en køløsning og langtidslagring regnes som et anti-pattern ved bruk av meldingsutveksling.
Det er derfor innført en endring som gjør at meldinger eldre enn 10 dager slettes fysisk fra kø.
Alle meldinger eldre enn 4 dager skal anses som ikke levert, og innbygger får et varsel om manglende levert melding etter tre dager.
...
]_dl | Meldinger som deadletteres havner på denne køen. En melding deadletteres etter at den er forsøkt lest X antall ganger. X settes på brokeren-siden og er i dag satt til 10 forsøk. |
Error-kø
Error-køen er en del av køoppsettet som er beskrevet i AMQP-spesfikasjonen for Helsenorge.no.
...
For meldingsutveksling ved AMQP benyttes også kommunikasjonsparametre, der CPA angir hvilket sertifikat som er benyttet for kryptering og signering. Denne mekanismen vil håndtere sertifikatbytter på en smidig måte, uten behov for manuelle steg.
...
For synkronisering av klokker er det flere tilgjengelige tidsservere på internett og disse kan velges fritt. NHN tilbyr en tidstjener for applikasjoner på helsenett. Denne er vist i tabellen under.
Server | Beskrivelse |
---|---|
Standard tidsserver for Windows, krever tilgang til internett | |
Tidsserver tilgjengelig på Helsenett |
AMQP Feilhåndtering
Meldingsutveksling benytter følgende mekanismer for å ivareta leveringssikkerhet og at avsender får beskjed om feil som oppstår når mottaker henter ned en melding fra kø og prosesserer meldingen:
...
Stegene i prosessen er kortfattet beskrevet i tabellen under.
# | Steg | Beskrivelse |
---|---|---|
1 | Send fagmelding | Fagsystem oppretter melding, sendes til meldingstjener. |
2 | Send AMQP melding | Meldingstjener sender melding, legges på mottagers Async kø. |
3 | Les melding fra kø | Mottager meldingstjener leser melding fra kø |
4 | Valider AMQP melding | Melding valideres i henhold til beskrivelse lenger ned i “Validering av meldinger og håndterng av feil”. Dersom validering feiles skal melding sendes til avsenders Error kø |
5 | Send AMQP Error | Feil oppstått som følge av validering av AMQP melding og definert i “Validering av meldinger og håndterng av feil” skal sendes til AMQP Error kø. Andre interne feil eller andre feilkilder skal ikke føre til melding på Error kø. |
6 | Valider fagmelding | Fagmelding valideres i henhold til beskrivelse lenger ned i “Validering av meldinger og håndterng av feil”. |
7 | Persister i fagsystem | Dersom melding validerer OK, persisteres melding i fagsystem for videre behandling. |
8 | Send negativ apprec | Dersom fagmelding ikke valideres OK, sendes en negativ apprec til avsenders async kø |
9 | Commit lest melding | Melding commites fra kø når en av følgende er oppfylt:
Hvis melding forsøkes lest 10 ganger uten at den commites vil den legges på Dead letter kø. |
10 | Send positiv apprec | Positiv apprec til avsenders Async kø |
11 | Håndter Dead letter kø | Mottager må ha en prosess for å håndtere Dead letter kø. Alle meldinger som forsøkes lest 10 ganger uten å bli commited vil legges på Dead letter kø. Årsak til feil rettes og melding kan legges tilbake på async kø for prosessering. |
12 | Håndter Error kø | Prosess for å håndtere og rette opp meldinger som ikke validerer OK i henhold til spesifikasjon |
13 | Håndter Aprec | Prosess for å håndtere positive og negative Apprec. |
14 | Håndter manglende respons | Dersom avsender har skrevet melding til kø, men ikke fått feilmelding på error kø eller applikasjonskvittering må dette håndteres. Hvordan dette løses, er implementasjonsavhengig og kan variere fra virksomhet til virksomhet |
Prosess synkrone tjenester
...
Stegene i prosessen er kortfattet beskrevet i tabellen under.
# | Steg | Beskrivelse |
---|---|---|
1 | Send melding | Avsender sender melding, legges på mottagers Async kø |
2 | Les melding fra kø | Mottager leser melding fra kø |
3 | Valider AMQP melding | Melding valideres i henhold til beskrivelse lenger ned i “Validering av meldinger og håndterng av feil”. Dersom validering feiles skal melding sendes til avsenders Error kø. |
4 | Send AMQP Error | Error Feil oppstått som følge av validering av AMQP melding og definert lenger ned i “Validering av meldinger og håndterng av feil” skal sendes til AMQP Error kø. Andre interne feil eller andre feilkilder skal ikke føre til melding på Error kø. |
5 | Valider fagmelding | Fagmelding valideres i henhold til beskrivelse lenger ned i “Validering av meldinger og håndterng av feil” |
6 | Fagsystem behandler melding | Dersom melding validerer OK behandles forespørsel og svarmelding opprettes. |
7 | Commit melding | Melding commites fra kø når en av følgende er oppfylt:
Hvis melding forsøkes lest 10 ganger uten at den commites vil den leggges på Dead letter kø. For synkrone meldinger er time to live 15 sekunder, så Dead letter kø vil i praksis ikke benyttes. |
8 | Send svarmelding | Svarmelding sendes til avsender av melding. Svar inneholder enten svar på forespørsel eller en feilkode dersom melding ikke kunne tolkes eller håndteres. |
9 | Håndter Error kø | Prosess for å håndtere og rette opp meldinger som ikke validerer OK i henhold til spesifikasjon |
10 | Håndter svarmelding | Prosess for å håndtere svarmeldinger. |
Validering av meldinger og håndtering av feil
Både AMQP-meldingen og fagmeldingen skal valideres av avsender før den sendes, og av mottaker før den prosesseres. Avsnittet beskriver minstekravene for validering av en melding og hvordan feil i validering skal håndteres.
Type | Validering | Håndtering av feil |
---|---|---|
AMQP melding | Verifisere verdiene for påkrevde felter. For å sikre at AMQP-meldinger inneholder påkrevde felter og verdier må det programmatisk gjøres en validering | AMQP-melding på Error-kø med errorCondition «transport:invalid-fieldvalue» |
Kommunikasjonsprosessen er støttet, hentes fra CPA. | AMQP-melding på Error-kø med errorCondition «transport:unsupportedmessage» | |
Dekryptering feiler | AMQP-melding på Error-kø med errorCondtion «transport:decryptionfailed» | |
Avsenders sertifikat er utgått | AMQP-melding på Error-kø med errorCondition «transport:expiredcertificate» | |
Avsenders sertifikat er tilbaketrukket | AMQP-melding på Error-kø med errorCondition «transport:revokedcerificate» | |
Avsenders signatur kan ikke verifiseres | AMQP-melding på Error-kø med errorCondition «transport:invalidsignature» | |
Duplikat AMQP MessageID. AMQP melding har blitt sendt tidligere. | Melding logges av mottager, ingen respons på error kø og ingen apprec. Opprinnelig sendt melding forventes å gi apprec og meldingen skal ikke behandles en gang til av fagsystem. | |
Fagmelding header validerer ikke eller kan ikke tolkes. | AMQP-melding på Error-kø med errorCondition "transport:not-well-formedxml" | |
Replyto kø fins ikke | AMQP-melding på avsenders Error-kø med errorCondition «transport:invalidfield-value» | |
Ikke samsvar AMQP Avsender HER-Id <- > fagmelding Avsender HER-Id | AMQP-melding på Error-kø med errorCondition «abuse:spoofing-attack» | |
Fagmelding | Ikke samsvar AMQP mottager HER-Id <-> fagmelding mottager HER-Id | Negativ AppRec med kode «E10 Ugyldig meldingsidentifikator» fra kodeverk 8221. |
Mottatt XML kan ikke tolkes | Negativ AppRec med kode «T01 – Ikke XML / ikke 'well formed' / uleselig» fra kodeverk 8221. Krever at header i melding validerer og kan tolkes | |
XSD-validering | Negativ AppRec med kode «T02 – XML validerer ikke» fra kodeverk 8221. Krever at header i melding validerer. | |
Validering av verdier for påkrevde felter feiler | Negativ Applikasjonskvittering med kode «T02 – XML validerer ikke» fra kodeverk 8221 |
Feilsituasjoner og håndtering av disse
Tabellen under viser noen mulige feilkilder og beskrivelse av hvordan de skal håndteres
Feilsituasjon | Håndtering av feilsituasjon |
---|---|
Avsender mottar negativ AppRec | Avsender må manuelt følge opp mottatte feilkoder i AppRec og genere ny (feilfri) fagmelding og sende den. Resending av samme fagmelding skal ikke skje da dette forventes å føre til ny negativ AppRec. |
Mottaker får ikke sendt AppRec i forbindelse med feil i sentral infrastruktur | Mottakers system sender automatisk AppRec på nytt etter et egendefinert tidsrom, eller gjør brukeren oppmerksom på feilsituasjonen med sentral infrastruktur slik at brukeren kan forsøke å generere/sende meldingen på nytt. |
Avsender får ikke sendt melding i forbindelse med feil i sentral infrastruktur | Avsender sender melding på nytt automatisk etter et egendefinert tidsrom eller gjør brukeren oppmerksom på feilsituasjonen med sentral kø slik at brukeren kan forsøke å generere/sende meldingen på nytt. |
Mottaker mottar samme fagmelding to ganger | Forkaste duplikat meldingen og sørge for at AppRec sendes kun én gang for forespørselen med tilsvarende fagmelding sin MsgId. En duplikat melding er en melding med samme verdi i MsgHead/MsgInfo/MsgId som en tidligere mottatt melding. |
Avsender av fagmelding mottar ikke AppRec innen forventet tid | Forventet tid for mottak av apprec vil variere avhengig av bruken og hvilke aktører meldingen utveksles med. Helsenorge.no kan forventes å sende applikasjonskvittering innen et fåtall timer og normalt innen et fåtall minutter. Avsender bør manuelt sjekke at melding er ok og kan sende melding på nytt. Ikke mottatt AppRec kan være feil hos mottaker og bør følges opp med mottaker for verifisering. Identisk fagmelding bør ikke resendes mer enn én gang. NHN har sporbarhet på meldinger og overvåkning av køer og meldinger. Helsenorge vil sende et varsel til innbygger om manglende kvittering etter et definert tidsrom. Denne funksjonen er nærmere beskrevet her: Varsel til innbygger ved manglende applikasjonskvittering |
Resending og id-er
Følgende retningslinjer gjelder for resending av meldinger og bruk av messageId på AMQP-nivå og MsgID fagmeldingen:
Situasjon | amqp:messageId | MsgHead/MsgInfo/MsgID |
---|---|---|
Systemet resender meldingen på nytt etter å ha mottatt en feil på AMQP Error-kø og rettet feil. | Ny | OriginalId |
Systemet resender en melding etter å ha mottatt negativ AppRec og rettet feil. | Ny | Ny |
Systemet resender en melding pga. at man ikke fikk lagt meldingen på køen (og derfor aldri har blitt behandlet av mottaker) | OriginalId | OriginalId |
ebXML rammeverket beskriver resending av melding på grunn av manglende AppRec innen 96 timer. For synkrone meldinger benyttes ikke Apprec, men en svarmelding sendes med en gang. For asynkrone meldinger er heller ikke resending benyttet på AMQP av følgende årsaker:
...
Ved feilrapportering skal AMQP-felter settes slik beskrevet i tabellen under:
Application Property | Beskrivelse |
---|---|
amqp:messageId | Ny unik verdi |
originalMessageId | Settes til opprinnelige amqp:messageId |
receiverTimeStamp | Tidspunkt da meldingen ble forsøkt behandlet av mottaker |
errorCondition | Lesbar og maskinlesbar kode som beskriver feilårsak. Se tabell under for detaljering. |
errorDescription | Lesbar tekst som beskriver feilårsaken. Se tabell under for detaljering. |
errorConditionData | Inneholder tilleggsdata i forbindelse med feilmelding. F.eks. i forbindelse med manglende påkrevde felter kan man gjengi manglende felter på en maskinlesbar måte. |
Feilkoder og beskrivelser av disse er definert i tabellen under:
errorCondition | errorDescription | errorConditionData |
---|---|---|
transport:invalid-cmspkcs | Could not decrypt message because of invalid format to CMS/PKCS. | |
transport:invalidcertificate | Could not decrypt message because of unknown/incorrect certificate | { "thumbprint" : { "expected": "streng", "actual": "streng" } Thumbprint til sertifikater, for å lette feilsøking |
transport:expiredcertificate | Could not decrypt message because of certificate expired. | Thumbprint til sertifikat, for å lette feilsøking |
transport:revokedcertificate | Could not decrypt message because of certificate added to CRL (Certificate Revocation List). | Thumbprint til sertifikat, for å lette feilsøking |
transport:decryptionfailed | Could not decrypt message because of unknown reason. | Thumbprint til sertifikat, for å lette feilsøking |
transport:invalidsignature | Digital signature could not be verified. | Thumbprint til sertifikat, for å lette feilsøking |
transport:requiredfield-missing | Missing or invalid value in field: 'AnyField'. | Array med navn på felter som mangler |
transport:invalid-fieldvalue | Invalid value in field: 'AnyField'. | Array med navn på felter hvor verdier mangler eller ikke er satt riktig |
transport:invalidencoding | Error occurred during decoding message. Expecting message encoded as ‘Unicode’. | En streng med IANA/MIME-navnet på encoding forventet http://www.iana.org/assignments/charactersets/character-sets.xhtml |
abuse:spoofing-attack | Possible spoofing attack detected. | Array med to elementer { amqp:[herId], application:[herId] } |
transport:xml-notinterpretable | XML cannot be interpreted |
PKI-sjekkliste
Nedenfor er det vist sjekklister som kan brukes for PKI- og sertifikathåndtering ved sending og mottak for synkrone og asynkrone tjenester.
...