MYRA: Codec / Transport

MYRA : Memory Yielded, Rapid Access — A modern Java Codec & Transport library built entirely on FFM API.

Zero GC. Zero Copy.
No UNSAFE. No JNI.

27us

P50 Latency

RPC over-the-wire round-trip

0

GC Pressure

Zero allocations on hot path

2.7M

Decode Ops/s

23% faster than SBE

39%

Faster Than Netty

Transport using Real-world payloads

Experience Native Speed and Memory Safety with predictable, GC-free execution using Java FFM API.

From Schema to Socket

One contract, zero‑copy codegen, delivery over io_uring

myra-codec schemas/order.myra.yml
messages:
  - name: "OrderItem"
    fields:
      - tag: 1
        name: "productCode"
        type: "int32"
      - tag: 2
        name: "qty"
        type: "int16"
  - name: "OrderCreated"
    fields:
      - tag: 1
        name: "customerId"
        type: "string"
      - tag: 2
        name: "items"
        type: "OrderItem"
        repeated: true
      - tag: 3
        name: "tax"
        type: "int64"
      - tag: 4
        name: "totalAmount"
        type: "int64"
myra-codec generated/order/OrderCreatedBuilder.java
try (PooledSegment pooled =
        OrderCreatedBuilder.allocate(encoder, 512)
                .setCustomerId("cust-7", scratch)
                .setItems(1, item -> item
                        .setProductCode(1001)
                        .setQty((short) 3))
                .setTax(120L)
                .setTotalAmount(5120L)
                .build((short) OrderCreatedFlyweight.TEMPLATE_ID,
                        OrderCreatedFlyweight.SCHEMA_VERSION)) {
    MemorySegment message = pooled.segment();
}
myra-codec generated/order/OrderCreatedFlyweight.java
OrderCreatedFlyweight fw = new OrderCreatedFlyweight();
fw.wrap(segment, MessageHeader.HEADER_SIZE);
fw.validate();
Utf8View customer = fw.getCustomerId();
for (int i = 0; i < fw.getItemsCount(); i++) {
    OrderItemFlyweight item = fw.getItemsAt(i);
    int code = item.getProductCode();
    short qty = item.getQty();
}
long total = fw.getTotalAmount();
myra-transport MyraServer.java
MyraServer server = new MyraServer(
        MyraServerConfig.builder().port(9000).build(),
        new MyraServerHandler() {
            public void onConnect(TransportBackend conn) {}
            public void onDataReceived(TransportBackend conn, RegisteredBuffer buf, int len) {
                OrderCreatedFlyweight fw = new OrderCreatedFlyweight();
                fw.wrap(buf.segment(), MessageHeader.HEADER_SIZE);
                fw.validate();
            }
            public void onDisconnect(TransportBackend conn) {}
        });
server.start();
myra-transport TransportFactory.java
TransportConfig config = TransportConfig.builder()
        .backendType(TransportConfig.BackendType.IO_URING)
        .registeredBuffers(TransportConfig.RegisteredBuffersConfig.builder()
                .enabled(true).numBuffers(8).bufferSize(2048).build())
        .build();
SocketAddress remote = new InetSocketAddress("127.0.0.1", 9000);
Transport client = TransportFactory.create(config, remote);
client.start(new TransportHandlerAdapter() {});
client.connect(remote);
client.send(message);