I forbindelse med office 365-integrasjon for UiA arbeides det med bruk av message broker for å formidle meldinger. Modellen vil være:
Changelog events → melding til egen broker ← melding hentes av UiA
Egen broker kan f.eks. være en RabbitMQ-server. Denne tilgjengeligjør meldinger for eksterne konsumenter, som f.eks UiA. I fremtiden kan brokeren vår brukes til å formidle meldinger til andre konsumenter.
En melding består av metadata og en payload. Det er ulike protokoller inne i bildet, så hva metadata og payload er, varierer.
Behov
Formålet med broker og meldingskø er nå å formidle at endringer er foretatt. Mottageren kan selv slå opp i Cerebrum efter data, men det er nødvendig å indikere hva som er endret, slik at mottager ikke trenger å lete efter hva som er endret.
Topics og køer
Hjertet i meldingsbrokere er topic og køer. Vi ønsker å kunne legge inn change-type i topic, slik at mottager enkelt kan abonnere på ønskede endringer.
Kanskje ønsker vi også en modell hvor kombinasjon av change type og spreads mappes til topic?
Payload-format
Forslaget er at payload inneholder en dict:
| change: | (streng) endringstype, f.eks. str(change_type) hvis ikke dette er for internt. |
|---|---|
| context: | (streng) spread for subject |
| subjecttype: | (streng) «account», «group» … |
| subject: | (streng) brukernavn |
| subjectid: | (streng) id for bruker til REST-oppslag |
| data: | (ordbok) endrede attributter |
Innholdet i payload bør revurderes når REST-API er spikret. AMQP støtter også gruppering av meldinger, slik at flere meldinger kan brukes til å si noe om «samme» endring. Isåfall kan man vurdere å sende én melding per attributt, eller som her å slå sammen endringer på samme entitet.
Eksempel på meldinger
Følgende er eksempler på henholdsvis tilslag, modifikasjon og sletting av karantener:
{'category': 'quarantine',
'subjectid': 2L,
'objectid': None,
'subjecttype': 'account',
'data': {'type': 'auto_no_aff'},
'context': None,
'change': 'add',
'objecttype': None}
{'category': 'quarantine',
'subjectid': 2L,
'objectid': None,
'subjecttype': 'account',
'data': {'type': 'auto_no_aff'},
'context': None,
'change': 'mod',
'objecttype': None}
{'category': 'quarantine',
'subjectid': 2L,
'objectid': None,
'subjecttype': 'account',
'data': {'type': 'auto_no_aff'},
'context': None,
'change': 'del',
'objecttype': None}
Følgende eksempler viser tilslag og fjerning av spread:
{'category': 'context',
'subjectid': 2L,
'objectid': None,
'subjecttype': 'account',
'data': {},
'context': 'guest_account@ad',
'change': 'add',
'objecttype': None}
{'category': 'context',
'subjectid': 2L,
'objectid': None,
'subjecttype': 'account',
'data': {},
'context': 'guest_account@ad',
'change': 'delete',
'objecttype': None}