This is Kafka specific but keep in mind compression happens on your thread, so while send is asynchronous, when the buffer is full you'll block for the duration of compression. What I usually do with a producer is put it in a loop inside a real thread which takes the messages from a channel.