DEV Community

Cover image for Dotnet AsyncApi specification for Avro Kafka channel
ohalay
ohalay

Posted on • Edited on

Dotnet AsyncApi specification for Avro Kafka channel

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

Top comments (1)

Collapse
 
insight_it_891bf8cd689700 profile image
Insight IT

Nice and informative content,
Thanks for sharing with us,
We are providing Best Dot NET Training in Hyderabad,

DOT NET Training in Hyderabad
DOT NET Online Training in Hyderabad
DOT NET Online Course in Hyderabad