DEV Community

Oleg Agafonov for SIP3

Posted on • Updated on

How to extend Vert.x EventBus API to save on serialization.

Alexey Soshin has a great blog post: Understanding Vert.x: Event Bus. In the blog post he explains how to extend MessageCodec interface and start sending objects via Event Bus without paying anything for serialization.

SIP3 is a monitoring and troubleshooting platform that has to handle hundreds of thousands SIP packets and millions of RTP packets per second. That's why we've started using this approach from the very beginning. However, as a Kotlin users, we couldn't do not add some sugar ๐Ÿฌ๐Ÿญ๐Ÿฐ.

Here is our recipe:

๐Ÿฌ Register MessageCodec

Let's use Kotlin method extensions to define our local codec:

fun Vertx.registerLocalCodec() {
    eventBus().registerCodec(object : MessageCodec<Any, Any> {
        override fun decodeFromWire(pos: Int, buffer: Buffer?) = throw NotImplementedError()
        override fun encodeToWire(buffer: Buffer?, s: Any?) = throw NotImplementedError()
        override fun transform(s: Any?) = s
        override fun name() = "local"
        override fun systemCodecID(): Byte = -1
Enter fullscreen mode Exit fullscreen mode

All is left is just to register our codec explicitly while initializing Vertx object.

๐Ÿญ Extend EventBus

Kotlin has two great features - method extensions and named arguments. We decided to use a combination of those to introduce a custom method called localSend:

object EventBusUtil {

    val USE_LOCAL_CODEC = deliveryOptionsOf(codecName = "local", localOnly = true)

fun EventBus.localSend(address: String, message: Any, options: DeliveryOptions? = null) {
    options?.apply {
        codecName = "local"
        isLocalOnly = true
    send(address, message, options ?: USE_LOCAL_CODEC)
Enter fullscreen mode Exit fullscreen mode

๐Ÿฐ Just enjoy

Now we can start sending messages within the application without paying for serialization:

fun main() {
    val vertx = Vertx.vertx()

    val answer = BigDecimal(42)
    vertx.eventBus().localSend("question", answer)
Enter fullscreen mode Exit fullscreen mode

I hope you loved the approach and will start using it in your projects. If you have any questions, just leave me a message ๐Ÿ˜„

Happy coding...

Top comments (0)