Skip to content

fbielejec/with-kafka

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
src
 
 
 
 
 
 
 
 
 
 

with-kafka

About

This repository is a study in event sourcing and CQRS architectures. See this blog post for details. It is an implementation of a distributed calculator.

There are two commands availiable:

  • POST /values accepts {"value" : <f64>} returns HTTP/202 and an id (UUID) of the accepted value.
  • PUT /values/{id} accepts ={"operation" : <OPERATION>, "value" : 3} where OPERATION can be ADD or MULTIPLY, it returns HTTP/202

There is one query path constructed from the events:

  • GET /values/{id} returns {"value" : <current-value>}

Prerequisites

Install confluent hub client:

curl -O http://client.hub.confluent.io/confluent-hub-client-latest.tar.gz
# add to .bashrc:
export PATH="<path-to>/confluent-hub-client-latest/bin:$PATH"
# test
confluent-hub help

Architecture

[Client]

package "API" {
  package "/queries" {
  [queries]
  [subscriptions]
  }
  package "/commands" {
    [Commander]
  }
}

database "Message store" {
  folder "Retention: forever" {
    [commands topic] as ct
  }  
  [events topic] as et
  [other topics]
}

package "Command Processor" {
  [Command Handler] as CH
  database "state" {
    [Business model]
  }
}

node "Aggregate views" {
  [consumers]
  database "views" {
  }
}

Client .down.> Commander
Client .down.> subscriptions
Client .down.> queries
queries <.down. views

Commander .down.> ct : Commands 
ct ..> CH : business logic
CH ..> et : Events

et .> subscriptions

et .> consumers
consumers .> views

Development

Start docker containers:

docker-compose -f docker-compose.yml up

Start watcher

cargo watch -s "cargo run"

Send some commands:

curl -d '{"value": 2}' -H "Content-Type: application/json" -X POST http://localhost:3030/values
# => 2753b941-eb10-497c-b58c-2b3dec1eeeef
curl -d '{"operation": "ADD", "value": 2}' -H "Content-Type: application/json" -X PUT http://localhost:3030/values/2753b941-eb10-497c-b58c-2b3dec1eeeef
curl -d '{"operation": "MULTIPLY", "value": 3}' -H "Content-Type: application/json" -X PUT http://localhost:3030/values/2753b941-eb10-497c-b58c-2b3dec1eeeef

Query the materialized view:

curl -X GET -H "Content-Type: application/json" http://localhost:3030/values/2753b941-eb10-497c-b58c-2b3dec1eeeef

Releases

No releases published

Packages

No packages published