The concern has been solved after I had a swift private conversation with 
Vladimir Ozerov.

We just need to document how to write and read all the types supported by 
binary format. That’s more than enough for the beginning.

—
Denis

> On Nov 17, 2017, at 10:40 AM, Denis Magda <dma...@apache.org> wrote:
> 
> Igniters,
> 
> Let me reiterate on the protocol details until it becomes publicly available.
> 
> If I’m not mistaken one of the reasons we got down to this task was to give 
> an efficient low-level protocol that will simplify and boost Ignite 
> clients/connectors development for various programming languages *avoiding* 
> any Ignite related dependancies such as binary marshaller. 
> 
> However, by some reason we agreed to stick to the binary marshaller:
>> * Ignite binary format is used for value serialization (via
>> GridBinaryMarshaller/BinaryWriter/BinaryReader). Ignite binary protocol has
>> to be implemented by clients anyway to work with cache values, so it makes
>> sense to use for all data exchange.
> 
> This suggests me that if a developer wants to exchange messages with the 
> cluster from Python, Node.js, Objective-C, embedded hardware such as smart 
> meters being power by real-time operating systems he/she has to support the 
> binary marshaller first. This sounds like a bar for the protocol adoption. 
> 
> Question:
> 
> - What exactly has to be supported on the binary protocol side?
> - Any concerns on why we can’t switch to widely used format such as JSON? 
> 
> —
> Denis
> 
> 
>> On Aug 1, 2017, at 9:10 AM, Pavel Tupitsyn <ptupit...@apache.org> wrote:
>> 
>> Igniters,
>> 
>> Below is a proposed design for thin client protocol [1] [2] socket data
>> exchange format.
>> 
>> * Values are little-endian
>> * Every request and response message starts with 4-byte length (including
>> handshake)
>> * Ignite binary format is used for value serialization (via
>> GridBinaryMarshaller/BinaryWriter/BinaryReader). Ignite binary protocol has
>> to be implemented by clients anyway to work with cache values, so it makes
>> sense to use for all data exchange.
>> 
>> 
>> 1) Socket connection is established on a port according
>> to ConnectorConfiguration.port
>> 
>> 2) Handshake is performed.
>> Request:
>>  int32 length = 8     // message length
>>  byte opCode = 1   // handshake command
>>  int16 verMajor
>>  int16 verMinor
>>  int16 verMaintenance
>>  byte clientCode = 2    // client type code (odbc, jdbc, platform)
>> 
>> Response:
>>  uint32 length = 1
>>  byte success
>> 
>> 3) Execute command. Request starts with a command code, then goes
>> command-specific data.
>> For example, IgniteCache<Integer, String>.put(1, "foo") will look like this:
>> Request:
>>  int16 opCode    // OP_CACHE_GET
>>  int32 cacheId    // GridCacheUtils.cacheId
>>  byte flags          // skipStore, noRetry, etc
>>  binobject key
>> 
>> Response:
>>  byte success
>>  binobject value
>> 
>> Where binobject corresponds to Ignite BinaryMarshaller format, which is
>> produced by BinaryWriter.writeObject method. Integer will be represented as
>> byte typeCode = 3  // GridBinaryMarshaller.INT
>> int32 value = 1
>> 
>> 4) Goto (3)
>> 
>> 
>> Comments are welcome.
>> 
>> Pavel
>> 
>> [1]
>> http://apache-ignite-developers.2346864.n4.nabble.com/Support-for-Ignite-clients-in-any-language-thin-client-protocol-td20297.html
>> [2] https://issues.apache.org/jira/browse/IGNITE-5896
> 

Reply via email to