Hi Community, I want to start an SIP about "support multi-version protocol control" > 1 Motivation • Issue 1: The structure of the communication protocol message > in Seata underwent significant changes in version 0.7.1, without backward > compatibility for the previous protocol. As a result, users of older versions > of the server must upgrade both the server and the client simultaneously when > upgrading, which required a complete shutdown for the upgrade. • Issue 2: The > protocol has extensibility issues. Expanding fields or types leads to > incompatibility with previous protocols (inconsistent extension methods and > scattered adaptation logic across layers, causing confusion and unmanageable > scenarios). • Previous Discussions: Seata PR #4569 , SEATA old and new > communication protocol structure analysis > 2 Overview of DesignThe primary goal is for the new version of the Seata > server to communicate with clients of the older version (the logic for new > clients communicating with old servers is similar). The tasks include: • The > new server recognizes the old protocol. • The new server parses the old > protocol. • The new server marks the counterpart as an old version > application and binds it to a channel. • The new server initiates > communication using the old protocol.The second goal is to optimize protocol > extensibility: • Cross-version adaptation is centralized in the codec (the > codec is separated by version number). • The server handles business logic > using the latest version of the message.3 Protocol Structure Compatibility > Design3.1 Compatibility Design • The new server recognizes the old protocol: > • ; • As shown above, and detailed in the analysis, the third byte can > identify the protocol version since versions below 0.6.1 have a different > value for this byte compared to version 1 and later. • The new server parses > the old protocol: • Once identified as an old version, the server interprets > it accordingly. Missing fields are given default values compatible with the > old version. • The new server marks the counterpart as an old version > application and binds it to a channel: • When TM/RM registers with TC, TC > records the channel and saves the protocol version for future messaging. • > The new server initiates communication using the old protocol: • When the > TM/RM is identified as an old version client, communication is > encoded/decoded using the old protocol.3.2 Optimization of Extensibility • > Codec is separated by version, clearly distinguishing each version. • When > the server receives a message object (decode): it decodes using the latest > version codec. • When the server creates a message object (encode): it > selects the codec based on the version before sending. • Version recognition > (parsed from the header): byte b0 = in.readByte(); byte b1 = in.readByte(); // v1/v2/v3 : b2 = version // v0 : b2=0, 1st byte in FLAG(2byte:0x10/0x20/0x40/0x80) byte b2 = in.readByte();
> 4 Comparison of Before and After Changing (Server Receiving) • Flowchart: • > Version separated : The serializer and decoder need to be separated > (different version numbers correspond to different serializers and decoders). > • The version number must be clear in the process; The MutiProtocolDecoder > will identify the version number to determine the corresponding version of > the channel, ensuring that communication with the client always uses the same > version format. • For message serialization: v1 and subsequent versions (v2, > v3, etc.) will be consistent, only v0 differs.5 Comparison of Before and > After Changing (Server Sending) • Flowchart: • • The changing points match > those for receiving. • Encoder version: the version number of the header is > parsed during the first communication (usually register) to determine the > version number of the encoder. • Message serializer: it depends on the > encoder.