Kafka streaming and observability framework for go based on Goka.


License
MIT
Install
go get github.com/syncromatics/kafmesh

Documentation

Kafmesh

Kafmesh is a Kafka streaming and observability framework built for go. It's built using Goka and generates strongly-typed wrappers to Goka's streaming concepts that are easy to write and unit-test.

TODO: note on requirement for protocol buffers

Features

  • gRPC-like code generation for streaming services

    Kafmesh components are defined in yaml files and generated via kafmesh-gen. The generated code makes it easy to unit test streaming services.

  • Discovery api to aggregate multiple running services into a single view

    Kafmesh defines discovery via a grpc service. All running services implement this api and will respond with the parts of the service that are currently running in process.

  • Stream visualizer and reading with kafql

Getting Started

Installation

Install the kafmesh generator by using:

go get -u github.com/syncromatics/kafmesh/cmd/kafmesh-gen

You will also need protoc and you will need to install protoc-gen-go go get -u github.com/golang/protobuf/protoc-gen-go

Concepts

A kafmesh service is built from components that have specific functions. A component is made up of different streaming objects

  • Source

    A source is how data gets into kafka. This could be from a grpc service getting information from different sources, such as clicks from a webpage, gps positions from vehicles, anything you would need. This is a strongly typed wrapper around the Goka Emitter concept

  • Processor

    A processor is where the bulk of the stream processing takes place. This is a strongly typed wrapper around the Goka Processor concept.

  • View

    A view is a look into what kafka is storing for a particular topic. It takes a feed from a kafka topic and provides a key/value datastore. This is a strongly typed wrapper aroudn the Goka View concept.

  • ViewSource

    View source will keep a kafka compacted topic in sync with an external source.

  • ViewSink

    A view sink will sink a kafka compacted topic into a sink.

  • Sink

    A sink will ship kafka messages to an external datastore such as a database.

Usage

You can use kafmesh-gen by running

kafmesh-gen docs/definition.yaml

Example service

See kafmesh-example for a complete usage demo.

docs/definition.yaml

name: exampleService
description: A example kafmesh service.

output:
  package: definitions
  path: internal/definitions
  module: example-service

messages:
  protobuf:
    - ../protos

components:
  - ./components/*.yaml

defaults:
  partition: 10
  replication: 3
  retention: 24h
  segment: 12h

docs/components/math.yaml

name: math
description: Does some simple math.

sources:
  - message: userId.click

processors:
  - name: total clicks
    inputs:
      - message: userId.click
    outputs:
      - message: userId.totalClicks
    persistence:
      - message: userId.totalClicksState

views:
  - message: userId.totalClicks

License

This project is licensed under the MIT License - see the LICENSE.md file for details

Acknowledgments

  • goka A big shout out for goka doing the hard part of building out a kafka streaming service for go.

  • Visual Studio Code for just being an all around great editor