Dotnet AsyncApi specification for Avro Kafka channel

ohalay - Sep 16 - - Dev Community

Problem

How do we document Event-Driven Architecture (EDA) and provide discovery for events and transport?

Solution

Generate AsyncAPI specifications document - it is defacto standard for EDA as OpenAPI for HTTP API. This document may be used by a lot of tools to visualize and share specifications:

Implementation

Our ASP .Net Core application publishes events to Kafka using avro serialization protocol. There is a library that can help to build AsyncApi specification. A stable version v5.2.4(when the article was published) does not support Avro schema, but the new beta version (6.0.0-beta.97) - has implementation.

1. We will start with the high-level document

var document = new AsyncApiDocument()
{
    Info = new AsyncApiInfo
    {
        Title = "My AsyncAPI",
        Version = "0.0.1"
    }
};
Enter fullscreen mode Exit fullscreen mode

2. Next, we will create components(Kafka messages with Avro schema). Also, there is an option to reference the existing Avro file schema.

document.Components = new AsyncApiComponents
{
    Messages = new Dictionary<string, AsyncApiMessage>
    {
        ["MyAvroMessage"] = new AsyncApiMessage
        {
            SchemaFormat = "application/vnd.apache.avro;version=1.9.0",
            Payload = new AsyncApiAvroSchemaPayload(new AvroRecord
            {
                Doc = "Doc for event",
                Name = "MyAvroMessage",
                Namespace = "Test.MyAvroMessage",
                Fields = [
                    new AvroField {
                        Doc = "Doc for field",
                        Name = "Id",
                        Type = AvroPrimitiveType.String,
                    }
                ]
            })
        }
    }
};
Enter fullscreen mode Exit fullscreen mode

3. Reference messages to channels(Kafka topic)

document.Channels["my.kafka.topic"] = new AsyncApiChannel
{
    Subscribe = new AsyncApiOperation
    {
        Message = [
           new AsyncApiMessage
           {
               Reference = new AsyncApiReference
               {
                   Id = "MyAvroMessage",
                   Type = ReferenceType.Message,
               }
           }
        ]
    }
};
Enter fullscreen mode Exit fullscreen mode

4. Serialize document to AsyncApi specification

var serializedDoc = document.Serialize(
    AsyncApiVersion.AsyncApi2_0,
    AsyncApiFormat.Yaml
);
Enter fullscreen mode Exit fullscreen mode

5. In the end, we will have the next specification

asyncapi: 2.6.0
info:
  title: My AsyncAPI
  version: 0.0.1
channels:
  my.kafka.topic:
    subscribe:
      message:
        $ref: '#/components/messages/MyAvroMessage'
components:
  messages:
    MyAvroMessage:
      payload:
        type: record
        name: MyAvroMessage
        namespace: Test.MyAvroMessage
        doc: Doc for event
        fields:
          - name: Id
            type: string
            doc: Doc for field
      schemaFormat: application/vnd.apache.avro;version=1.9.0
Enter fullscreen mode Exit fullscreen mode

6. Finally, visualization

Image description

Conclusion

  • With AsyncApi spec document we can share it via endpoint as OpenAPI document and use a tool to visualize
  • We can build an Avro scheme from scratch or reference schema file
  • We can provide information for Kafka server and bindings, but it is not our case
  • We can even generate clients for some programming languages, but that is also not our case
  • Currently AsyncAPI.NET don't support 3.0.0 specification

Help links

  1. https://www.asyncapi.com/docs/tutorials
  2. https://avro.apache.org/docs/1.11.1/specification/
  3. https://github.com/LEGO/AsyncAPI.NET
. . . . . . . . . .
Terabox Video Player