What is the reason of extending both of KafkaProducerMessage and KafkaConsumerMessage from the AbstractKafkaMessage?
I might be wrong, but it looks like we cannot make $key and $body parameters of the KafkaConsumerMessage::__construct method strictly typed because we don't know what type of value could be passed to KafkaProducerMessage, but in KafkaConsumerMessage we are always getting a strings.