wang-jiahua opened a new issue, #10522:
URL: https://github.com/apache/rocketmq/issues/10522

   ### Before Creating the Enhancement Request
   
   - [x] I have confirmed that this should be classified as an enhancement 
rather than a bug/feature.
   
   ### Summary
   
   Enhance the `FastCodesHeader` interface and `RocketMQSerializable` utility 
to reduce allocation and CPU overhead during Remoting header encoding/decoding.
   
   ### Motivation
   
   In high-throughput scenarios, every RPC request/response goes through the 
Remoting header encode/decode path. Current implementation has several 
inefficiencies:
   
   1. `FastCodesHeader.writeIfNotNull` always converts numeric values 
(`Long`/`Integer`) to `String` via `value.toString()`, creating transient 
String objects.
   2. `RocketMQSerializable.readStr` allocates a new `String` even for 
single-byte ASCII values.
   3. `RocketMQSerializable.mapDeserialize` pre-allocates a `HashMap` with 
capacity 128, which is oversized for typical headers and wastes memory.
   4. There is no direct way to write primitive `long`/`int` values to the 
ByteBuf without first boxing them into `Long`/`Integer`.
   
   These small overheads are amplified by millions of RPCs per second in 
production.
   
   ### Describe the Solution You'd Like
   
   1. Add `writeDecimalLong(ByteBuf, long)` and `writeDecimalInt(ByteBuf, int)` 
to `RocketMQSerializable` to write primitive decimal numbers directly to 
ByteBuf without String allocation.
   2. Add `writeLong(ByteBuf, String, long)` and `writeInt(ByteBuf, String, 
int)` helpers to `FastCodesHeader`.
   3. Optimize `FastCodesHeader.writeIfNotNull` to route `Long`/`Integer` 
values through the new primitive writers.
   4. Add a `SINGLE_BYTE_STRINGS` cache for ASCII single-byte strings in 
`RocketMQSerializable.readStr`.
   5. Reduce the initial capacity of `HashMap` in `mapDeserialize` from 128 to 
24.
   
   All changes are additive and keep existing method signatures backward 
compatible.
   
   ### Describe Alternatives You've Considered
   
   - Use `String.valueOf` + `writeStr`: still allocates String objects.
   - Use `ByteBuf.writeAscii` for numbers: Netty's API does not provide direct 
decimal writing with length prefix required by RocketMQ protocol.
   - Keep `HashMap(128)` in `mapDeserialize`: wastes memory for small maps; 24 
is sufficient for typical headers.
   
   ### Additional Context
   
   This is part of a larger effort to reduce Broker allocation rate. Related 
previous PRs: #10443, #10491, #10485, #10514, #10513, #10517.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to