Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents
Status

Current stateUnder DiscussionAccepted

Voting thread: here

Discussion thread:  TODO here

JIRATODO

Jira
serverASF JIRA
serverId5aa69414-a9e9-3523-82ec-879b028fb15b
keyKAFKA-10020

Please keep the discussion on the mailing list rather than commenting on the wiki (wiki discussions get unwieldy fast).

Motivation

Currently org.apache.kafka.streams.scala.Serdes contains implicit Serde instances. And some of these implicits are named the same as its Serde type. For example:

...

This KIP was created as a result of this pull request.

Proposed Change

The only way to make it work without naming clash is to rename these implicits. In scala implicits are usually named like these:

Code Block
languagescala
firstline0
implicit def longSerde: Serde[Long] = ???

Changed public Interfaces

Create a new org.apache.kafka.streams.scala.serialization.Serdes. It will be like an old one, but with other implicits names. The old version of Serdes should be marked as deprecated.

Also, some default Java serdes are missing from the org.apache.kafka.streams.scala.Serdes. Since we are creating a new version of Serdes, it also makes sense to add the missing default Java serdes to it.

Changed public Interfaces

New serdes in the org.apache.kafka.streams.scala.serialization.Serdes object should look New serde names should looks like these:

Code Block
languagescala
firstline01
linenumberstrue
object Serdes {
  implicit def stringSerde: Serde[String] = ???
  implicit def longSerde: Serde[Long] = ???
  implicit def javaLongSerde: Serde[java.lang.Long] = ???
  implicit def byteArraySerde: Serde[Array[Byte]] = ???
  implicit def bytesSerde: Serde[org.apache.kafka.common.utils.Bytes] = ???
  implicit def byteBufferSerde: Serde[ByteBuffer] = ???
  implicit def shortSerde: Serde[Short] = ???
  implicit def javaShortSerde: Serde[java.lang.Short] = ???
  implicit def floatSerde: Serde[Float] = ???
  implicit def javaFloatSerde: Serde[java.lang.Float] = ???
  implicit def doubleSerde: Serde[Double] = ???
  implicit def javaDoubleSerde: Serde[java.lang.Double] = ???
  implicit def integerSerdeintSerde: Serde[Int] = ???
  implicit def javaIntegerSerde: Serde[java.lang.Integer] = ???
  implicit def uuidSerde: Serde[UUID] = ???

  implicit def sessionWindowedSerde[T](implicit tSerde: Serde[T]): WindowedSerdes.SessionWindowedSerde[T] = ???

  def fromFn[T >: Null](serializer: T => Array[Byte], deserializer: Array[Byte] => Option[T]): Serde[T] = ???

  def fromFn[T >: Null](serializer: (String, T) => Array[Byte],
    deserializer: (String, Array[Byte]) => Option[T]): Serde[T] = ???
}

Not all old names have name clash, but I think it worth to rename all implicits for consistency. Also, new Serdes will contain uuidSerde, shortSerde, javaShortSerde and byteBufferSerde, which are missing in the old org.apache.kafka.streams.scala.Serdes.

Note, we're not providing an implicit for timeWindowedSerde because there's no way to automatically configure it properly (which requires knowing the window size). See KIP-659: Improve TimeWindowedDeserializer and TimeWindowedSerde to handle window size .

Migration Plan, Compatibility and Deprecation

These Proposed changes are backward compatible. The old code remains the same.

An old not binary and code compatible with the current 2.5 version. Also, users could use these implicits by full its full name (org.apache.kafka.streams.scala.Serdes.String). It means that we should pass these changes through deprecation cycle. I propose the next plan:

First release:

...

will be marked as deprecated and could be deleted with the major 3.0 release.

Rejected Alternatives

...

Rename serdes in the old 
org.apache.kafka.streams.scala.Serdes

...

Renaming serdes will require a complex migration plan. We would need to create a new serdes with the new naming near old serdes. Old serdes will be marked as deprecated. And old, deprecated serdes, could be deleted only with the major 3.0 release. It's too far away from now and too complex for such change

It will looks like these (example for the single serde):

Code Block
languagescala
firstline0
implicit def longSerde: Serde[Long] = ???
@deprecated
def Long: Serde[Long] = longSerde

...

  1. Remove deprecated serdes.

The original problem will be solved only after the second release.