+1

great work

Enrico

Il giorno lun 9 ago 2021 alle ore 08:20 PengHui Li <codelipeng...@gmail.com>
ha scritto:

> I have copied to wiki page
> https://github.com/apache/pulsar/wiki/PIP-90%3A-Expose-broker-entry-metadata-to-the-client
>
> Thanks,
> Penghui
> On Aug 9, 2021, 11:57 AM +0800, dev@pulsar.apache.org, wrote:
> >
> > Background
> >
> > In PIP-70, Apache Pulsar has introduced broker-level entry metadata and
> already supports adding a timestamp for the message.
> >
> > Besides, in PR-9039, broker entry metadata provides a continuous message
> index for messages in one topic-partition which is useful for Protocol
> Handler like KOP.
> >
> > However, the client can't get the broker-level entry metadata for now,
> since the broker skips this information when sending messages to the
> client. This limits some use cases of the broker-level message metadata for
> the client, so we plan to implement a feature to send messages with the
> broker-level entry metadata to clients.
> >
> > Pull Request: https://github.com/apache/pulsar/pull/11553
> >
> > Solution
> >
> > First, we change the client protocol version from 17 to 18, as the
> broker may send the broker entry metadata to the client, and the client
> should parse it correctly.
> >
> > |
> >
> > enum ProtocolVersion {
> > ...
> > v18 = 18; // Add client support for broker entry metadata
> > }
> >
> > |
> >
> > Second, we add a configuration item in the broker to enable or disable
> the feature of exposing broker entry metadata to the client.
> >
> > |
> >
> > @FieldContext(
> > category = CATEGORY_SERVER,
> > doc = "Enable or disable exposing broker entry metadata to client.")
> > privateboolean enableExposingBrokerEntryMetadataToClient = false;
> >
> > |
> >
> > Then, when the broker sends messages to the client, it should decide
> whether to send broker entry metadata to the client according to the above
> configuration item and the client protocol version, which looks like:
> >
> > |
> >
> > // skip broker entry metadata if consumer-client doesn't support broker
> entry metadata or the
> > // features is not enabled
> > if (cnx.getRemoteEndpointProtocolVersion() <
> ProtocolVersion.v18.getValue()
> > || !cnx.isEnableExposingBrokerEntryMetadataToClient()) {
> > Commands.skipBrokerEntryMetadataIfExist(metadataAndPayload);
> > }
> >
> > |
> >
> > As for the client, it needs to parse the broker entry metadata
> correctly, and then it is stored in MessageImpl.brokerEntryMetadata.
> >
> > Besides, we plan to add two API in org.apache.pulsar.client.api.Message
> >
> > |
> >
> > /**
> > * Get broker publish time from broker entry metadata.
> > * Note that only if the feature is enabled in the broker then the value
> is available.
> > *
> > * @since 2.9.0
> > * @return broker publish time from broker entry metadata, or empty if
> the feature is not enabled in the broker.
> > */
> > Optional<Long> getBrokerPublishTime();
> >
> > /**
> > * Get index from broker entry metadata.
> > * Note that only if the feature is enabled in the broker then the value
> is available.
> > *
> > * @since 2.9.0
> > * @return index from broker entry metadata, or empty if the feature is
> not enabled in the broker.
> > */
> > Optional<Long> getIndex();
> >
> > |
> >
> > So the client can get and use these fields from broker entry metadata.
> >
> > Compatibility
> >
> > Let’s talk about the compatibility from two aspects: new broker with old
> client, and old broker with new client.
> >
> > For new broker with old client, the client protocol version of the
> client is less than 18, so the broker will not send broker entry metadata
> to the client, which avoids the compatibility problem.
> >
> > For old broker with new client, there is no compatibility problem
> either, as the client will judge whether there is broker entry metadata by
> the magic number. If there is no broker entry metadata, the client will not
> parse it. Besides, the two added API `getIndex()` and
> `getBrokerPublishTime()` return Optional, which considers the situation
> that the broker doesn’t send broker entry metadata.
> >
> > Test Plan
> >
> > Make sure the client can get the broker entry metadata correctly, and
> the two API `getBrokerPublishTime()` and `getIndex()` work correctly.
>

Reply via email to