Idiomatic Event Sourcing in Go


Eventually

Event Sourcing for Go


Idiomatic library to help you build Event Sourced application in Go.

Please note

The library is currently under development and not ready yet for production use-cases.

Note on semantic versioning

This library is actively being developed, and prior to v1 release the following Semantic versioning is being adopted:

  • Breaking changes are tagged with a new MINOR release
  • New features, patches and documentation are tagged with a new PATCH release

Contributing

You want to contribute to eventually but you don't know where to start?

First of all, thank you for considering contributing ❤️

You can head over our CONTRIBUTING section to know how to contribute to the project, and — in case you don't have a clear idea what to contribute — what is most needed needed from contributors.

License

This project is licensed under the MIT license.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in eventually-go by you, shall be licensed as MIT, without any additional terms or conditions.

Owner
eventually
Event Sourcing for all
eventually
Comments
  • refactor(serdes): exported serdes target []byte only

    refactor(serdes): exported serdes target []byte only

    The previous implementation of serdes in the serdes package were going from Src to Dst (and back), where Dst is a "supporting" intermediary data structure. This however is a separate concern that can be split from the implementations.

    This PR introduces the following changes:

    1. A new serdes.Chain(), to chain two serdes together,
    2. Change the serdes.* implementations to target a single type to byte-array instead.
  • fix: golangci-lint linter execution

    fix: golangci-lint linter execution

    After some time, golangci-lint is finally working ~well~ better with go.work files, which means we can finally enforce linter rules again (yay!)

    This PR re-enables the linter, and fixes the complaints it has.

  • feat(eventstore): add ContextAware and ContextMetadata propagator

    feat(eventstore): add ContextAware and ContextMetadata propagator

    In order to provide a simple way to set common Metadata for a specific request/unit-of-work, this PR adds a eventstore.ContextMetadata to extend the request context.Context with the common Metadata, and an Event Store extension type, eventstore.ContextAware that appends this Metadata to each Domain Event appended using that context.Context.

  • fix: ensure to run golangci-linter for eventstore/postgres

    fix: ensure to run golangci-linter for eventstore/postgres

    With #59, I've noticed that some linting rules did not run and the code linting step passed successfully, although it shouldn't have.

    Turns out that, since eventstore/postgres is in a different Go module, golangci-lint must be run in that folder explicitly.

    This PR adds a new target to the Makefile, enumerating all the go.mod files and running golangci-lint in those folders.

  • Allow to wrap Event appending function for Postgres EventStore

    Allow to wrap Event appending function for Postgres EventStore

    This PR allows to wrap low level append function in Postgres EventStore implementation.

    This would allow to execute some actions before or after the base implementation, things like extra validations, deduplication, mapping, etc. Also, the base function could be completely replaced with some custom code (like running a different SQL function or a different serializer).

    What do you think about this idea @ar3s3ru? If it's ok, let me know if I need to update documentation or anything else.

  • feat(subscription): re-enable Volatile subscriptions

    feat(subscription): re-enable Volatile subscriptions

    This PR re-introduces support for subscription.Volatile, by adding support for a new Event Store interface: eventstore.SequenceNumberGetter.

    With this interface, we can retrieve the latest sequence number value for the Event Store, and use a Catch-up Subscription that starts consuming from this value. Checkpoints should be disabled, as Volatile Subscriptions are meant not to carry state.

  • feat(projection): pilot checkpointing behavior inside Projection.Apply

    feat(projection): pilot checkpointing behavior inside Projection.Apply

    Sometimes it's desirable to specify inside a Projection whether the message being consumed should be checkpointed or not.

    Example: projecting messages to a Kafka topic using batching -- if a whole batch fails, but we already committed the batch events processed in the Projection, then we need manual intervention.

    This PR adds the following modifications:

    1. projection.Runner creates some checkpointing information (*bool) and post it in the context for Projection.Apply to use it,
    2. projection.Checkpoint(ctx), where the context set by projection.Runner specifies to checkpoint the current message if successful,
    3. projection.DoNotCheckpoint(ctx), as above but without checkpointing.
  • refactor(eventstore): change Streamer interface to a single method, introduce Event Stream targets type

    refactor(eventstore): change Streamer interface to a single method, introduce Event Stream targets type

    Targets for the Event Store Stream operations were so far hardcoded (e.g. StreamAll, StreamByType, Stream).
    This makes implementations and mocks a bit more verbose (due to the number of methods), but mainly more verbose to add additional targets for stream operations.

    An example: streaming by multiple Event Stream types.

    Normally, that would've required an additional method, and implementing the method for every implementation of eventstore.Streamer around.

    However, we can simplify things and specify a sealed interface for representing Event Stream targets. So far, the supported targets are: All, By one Stream type, By multiple Stream types, By a single Stream ID.

  • feat(oteleventually): add events list to Append spans

    feat(oteleventually): add events list to Append spans

    The current logic to add events to Append telemetry data is broken.

    Fix it by marshaling the incoming events to JSON and add it to the Span attributes.

  • chore: add Github Actions to automate versioning release

    chore: add Github Actions to automate versioning release

    I hate manual tagging because, as everything tasked to a human being, the human factor brings inherent error.

    Since we're all ✨ software engineers here ✨ we can automate the tagging process when merging on main -- maybe after the tests have passed?

    NOTE: for each feature, a minor release should be used, and fix or minor branch, a patch release should be used instead.

FreeSWITCH Event Socket library for the Go programming language.

eventsocket FreeSWITCH Event Socket library for the Go programming language. It supports both inbound and outbound event socket connections, acting ei

Dec 11, 2022
File system event notification library on steroids.

notify Filesystem event notification library on steroids. (under active development) Documentation godoc.org/github.com/rjeczalik/notify Installation

Jan 7, 2023
An example event-driven application using Atmo and NATS

Atmo + NATS Example Project This repo is an example of using Atmo with NATS as a streaming messaging layer. In this example, Atmo connects to NATS and

Oct 27, 2021
The kprobe package allows construction of dynamic struct based on kprobe event format descriptions.

The kprobe package allows construction of dynamic struct based on kprobe event format descriptions.

Oct 27, 2021
Eye - An easy-use lib for event-driven pattern

?? Eye Eye 是一个简单易用的事件驱动模式库。 Read me in English ?? 功能特性 敬请期待。。。 历史版本的特性请查看 HISTOR

Jan 17, 2022
A pluggable backend API that enforces the Event Sourcing Pattern for persisting & broadcasting application state changes
A pluggable backend API that enforces the Event Sourcing Pattern for persisting & broadcasting application state changes

A pluggable "Application State Gateway" that enforces the Event Sourcing Pattern for securely persisting & broadcasting application state ch

Nov 1, 2022
A pluggable backend API that enforces the Event Sourcing Pattern for persisting & broadcasting application state changes
A pluggable backend API that enforces the Event Sourcing Pattern for persisting & broadcasting application state changes

A pluggable "Application State Gateway" that enforces the Event Sourcing Pattern for securely persisting & broadcasting application state changes

Nov 1, 2022
CQRS & Event-Sourcing Framework for Go.

goes - Event-Sourcing Framework goes is a collection of interfaces, tools, and backend implementations that allow you to write event-sourced applicati

Dec 27, 2022
Build event-driven and event streaming applications with ease

Commander ?? Commander is Go library for writing event-driven applications. Enabling event sourcing, RPC over messages, SAGA's, bidirectional streamin

Dec 19, 2022
KEDA is a Kubernetes-based Event Driven Autoscaling component. It provides event driven scale for any container running in Kubernetes
 KEDA is a Kubernetes-based Event Driven Autoscaling component. It provides event driven scale for any container running in Kubernetes

Kubernetes-based Event Driven Autoscaling KEDA allows for fine-grained autoscaling (including to/from zero) for event driven Kubernetes workloads. KED

Jan 7, 2023
gevent imply go-event which tries to make event handling easier.

gevent imply go-event which tries to make event handling easier. What does gevent want to do Async execute jobs safely without too many go routines. S

Nov 10, 2021
Go-serverless-eth-event-listener - Go serverless, ethereum contract event listener with a sample contract

go-serverless-eth-event-listener This repository is for showing how to listen sm

May 19, 2022
Govent is an event bus framework for DDD event source implement

Govent is an event bus framework for DDD event source implement. Govent can also solve the package circular dependency problem.

Jan 28, 2022
Event-planning-go - GRAPHQL Project for Event Planning

About The Project GRAPHQL Project for Event Planning Building the project with l

Mar 13, 2022
Go-Guardian is a golang library that provides a simple, clean, and idiomatic way to create powerful modern API and web authentication.

❗ Cache package has been moved to libcache repository Go-Guardian Go-Guardian is a golang library that provides a simple, clean, and idiomatic way to

Dec 23, 2022
Package goth provides a simple, clean, and idiomatic way to write authentication packages for Go web applications.

Goth: Multi-Provider Authentication for Go Package goth provides a simple, clean, and idiomatic way to write authentication packages for Go web applic

Dec 29, 2022
Idiomatic Go input parsing with subcommands, positional values, and flags at any position. No required project or package layout and no external dependencies.
Idiomatic Go input parsing with subcommands, positional values, and flags at any position. No required project or package layout and no external dependencies.

Sensible and fast command-line flag parsing with excellent support for subcommands and positional values. Flags can be at any position. Flaggy has no

Jan 1, 2023
Command line tool to generate idiomatic Go code for SQL databases supporting PostgreSQL, MySQL, SQLite, Oracle, and Microsoft SQL Server

About xo xo is a command-line tool to generate Go code based on a database schema or a custom query. xo works by using database metadata and SQL intro

Jan 8, 2023
csvutil provides fast and idiomatic mapping between CSV and Go (golang) values.
csvutil provides fast and idiomatic mapping between CSV and Go (golang) values.

csvutil Package csvutil provides fast and idiomatic mapping between CSV and Go (golang) values. This package does not provide a CSV parser itself, it

Jan 6, 2023
idiomatic codec and rpc lib for msgpack, cbor, json, etc. msgpack.org[Go]

go-codec This repository contains the go-codec library, the codecgen tool and benchmarks for comparing against other libraries. This is a High Perform

Dec 19, 2022