Schema Data Evolution
All asynchronous APIs SHOULD leverage Schema Registry to ensure consistency across consumers/producers with regards to message structure and ensuring compatibility across different versions.
The default compatibility mode SHOULD be FULL_TRANSITIVE, which is the default compatibility mode in adidas for Schema Registry. Check the sections below to know more about compatibility modes.
Compatibility modes
Once a given schema is defined, it is unavoidable that the schema evolves with time. Every time this happens, downstream consumers need to be able to handle data with both old and new schemas seamlessly.
Each new schema version is validated according to the configuration before being created as a new version. Namely, it is checked against the configured compatibility types.
Important The mere fact of enabling Schema Registry is not enough to ensure that there are no compatibility issues in a given integration. The right compatibility mode needs also to be selected and enforced.
As a summary, the available compatibility types are listed below:
BACKWARD
new schema versions are backward compatible with older versions
BACKWARD_TRANSITIVE
backward compatibility across all schema versions, not just the latest one.
FORWARD
new schema versions are compatible with older consumer versions
FORWARD_TRANSITIVE
forward compatibility across all schema versions.
FULL
both backward and forward compatibility with the latest schema version
FULL_TRANSITIVE
both backward and forward compatibility with all schema versions
NONE
schema compatibility checks are disabled
Upgrading process of clients based on compatibility
Depending on the compatibility mode, the process of upgrading producers/consumers will be different based on the compatibility mode enabled.
NONE
As there are no compatibility checks, no order will grant a smooth transition
In most of the cases this lead to having to create a new topic for this evolution
BACKWARD / BACKWARD_TRANSITIVE
Consumers MUST be upgraded first before producing new data
No forward compatibility, meaning that there's no guarantee that the consumers with older schemas are going to be able to read data produced with a new version
FORWARD / FORWARD_TRANSITIVE
Producers MUST be upgraded first and then after ensuring that no older data is present, upgrade the consumers
No backward compatibility, meaning that there's no guarantee that the consumers with newer schemas are going to be able to read data produced with an older version
FULL / FULL TRANSITIVE
No restrictions on the order, anything will work
How to deal with breaking changes
If for any reason you need to use a less strict compatibility mode in a topic, or you can't avoid breaking changes in a given situation, the compatibility mode SHOULD NOT be modified on the same topic.
Instead, a new topic SHOULD be used to avoid unexpected behaviors or broken integrations. This allows a smooth transitioning from clients to the definitive topic, and once all clients are migrated the original one can be decommissioned.
Alternatively, instead of modifying existing fields it MAY be considered as an sub-optimal approach to add the changes in new fields and have both coexisting. Take into account that this pollutes your topic and it can cause some confusion.
Last updated