Git Product home page Git Product logo

mewbase's Introduction

mewbase

Build Status

The problem

Many organisations now realise that it's vital to keep track of all the streams of events they produce.

Examples of streams of events might be:

  • Shopping basket events (add/remove/order) from a website
  • Events from IoT sensors
  • Stock movement events in a supply chain

These events often need to be persisted fast and in high volume and potentially stored for very long periods of time.

Storing logs of events provides many advantages including:

  • Complete audit trail of everything that happened
  • Events can be replayed to for back-testing or debugging
  • Analytics can be run on the events to extract business value
  • Machine learning models can be trained in the events to do all sorts of funky stuff
  • Events can be used to co-ordinate busines processes between different services
  • Functions can be used to implement distributed eventually consistent transactions

But many applications typically want to deal with aggregated event data, not the raw event data. Examples would include:

  • A website wants to see the current state of a shopping basket, not deal with the raw add/remove item events
  • A report needs to display average temperature from IoT sensors broken down by region in real-time
  • A stock inventory needs to maintain current stock of products per warehouse
  • A business process/saga needs to listen to events and maintain state

This leads many applications to either:

  • Not capture raw events at all - only deal with the current state of their objects - thus losing valuable business data
  • Maintain their own "views" on the event log data perhaps by subscribing to messages and updating tables or documennts in a separate database

The latter is usually implemented in an ad-hoc way for each application and requires several moving parts, and has to deal with the synchronization between events and views. What's more it means the client has to deal with accessing two separate pieces of technology - a messaging system and a database.

Introducing mewbase

Mewbase provides an engine that functions as a high performance streaming event store but also allows you to run persistent functions in the engine that listen to raw events and maintain multiple projections of the event data.

The projections can then be queried in similar way to how you would with a document or graph database.

So you can think of mewbase as combining the following:

  • An event streaming engine
  • A document/graph database
  • Functions which map events to documents

An interesting observation is, unlike a normal document database, the documents are not updated directly by clients, they are only updated in the engine by the functions.

The client simply sends events (add item to basket), and issues queries (give me current state of basket 1234). That means the client has no access to shared mutable state - a big win!

The events, functions and documents are all maintained in the same engine, mewbase keeps track of synchronization between the events and the views so you know they are always up to date, irrespective of whether any client applications or services are connected.

Since the functions run on the server, you can write them in your normal programming language - no need to learn another language like SQL. The same applies to queries.

All this functionality will be accessible over a simple wire protocol and via a simple client API which we will provide in Java, JavaScript and potentially other languages going ahead.

Mewbase engine will also be fully embeddable in any Java (or Scala, or Groovy) application so you can colocate your "server" in your actual service, or if you prefer a standalone server or cluster of servers, mewbase will support that setup too.

Mewbase is a great match for implementing event driven microservices using an event sourcing / CQRS pattern.

Mewbase will be designed from scratch to cope with very large datasets and optimised for modern storage.

Features

Some of the features / future features:

  • Multiple event logs scaling to large sizes
  • Horizontal scalability via sharding/partitioning
  • Replication
  • Event persistence
  • Transactional persistence of events
  • Transaction updates of multiple documents in same binder
  • Event subscription
  • Subscription filters
  • User defined functions
  • BSON messages
  • Persistent documents
  • Document queries
  • Event streaming
  • Document streaming
  • Simple wire protocol
  • Clients in Java, JS, Go, ...
  • Pluggable authentication and authorisation
  • TLS for connections with server + client certs
  • Metrics
  • Fully embeddable
  • Standalone option
  • Log archiving
  • Completely non blocking, and reactive APIs
  • Live persistent queries - sends more matching data to client as it arrives on server
  • Sidecars for node.js/go

Why the name "mewbase"?

"mew" is the UK pronunciation of the Greek letter μ. This letter is often used in the scientific world to represent "micro" i.e. 10^-6 or more loosely "something small". Mewbase is a great choice for event based microservices hence the connection.

Also, more importantly, "mew" is the sound made by a kitten, and it would be great to have a logo of a cute kitten for the project. (Any volunteers?)

Get involved!

This project has a lot of scope and there's a lot to do with some serious engineering challenges.

If you'd like to get involved and be a part of it, please say hi in our google group.

We also have an IRC channel for general chat on freenode: Come and say hi!

irc.freenode.net#mewbase

Roadmap

Roadmap and other pages are on the wiki

Build and run

Mewbase can be run embedded in any Java application (see examples).

It can also be run as a standalone server, to do this:

mvn clean package

This creates a distribution tar.gz and .zip in the target directory

Unzip this where you want to install the server

unzip target/mewbase-0.1-SNAPSHOT-bin.zip

Run it

mewbase-0.1-SNAPSHOT/bin/mew

Tip: put the directory mewbase-0.1-SNAPSHOT/bin on your PATH environment variable so you can run mew from anywhere.

mewbase's People

Contributors

purplefox avatar jcme avatar andyhedges avatar vladislav-kisliy avatar tkaetzel avatar ssouris-te avatar alwaysthecritic avatar myatomicmother avatar

Watchers

Anuj Gupta avatar James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.