perf: batch flush signaling and fetch path optimizations (Round 6)

Implement Go's pcd (per-client deferred flush) pattern to reduce write-loop
wakeups during fan-out delivery, optimize ack reply string construction with
stack-based formatting, cache CompiledFilter on ConsumerHandle, and pool
fetch message lists. Durable consumer fetch improves from 0.60x to 0.74x Go.
This commit is contained in:
Joseph Doherty
2026-03-13 09:35:57 -04:00
parent 0a4e7a822f
commit 0be321fa53
13 changed files with 680 additions and 153 deletions

View File

@@ -404,6 +404,14 @@ public class AccountImportExportTests
OnMessage?.Invoke(subject, sid, replyTo, headers, payload);
}
public void SendMessageNoFlush(string subject, string sid, string? replyTo,
ReadOnlyMemory<byte> headers, ReadOnlyMemory<byte> payload)
{
OnMessage?.Invoke(subject, sid, replyTo, headers, payload);
}
public void SignalFlush() { }
public bool QueueOutbound(ReadOnlyMemory<byte> data) => true;
public void RemoveSubscription(string sid) { }

View File

@@ -513,6 +513,14 @@ public class AccountIsolationTests
OnMessage?.Invoke(subject, sid, replyTo, headers, payload);
}
public void SendMessageNoFlush(string subject, string sid, string? replyTo,
ReadOnlyMemory<byte> headers, ReadOnlyMemory<byte> payload)
{
OnMessage?.Invoke(subject, sid, replyTo, headers, payload);
}
public void SignalFlush() { }
public bool QueueOutbound(ReadOnlyMemory<byte> data) => true;
public void RemoveSubscription(string sid) { }
}

View File

@@ -814,6 +814,14 @@ public class AuthCalloutTests
OnMessage?.Invoke(subject, sid, replyTo, headers, payload);
}
public void SendMessageNoFlush(string subject, string sid, string? replyTo,
ReadOnlyMemory<byte> headers, ReadOnlyMemory<byte> payload)
{
OnMessage?.Invoke(subject, sid, replyTo, headers, payload);
}
public void SignalFlush() { }
public bool QueueOutbound(ReadOnlyMemory<byte> data) => true;
public void RemoveSubscription(string sid) { }
}

View File

@@ -322,6 +322,14 @@ public class ImportExportTests
OnMessage?.Invoke(subject, sid, replyTo, headers, payload);
}
public void SendMessageNoFlush(string subject, string sid, string? replyTo,
ReadOnlyMemory<byte> headers, ReadOnlyMemory<byte> payload)
{
OnMessage?.Invoke(subject, sid, replyTo, headers, payload);
}
public void SignalFlush() { }
public bool QueueOutbound(ReadOnlyMemory<byte> data) => true;
public void RemoveSubscription(string sid) { }