blob: b97744df23aad09017e3fcb8ccd06afe558fe84b [file] [log] [blame] [view]
# PIP-189: No batching if only one message in batch
discuss mail-thread: https://lists.apache.org/thread/dbq1lrv03bhtk0lr5nwm5txo9ndjplv0
## Motivation
The original discussion mail :
https://lists.apache.org/thread/5svpl5qp3bfoztf5fvtojh51zbklcht2
linked issue: https://github.com/apache/pulsar/issues/16547
Introduce the ability for producers to publish a non-batched message if there is only one message in the batch.
It is useful to save the `SingleMessageMetadata` space in entry  and reduce workload of consumers to deserialize the `SingleMessageMetadata`,  especially  when sometimes there is an amount of batched messages with only one real message.
## API Changes
N/A
## Implementation
For `BatchMessageContainerImpl` :
```
public OpSendMsg createOpSendMsg() throws IOException {
        if (!producer.conf.isBatchingSingleMessage() && messages.size() == 1) {
             // If only one message,  create OpSendMsg as non-batched publish.
        }
       // ....
}
```
For `BatchMessageKeyBasedContainer`,  there is no need to change, because it uses `BatchMessageContainerImpl` to create `OpSendMsg`
## Reject Alternatives
- Always return `BatchMessageIdImpl` when `enableBatching` is set as true, even if publish single message  with a non-batched message.
Rejection reason: Consumer have to deserialize to check if there is `SingleMessageMetadata` from the payload
- Add a configuration for the producer to enable or disable this feature
Rejection reason: It is always a good idea to not create a batch message. So there is no reason to turn off this feature