All Projects → younisshah → jakob

younisshah / jakob

Licence: other
A fault-tolerant, distributed cluster of Redis servers with built-in load-balancing and fall-backs to provide data availability

Programming Languages

go
31211 projects - #10 most used programming language

Projects that are alternatives of or similar to jakob

raftor
Distributed chat system built with rust
Stars: ✭ 31 (+63.16%)
Mutual labels:  distributed-systems, cluster
Nebula
Nebula is a powerful framwork for building highly concurrent, distributed, and resilient message-driven applications for C++.
Stars: ✭ 385 (+1926.32%)
Mutual labels:  distributed-systems, cluster
ring-election
A node js library with a distributed leader/follower algorithm ready to be used
Stars: ✭ 92 (+384.21%)
Mutual labels:  distributed-systems, cluster
Scalecube Services
ScaleCube Services is a high throughput, low latency reactive microservices library built to scale. it features: API-Gateways, service-discovery, service-load-balancing, the architecture supports plug-and-play service communication modules and features. built to provide performance and low-latency real-time stream-processing. its open and designed to accommodate changes. (no sidecar in a form of broker or any kind)
Stars: ✭ 482 (+2436.84%)
Mutual labels:  distributed-systems, cluster
Rsf
已作为 Hasor 的子项目,迁移到:http://git.oschina.net/zycgit/hasor
Stars: ✭ 77 (+305.26%)
Mutual labels:  distributed-systems, cluster
Fluentdispatch
🌊 .NET Standard 2.1 framework which makes easy to scaffold distributed systems and dispatch incoming load into units of work in a deterministic way.
Stars: ✭ 152 (+700%)
Mutual labels:  distributed-systems, cluster
Diplomat
A HTTP Ruby API for Consul
Stars: ✭ 358 (+1784.21%)
Mutual labels:  distributed-systems, cluster
Kubernetes Gpu Guide
This guide should help fellow researchers and hobbyists to easily automate and accelerate there deep leaning training with their own Kubernetes GPU cluster.
Stars: ✭ 740 (+3794.74%)
Mutual labels:  distributed-systems, cluster
Dbfs
Distributed Blockchain-based File Storage 📡
Stars: ✭ 45 (+136.84%)
Mutual labels:  distributed-systems, cluster
Jupiter
Jupiter是一款性能非常不错的, 轻量级的分布式服务框架
Stars: ✭ 1,372 (+7121.05%)
Mutual labels:  distributed-systems, cluster
skyring
Distributed timers as a service - for Node.js
Stars: ✭ 27 (+42.11%)
Mutual labels:  distributed-systems, cluster
moosefs-csi
Container Storage Interface (CSI) for MooseFS
Stars: ✭ 44 (+131.58%)
Mutual labels:  cluster
slock
High-performance distributed sync service and atomic DB
Stars: ✭ 50 (+163.16%)
Mutual labels:  cluster
Garfield
An offensive attack framework for Distributed Layer of Modern Applications
Stars: ✭ 74 (+289.47%)
Mutual labels:  distributed-systems
Example
Metarhia application example for Node.js
Stars: ✭ 147 (+673.68%)
Mutual labels:  cluster
face-cluster-by-infomap
face-cluster-by-infomap 一种无监督人脸聚类方法,在开源数据集上取得SOTA效果
Stars: ✭ 122 (+542.11%)
Mutual labels:  cluster
braid-go
简单易用的微服务框架 | Ease used microservice framework
Stars: ✭ 34 (+78.95%)
Mutual labels:  distributed-systems
skein
A tool and library for easily deploying applications on Apache YARN
Stars: ✭ 128 (+573.68%)
Mutual labels:  cluster
fabric
Fabric is an experimental protocol for exchanging information.
Stars: ✭ 46 (+142.11%)
Mutual labels:  distributed-systems
viewstamped-replication-made-famous
A $20k consensus challenge based on TigerBeetle's implementation of the pioneering Viewstamped Replication protocol.
Stars: ✭ 93 (+389.47%)
Mutual labels:  distributed-systems

jakob

Jakob is fault-tolerant, distributed cluster of Redis servers with built-in load-balancing and fall-backs to provide data availability. Jakob is specifically meant to start a cluster of Tile38 servers to store geo-spatial data.

Jakob relies on Apache Kafka to store the logs and for log replication. It also relies on the amazing Machinery to sync data(logs) between servers in background. Jakob's Machinery setup uses RabbitMQ as broker and Redis as result-backend.

Jakob has two types of servers - setters and getters.

A setter server will receive all the Tile38 setter commands like (SET, NEARBY, FENCE, etc), while a getter server will always receive Tile38 getter commands like (GET, MATCH, etc).

The two clusters are servers are arranged in a consistent-hashed ring. A setter or getter server is selected using consistent hashing.

It just exposes two HTTP endpoints. Both of them are POST HTTP endpoints.

Endpoint Purpose Data
/init initializes the cluster with a setter and getter peer e.g., {"setter": "setter:8080", "getter":"getter:8081"}
/join joins the cluster with a setter and getter peer e.g., {"setter": "setter:9000", "getter":"getter:9001"}

Installation:

go get -u github.com/younisshah/jakob

or using glide

glide get github.com/younisshah/jakob

and then glide up

Next install and start Apache Kafka. Refer to this for a quick start. Apache Kafka Quick Start. Download and install RabbitMQ from here RabbitMQ. Finally download and start Redis server from here Redis.

Sample usage:

Boot jakob:

boot.Up()

Initialize the cluster, use /init

curl -X POST localhost:30000/init -d '{"setter":"localhost:9000", "getter":"localhost:9001"}'

To join a cluster, use /join

curl -X POST localhost:30000/join -d '{"setter":"localhost:9002", "getter":"localhost:9003"}'

To get a setter peer from the cluster

ring := jring.New(jfs.SETTER)
peer, err := ring.Get("some_id")
if err != nil {
    log.Println(err)
}

To get getter peer from the cluster

ring := jring.New(jfs.GETTER)
peer, err := ring.Get("some_id")
if err != nil {
    log.Println(err)
}

To send a Tile38 command to jakob

cmd = command.NewCommand(peer, "SET", "my", "home", "POINT", "12.4", "23.45")
cmd.Execute()
if cmd.Error != nil {
    log.Println(cmd.Error)
} else {
    log.Println(cmd.Result)
}
// Do something with c.Result

Pipelined SET

cmds := []string{"SET", "SET"}
a1 := []interface{}{"fleet", "home", "POINT", "12.2", "32.56"}
a2 := []interface{}{"fleet", "office", "POINT", "20.2", "52.56"}
args := []interface{}{a1, a2}
c := command.NewPipelinedCommand("localhost:9851", cmds, args)
c.PipelinedExecute()
if c.Error != nil {
    // Handle error
}
// do something with c.Result

Jakob is still in infancy which means API is subject change.


TODO

more comprehensive documentation

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].