Gå til innholdet

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.

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

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

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.

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

grupperingsId og tidspunkt er fjernet.

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”
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))
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))

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