{"id":38485157,"url":"https://github.com/pioardi/ring-election","last_synced_at":"2026-01-17T05:34:54.437Z","repository":{"id":34855802,"uuid":"154375408","full_name":"pioardi/ring-election","owner":"pioardi","description":"A node js library with a distributed leader/follower algorithm ready to be used","archived":false,"fork":false,"pushed_at":"2023-01-23T21:55:33.000Z","size":3763,"stargazers_count":117,"open_issues_count":22,"forks_count":6,"subscribers_count":12,"default_branch":"develop","last_synced_at":"2025-09-13T15:25:22.353Z","etag":null,"topics":["algorithm","cluster","concurrency","distributed-lock","distributed-systems","driver","frequency","hearth-beat","javascript","javascript-library","leader","leader-election","leader-node","monitoring","nodejs","partition","partitioning","ring","ring-election","scalability"],"latest_commit_sha":null,"homepage":"https://medium.com/@alessandroardizio94/how-to-build-high-available-fault-tolerant-services-in-node-js-25a3785b2e46","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pioardi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"ko_fi":"pioardi"}},"created_at":"2018-10-23T18:12:39.000Z","updated_at":"2025-02-18T09:04:36.000Z","dependencies_parsed_at":"2023-02-13T03:40:19.492Z","dependency_job_id":null,"html_url":"https://github.com/pioardi/ring-election","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/pioardi/ring-election","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pioardi%2Fring-election","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pioardi%2Fring-election/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pioardi%2Fring-election/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pioardi%2Fring-election/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pioardi","download_url":"https://codeload.github.com/pioardi/ring-election/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pioardi%2Fring-election/sbom","scorecard":{"id":734634,"data":{"date":"2025-08-11","repo":{"name":"github.com/pioardi/ring-election","commit":"e9b7116be6b4b8baba15937ceb6116b7cc169ddc"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.9,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/1 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Warn: no topLevel permission defined: .github/workflows/npmpublish.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Pinned-Dependencies","score":2,"reason":"dependency not pinned by hash detected -- score normalized to 2","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/pioardi/ring-election/ci.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/pioardi/ring-election/ci.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npmpublish.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/pioardi/ring-election/npmpublish.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npmpublish.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/pioardi/ring-election/npmpublish.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npmpublish.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/pioardi/ring-election/npmpublish.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npmpublish.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/pioardi/ring-election/npmpublish.yml/develop?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating node:12-alpine to node:12-alpine@sha256:d4b15b3d48f42059a15bd659be60afe21762aae9d6cbea6f124440895c27db68","Warn: npmCommand not pinned by hash: Dockerfile:13","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned","Info:   3 out of   4 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during GetBranch(master): error during branchesHandler.query: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 29 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"38 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-fwr7-v2mv-hh25","Warn: Project is vulnerable to: GHSA-qwcr-r2fm-qrc7","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-257v-vj4p-3w2h","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-h452-7996-h45h","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-ww39-953v-wcq6","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-qrpm-p2h7-hrv2","Warn: Project is vulnerable to: GHSA-mwcw-c2x4-8c55","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-22T15:24:45.756Z","repository_id":34855802,"created_at":"2025-08-22T15:24:45.756Z","updated_at":"2025-08-22T15:24:45.756Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28500156,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T04:31:57.058Z","status":"ssl_error","status_checked_at":"2026-01-17T04:31:45.816Z","response_time":85,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["algorithm","cluster","concurrency","distributed-lock","distributed-systems","driver","frequency","hearth-beat","javascript","javascript-library","leader","leader-election","leader-node","monitoring","nodejs","partition","partitioning","ring","ring-election","scalability"],"created_at":"2026-01-17T05:34:53.307Z","updated_at":"2026-01-17T05:34:54.427Z","avatar_url":"https://github.com/pioardi.png","language":"JavaScript","funding_links":["https://ko-fi.com/pioardi"],"categories":[],"sub_categories":[],"readme":"# Ring election :sparkles:  :dizzy:\n\n\u003cstrong\u003eIs your dream to build a service like cassandra,kafka,zipkin,jaeger,redis,etc...? You are in the right place , join ring-election project !!! \u003c/strong\u003e \u003cbr\u003e\n\n\u003cdiv align=\"left\"\u003e\n   \u003cimg src=\"doc/logo.png\" width=\"300\" height=\"250\"/\u003e\n\u003c/div\u003e\n\n[![Coverage Status](https://coveralls.io/repos/github/pioardi/ring-election/badge.svg?branch=master)](https://coveralls.io/github/pioardi/ring-election?branch=master)\n[![Actions Status](https://github.com/pioardi/ring-election/workflows/Node%20CI/badge.svg)](https://github.com/pioardi/ring-election/actions)\n[![Actions Status](https://flat.badgen.net/dependabot/dependabot/dependabot-core/?icon=dependabot)](https://flat.badgen.net/dependabot/dependabot/dependabot-core/?icon=dependabot)\n[![Codacy Badge](https://api.codacy.com/project/badge/Grade/9eaceda32d104341879e3ece48595d1b)](https://www.codacy.com/app/alessandroardizio94/ring-election?utm_source=github.com\u0026amp;utm_medium=referral\u0026amp;utm_content=pioardi/ring-election\u0026amp;utm_campaign=Badge_Grade)\n\u003ca href=\"https://badge.fury.io/js/ring-election\"\u003e\u003cimg src=\"https://badge.fury.io/js/ring-election.svg\" alt=\"npm version\" height=\"18\"\u003e\u003c/a\u003e\n[![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/ring-election)\u003cbr\u003e\n[![JavaScript Style Guide](https://cdn.rawgit.com/standard/standard/master/badge.svg)](https://github.com/standard/standard)\n\n\u003ch2\u003eContents \u003c/h2\u003e\n\u003ch3 align=\"center\"\u003e\n  \u003ca href=\"#gs\"\u003eGetting started\u003c/a\u003e\n  \u003cspan\u003e · \u003c/span\u003e\n  \u003ca href=\"#overview\"\u003eOverview\u003c/a\u003e\n  \u003cspan\u003e · \u003c/span\u003e\n  \u003ca href=\"#usecases\"\u003eUse cases\u003c/a\u003e\n  \u003cspan\u003e · \u003c/span\u003e\n  \u003ca href=\"#config\"\u003eConfig\u003c/a\u003e\n  \u003cspan\u003e · \u003c/span\u003e\n  \u003ca href=\"#config\"\u003eConfig\u003c/a\u003e\n  \u003cspan\u003e · \u003c/span\u003e\n  \u003ca href=\"#monitoring\"\u003eMonitoring\u003c/a\u003e\n  \u003cspan\u003e · \u003c/span\u003e\n  \u003ca href=\"#hld\"\u003eHigh level design\u003c/a\u003e\n  \u003cspan\u003e · \u003c/span\u003e\n  \u003ca href=\"#contribute\"\u003eContribute\u003c/a\u003e\n  \u003cspan\u003e · \u003c/span\u003e\n  \u003ca href=\"#versioning\"\u003eVersioning\u003c/a\u003e\n  \u003cspan\u003e · \u003c/span\u003e\n  \u003ca href=\"#license\"\u003eLicense\u003c/a\u003e\n\u003c/h3\u003e\n\n\u003cstrong\u003eWhat the ring-election driver offers you ?\u003c/strong\u003e\u003cbr\u003e\n\n- A default partitioner that for an object returns the partition to which it is assigned.\u003cbr\u003e\n- Mechanism of leader election\u003cbr\u003e\n- Failure detection between nodes.\u003cbr\u003e\n- Assignment and rebalancing of partitions between nodes\u003cbr\u003e\n- Automatic re-election of the leader\u003cbr\u003e\n- Listen for new assigned/revoked partitions \u003cbr\u003e\n\n\u003cstrong\u003eWhat problems can you solve with this driver ?\u003c/strong\u003e\u003cbr\u003e\n- Scalability\u003cbr\u003e\n- High availability\u003cbr\u003e\n- Concurrency between nodes in a cluster\u003cbr\u003e\n- Automatic failover\u003cbr\u003e\n\n\u003ch2 id=\"gs\"\u003eGetting started\u003c/h2\u003e\n\u003cstrong\u003e Install with npm ! \u003c/strong\u003e\n\n```bash\n  npm i ring-election --save\n```\n\n\u003cstrong\u003eExample\u003c/strong\u003e\nYou do not need to choose a node as leader , just indicate all your nodes and start everyone as follower.\u003cbr\u003e\nThe first node to start will be the leader , the leader do not have assigned partitions so try to start 2 instances after your integration\u003cbr\u003e\n\n\u003cstrong\u003eHow to integrate\u003c/strong\u003e\u003cbr\u003e\n\n```javascript\nconst ring = require('ring-election')\nlet follower = ring.follower\nconst {\n  BECOME_LEADER,\n  PARTITIONS_ASSIGNED,\n  PARTITIONS_REVOKED\n} = ring.constants;\nfollower.createClient()\n// if you want REST API as monitoring , invoke startMonitoring\nfollower.startMonitoring()\n// to get ring info\nring.follower.ring()\n// to get assigned partitions\nlet assignedPartitions = ring.follower.partitions()\n// now let me assume that a follower will create some data\n// and you want to partition this data\nlet partition = ring.follower.defaultPartitioner('KEY')\n// save your data including the partition on a storage\n// you will be the only one in the cluster working on the partitions assigned to you.\n\n// If you want to handle partitions assigned\n// ( use other constants to listen other events ) you can do in this way.\nring.follower.eventListener.on(PARTITIONS_ASSIGNED , (newAssignedPartitions) =\u003e {\n   // DO STUFF\n})\n```\n\n\n\u003cstrong\u003eStart your development cluster\u003c/strong\u003e\u003cbr\u003e\n\nYou will find some helpful files into the dev folder , please see the following video \u003cbr\u003e\n\n[Watch the video](https://www.youtube.com/embed/5keF_OVXGLM?controls=0)\n\n\nCheck assigned partitions to local:9000/status or change the port to 9001/9002 \u003cbr\u003e\n\n\nTry to stop and restart processes and observe the behaviour.\u003cbr\u003e\n\u003ch2 id=\"overview\"\u003eOverview and rationale\u003c/h2\u003e\nIn modern systems it is often needed to distribute the application load to make the system scalable so that every data is processed by a single instance. \u003cbr\u003e\nRing-election is a driver that implements a distributed algorithm that assigns to each node the partitions to work on .\nIn a simple use case each node can obtain data that are part of the partitions of which it is owner and work on them. \u003cbr\u003e\nThe algorithm will assign to each node one or more partitions to work with.\u003cbr\u003e\nA node will be removed if it does not send an heart beat for a while , this process is called heart check.\u003cbr\u003e\nEach node in the ring will have an ID and a priority , if the leader node will die the node with lower priority will be elect as leader. \u003cbr\u003e\nIf a node is added or removed from the cluster, the allocated partitions will be rebalanced.\n\n\n   \n\u003ch2 id=\"usecases\"\u003eUse cases\u003c/h2\u003e\n\nThis section introduce you on what you can build on top of ring-election using it as driver/library. \u003cbr\u003e\n\n\u003cstrong\u003eDistributed Scheduler\u003c/strong\u003e\u003cbr\u003e\nEach Scheduler instance will work on the assigned partitions .\u003cbr\u003e\nA real implementation of this use case is available here https://github.com/pioardi/hurricane-scheduler \u003cbr\u003e\n![Dynamic diagram](doc/Ring-Scheduler-Use-Case.jpg)\n\n\n\u003cstrong\u003eDistributed lock\u003c/strong\u003e\u003cbr\u003e\n\u003cstrong\u003eDistributed cache\u003c/strong\u003e\u003cbr\u003e\n\u003cstrong\u003eDistributed computing\u003c/strong\u003e\u003cbr\u003e   \n\n\n\n\u003cstrong\u003e Try it out ! \u003c/strong\u003e\n```bash\n   docker image build -t ring-election .\n   docker-compose up\n```\n\n\u003ch2 id=\"config\"\u003e Configuration \u003c/h2\u003e\n \u003cstrong\u003ePORT\u003c/strong\u003e : The leader will start to listen on this port , default is 3000 \u003cbr\u003e\n  \u003cstrong\u003eTIME_TO_RECONNECT\u003c/strong\u003e: The time to wait for a follower when he has to connect to a new leader in ms , default is 3000ms \u003cbr\u003e\n  \u003cstrong\u003eHEART_BEAT_FREQUENCY\u003c/strong\u003e: The frequency with which a heart beat is performed by a follower , default is 1000ms \u003cbr\u003e\n  \u003cstrong\u003eHEART_BEAT_CHECK_FREQUENCY\u003c/strong\u003e: The frequency with which an heart check is performed by a leader , default is 3000ms \u003cbr\u003e\n  \u003cstrong\u003eLOG_LEVEL\u003c/strong\u003e: Follow this https://www.npmjs.com/package/winston#logging-levels , default is info.\u003cbr\u003e\n  \u003cstrong\u003eNUM_PARTITIONS\u003c/strong\u003e: Number of partitions to distribute across the cluster , default is 10. \u003cbr\u003e\n  \u003cstrong\u003eSEED_NODES\u003c/strong\u003e : hostnames and ports of leader node comma separated, Ex . hostname1:port,hostname2:port \u003cbr\u003e\n  \u003cstrong\u003eMONITORING_PORT\u003c/strong\u003e : port to expose rest service for monitoring , default is 9000\u003cbr\u003e\n\n\u003ch2 id=\"monitoring\"\u003e Monitoring API \u003c/h2\u003e\nTo monitor your cluster contact any node on the path /status (HTTP verb :  GET) or contact a follower node on /partitions (HTTP verb :  GET). \u003cbr\u003e\n\n\u003ch2 id=\"hld\"\u003eHigh Level Diagram\u003c/h2\u003e\n\nSee \u003ca href=\"https://github.com/pioardi/ring-election/wiki/How-work-under-the-hood\"\u003ewiki\u003c/a\u003e page.\n\n\u003ch2 id=\"contribute\"\u003eHow to contribute\u003c/h2\u003e\n\nSee contributing guidelines [CONTRIBUTING](./CONTRIBUTING.md)\n\n\n\u003ch2 id=\"versioning\"\u003eVersioning\u003c/h2\u003e\nWe use (http://semver.org/) for versioning.\n\n\u003ch2 id=\"license\"\u003eLicense\u003c/h2\u003e\nThis project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpioardi%2Fring-election","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpioardi%2Fring-election","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpioardi%2Fring-election/lists"}