Migrere fra AVRO

Denne guiden er for produsenter som fortsatt sender varsler på de gamle
Avro-topicene. Kort fortalt: ett felles topic i stedet for flere, json i stedet
for Avro, og to meldingstyper i stedet for fire. Skal du sette opp varsler for
første gang, trenger du ikke denne guiden.

Topic

Produsenter trenger kun å forholde seg til ett topic for å opprette og inaktivere varsler. Opprett pr i github-repository.

Buildere og Avro

Vi bruker ikke lenger avro for å validere schema. Varsel-eventer sendes som json-string, med varsel-id som nøkkel.

Endringer i meldingene

[!NOTE]
Se produsere varsler for dokumentasjon av nytt format.

Meldingstyper

Tidligere har det vært fire meldingstyper (beskjed, oppgave, innboks, done). Disse er nå slått sammen til to objekter: opprett og inaktiver. Varseltypen spesifiseres i opprett-eventet.

Endring av feltnavn

  • eventId -> varselId
  • sikkerhetsnivaa -> sensitivitet (3 -> substantial, 4 -> high)
  • synligFremTil -> aktivFremTil
  • fodselsnummer -> ident

Deprekerte felter

grupperingsId og tidspunkt er fjernet.

Tekst

[!WARNING]
Alle tekster må ha en språkkode. Det er anbefalt å legge til tekst for flere språk.
Om det er tekst på flere språk, må én være satt som default.

Eksempel

Et system sender varsler til brukere til gammelt topic med avro, og skal migreres.

Varslene har:
- type oppgave
- sikkerhetsnivå 4
- lenke til https://www.nav.no
- frist 14 dager etter oppretting
- teksten "Dette er et oppgave-varsel"
- ekstern varsling på sms med teksten "Dette er en sms om oppgave"

Gammelt oppsett med Avro-builder

val gammeltOppgaveTopic = "min-side.aapen-brukernotifikasjon-oppgave-v1"

val kafkaProps = Properties().apply {
    put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, KafkaAvroSerializer::class.java)
    put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, KafkaAvroSerializer::class.java)
    // ...
}

val kafkaProducer = KafkaProducer<NokkelInput, OppgaveInput>(kafkaProps)

val oppgaveId = UUID.randomUUID().toString()

val nokkelInput = NokkelInputBuilder()
    .withEventId(oppgaveId)
    .withGrupperingsId("123")
    .withFodselsnummer(fodselsnummer)
    .withNamespace("test-team")
    .withAppnavn("demo-app")
    .build()

val oppgaveInput = OppgaveInputBuilder()
    .withTidspunkt(LocalDateTime.now())
    .withSynligFremTil(LocalDateTime.now().plusDays(14))
    .withTekst("Dette er et oppgave-varsel")
    .withLink(URL("https://www.nav.no"))
    .withSikkerhetsnivaa(4)
    .withEksternVarsling(true)
    .withSmsVarslingstekst("Dette er en sms om oppgave")
    .withPrefererteKanaler("SMS")

kafkaProducer.send(ProducerRecord(gammeltOppgaveTopic, nokkelInput, oppgaveInput))
// ...
val gammeltDoneTopic = "min-side.aapen-brukernotifikasjon-done-v1"

val done = DoneInputBuilder()
    .withTidspunkt(now())

kafkaProducer.send(ProducerRecord(gammeltDoneTopic, nokkel, done))

Nytt oppsett med kotlin-builder


val nyttVarselTopic = "min-side.aapen-brukervarsel-v1"

val kafkaProps = Properties().apply {
    put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer::class.java)
    put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer::class.java)
    // ...
}

val kafkaProducer = KafkaProducer<String, String>(kafkaProps)

val oppgaveId = UUID.randomUUID().toString()

val opprettVarsel = VarselActionBuilder.opprett {
    type = Varseltype.Oppgave
    varselId = oppgaveId
    sensitivitet = Sensitivitet.High
    ident = fodselsnummer
    tekst = Tekst(
        spraakkode = "nb",
        tekst = "Dette er et oppgave-varsel",
        default = true
    )
    link = "https://www.nav.no"
    aktivFremTil = ZonedDateTime.now().plusDays(14)
    eksternVarsling {
        preferertKanal = EksternKanal.SMS
        smsVarslingstekst = "Dette er en sms om oppgave"
    }
}

kafkaProducer.send(ProducerRecord(nyttVarselTopic, oppgaveId, opprettVarsel))
// ...
val inaktiverVarsel = VarselActionBuilder.inaktiver {
    varselId = oppgaveId
}

kafkaProducer.send(ProducerRecord(nyttVarselTopic, oppgaveId, inaktiverVarsel))

Kontakt

Ta kontakt med oss på Slack hvis du lurer på noe.