dferstay opened a new pull request #324:
URL: https://github.com/apache/pulsar-client-go/pull/324


   This change splits the `MessageID` implementation in two:
   1. `messageID` - A 24 byte structure that re contains message identification
                    information only; to be used during message production
   2. `trackingMessageID` - A 72 byte structucture that shares the same
                            message identification information as `messageID`
                            and adds `ackTracker`, `acker`, and `receivedTime`
                            fields; to be used during message consumption
   
   Micro benchmarks show that passing arguments by value that are less-than
   four words of memory are optimized by the Go runtime.  Results from the
   `pulsar/impl_message_bench_test.go` module are below.
   
   ```
   name            time/op
   ProducerCall    1.46ns ± 5%
   ProducerCall-4  1.47ns ± 5%
   ConsumerCall    7.62ns ± 1%
   ConsumerCall-4  7.53ns ± 5%
   ```
   
   ### Motivation
   
   The messageID structure in pulsar-client-go has the following fields:
   ```
   type messageID struct {
        ledgerID     int64
        entryID      int64
        batchIdx     int32
        partitionIdx int32
   
        tracker      *ackTracker
        consumer     acker
        receivedTime time.Time
   }
   ```
   
   The above consumes 72 bytes.
   
   Consider the following:
   - The Go runtime optimizes copying of values that are less than or equal to 
4 words (32 bytes on 64-bit architectures). 
   - The tracker (8 bytes), consumer (16 bytes), and receivedTime (24 bytes) 
fields are not used when producing messages.
   
   It would be advantageous to split the MessageID implementation into two 
structures: one used for message production, the other used for message 
consumption
   
   ### Modifications
   
   Split the `MessageID` implementation into two structures; one used during 
message production:
   ```
   type messageID struct {
        ledgerID     int64
        entryID      int64
        batchIdx     int32
        partitionIdx int32
   ```
   One used during message consumption:
   ```
   type trackingMessageID struct {
        messageID
   
        tracker      *ackTracker
        consumer     acker
        receivedTime time.Time
   }
   ```
   
   
   ### Verifying this change
   
   - [ ] Make sure that the change passes the CI checks.
   
   This change is already covered by existing tests, such as:
   - pulsar/consumer_multitopic_test.go
   - pulsar/consumer_partition_test.go
   - pulsar/consumer_regex_test.go
   - pulsar/consumer_test.go
   - pulsar/impl_message_test.go
   - pulsar/negative_acks_tracker_test.go
   - pulsar/producer_test.go
   - pulsar/reader_test.go
   
   ### Does this pull request potentially affect one of the following parts:
   
     - Dependencies (does it add or upgrade a dependency): no
     - The public API: no
     - The schema: no
     - The default values of configurations: no
     - The wire protocol: no
   
   ### Documentation
   
     - Does this pull request introduce a new feature? no


----------------------------------------------------------------
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.

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


Reply via email to