This is an automated email from the ASF dual-hosted git repository.
xiangying pushed a commit to branch schema_compatibility
in repository https://gitbox.apache.org/repos/asf/pulsar-client-go.git
The following commit(s) were added to refs/heads/schema_compatibility by this
push:
new eaddb18 address some comments
eaddb18 is described below
commit eaddb18c325d9a64b53dbee68b170f4efe1443de
Author: xiangying <[email protected]>
AuthorDate: Mon Jul 17 13:18:57 2023 +0800
address some comments
---
README.md | 5 ++---
docs/schema-compatibility.md | 18 +++++++++---------
2 files changed, 11 insertions(+), 12 deletions(-)
diff --git a/README.md b/README.md
index 19a577a..16483c7 100644
--- a/README.md
+++ b/README.md
@@ -195,9 +195,8 @@ similar to the following, and then run `go mod tidy`.
```
github.com/apache/pulsar-client-go/oauth2 v0.0.0-20220630195735-e95cf0633348
// indirect
```
-### Schema compatibility with JAVA client
+### Schema compatibility with Java client
Due to the differences in programming language features and data
representation,
schema incompatibility may arise between different languages.
-We have conducted an analysis of the schema compatibility between Java and Go,
-and we have provided some feasible solutions.
+The analysis of the schema compatibility between Java and Go has been
conducted and the corresponding solutions have been listed below.
You can get more details in
[schema-compatibility](docs/schema-compatibility.md).
\ No newline at end of file
diff --git a/docs/schema-compatibility.md b/docs/schema-compatibility.md
index 44acd2f..2e0cb8e 100644
--- a/docs/schema-compatibility.md
+++ b/docs/schema-compatibility.md
@@ -1,16 +1,16 @@
### Description
-Pulsar is a high-performance, persistent message middleware that supports
multiple programming languages and data models. This article will focus on
the comparison between Pulsar's GO Client and JAVA Client in Schema
compatibility. We'll focus on four common schema types: Avro, JSON, Proto, and
Proto native schema.
+Pulsar is a high-performance, persistent message middleware that supports
multiple programming languages and data models. This article focuses on the
comparison between Pulsar's Go Client and Java Client in schema compatibility.
It focuses on four common schema types: Avro, JSON, Proto, and Proto native
schema.
#### Avro Schema
-Avro schema in Go and Java are compatible, but there are some differences in
how the schemas are defined. Go typically uses schema definitions, a string
Json, to create schemas, whereas Java often uses class types for schema
creation. As a result, Java allows non-primitive fields to be nullable by
default, while in Go's schema definition, the nullability of fields needs to be
explicitly stated.
+Avro schema in Go and Java are compatible, but there are some differences in
how the schemas are defined. Go typically uses schema definitions, a string
JSON, to create schemas. However, Java often uses class types for schema
creation. As a result, Java allows non-primitive fields to be nullable by
default, while in Go's schema definition, the nullability of fields needs to be
explicitly stated.
GO:
```go
-// Compatible with Java schema define
+// Compatible with defining a schema in Java
exampleSchemaDefCompatible := NewAvroSchema(`{"fields":
[
{"name":"id","type":"int"},{"default":null,"name":"name","type":["null","string"]}
],
"name":"MyAvro","namespace":"schemaNotFoundTestCase","type":"record"}`,
nil)
-// Not compatible with Java schema define
+// Not compatible with defining a schema in Java
exampleSchemaDefIncompatible := NewAvroSchema(`{"fields":
[
{"name":"id","type":"int"},{"default":null,"name":"name","type":["string"]}
@@ -35,12 +35,12 @@ Producer<Example> producer =
pulsarClient.newProducer(Schema.AVRO(Example.class)
#### JSON Schema
The situation with JSON schema is similar to Avro Schema.
```go
-// Compatible with Java schema define
+// Compatible with defining a schema in Java
exampleSchemaDefCompatible :=
"{\"type\":\"record\",\"name\":\"Example\",\"namespace\":\"test\"," +
"\"fields\":[{\"name\":\"ID\",\"type\":\"int\"},{\"name\":\"Name\",\"type\":[\"null\",
\"string\"]}]}"
consumerJSCompatible := NewJSONSchema(exampleSchemaDefCompatible, nil)
-// Not compatible with Java schema define
+// Not compatible with defining a schema in Java
exampleSchemaDefIncompatible :=
"{\"type\":\"record\",\"name\":\"Example\",\"namespace\":\"test\"," +
"\"fields\":[{\"name\":\"ID\",\"type\":\"int\"},{\"name\":\"Name\",\"type\":\"string\"}]}"
@@ -59,19 +59,19 @@ message TestMessage {
}
```
-Schema define in java,which can be parsed by a Class.
+Defining a schema in Java can be parsed by a class.
```json
protoSchemaDef =
"{\"type\":\"record\",\"name\":\"TestMessage\",\"namespace\":\"org.apache.pulsar.client.api.schema.proto.Test\",\"fields\":[{\"name\":\"stringField\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"},\"default\":\"\"},{\"name\":\"intField\",\"type\":\"int\",\"default\":0}]}"
```
-Schema define in GO, which need to be manually written.
+Defining a schema in Go needs to write manually.
```json
protoSchemaDef =
"{\"type\":\"record\",\"name\":\"Example\",\"namespace\":\"test\"," +
"\"fields\":[{\"name\":\"num\",\"type\":\"int\"},{\"name\":\"msf\",\"type\":\"string\"}]}"
```
To address the incompatibility between Proto and ProtoNative types, you can
follow this approach:
-1. In the Java client, parse the message using the Avro Proto library to
obtain the Schema Definition.
+1. In the Java client, parse the message using the Avro Proto library to
obtain the schema definition.
2. Use this obtained schema definition in the Go client to ensure both clients
use the same schema definition.
```json
protoSchemaDef =
"{\"type\":\"record\",\"name\":\"TestMessage\",\"namespace\":\"org.apache.pulsar.client.api.schema.proto.Test\",\"fields\":[{\"name\":\"stringField\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"},\"default\":\"\"},{\"name\":\"intField\",\"type\":\"int\",\"default\":0}]}"