{"id":33179176,"url":"https://github.com/lalithsuresh/rapid","last_synced_at":"2025-12-25T10:38:10.902Z","repository":{"id":53311472,"uuid":"77005273","full_name":"lalithsuresh/rapid","owner":"lalithsuresh","description":"Rapid is a scalable distributed membership service","archived":false,"fork":false,"pushed_at":"2023-07-05T20:56:30.000Z","size":3299,"stargazers_count":134,"open_issues_count":5,"forks_count":19,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-07-18T14:02:46.687Z","etag":null,"topics":["distributed-systems","failure-detection","membership-management","strong-consistency"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lalithsuresh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-12-21T01:34:55.000Z","updated_at":"2025-07-08T16:15:01.000Z","dependencies_parsed_at":"2022-09-02T04:13:36.730Z","dependency_job_id":null,"html_url":"https://github.com/lalithsuresh/rapid","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/lalithsuresh/rapid","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lalithsuresh%2Frapid","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lalithsuresh%2Frapid/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lalithsuresh%2Frapid/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lalithsuresh%2Frapid/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lalithsuresh","download_url":"https://codeload.github.com/lalithsuresh/rapid/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lalithsuresh%2Frapid/sbom","scorecard":{"id":577646,"data":{"date":"2025-08-11","repo":{"name":"github.com/lalithsuresh/rapid","commit":"c7edd6c26d2e7bc6aa311b16ba567da3868fb44c"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.1,"checks":[{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"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":"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":"Code-Review","score":3,"reason":"Found 8/26 approved changesets -- score normalized to 3","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":"Dangerous-Workflow","score":-1,"reason":"no workflows found","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":"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":"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":"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: Apache License 2.0: 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":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"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":"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":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"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 16 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":"28 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-4jrv-ppp4-jm57","Warn: Project is vulnerable to: GHSA-4gg5-vx3j-xwc7","Warn: Project is vulnerable to: GHSA-735f-pc8j-v9w8","Warn: Project is vulnerable to: GHSA-77rm-9x9h-xj3g","Warn: Project is vulnerable to: GHSA-g5ww-5jh7-63cx","Warn: Project is vulnerable to: GHSA-h4h5-3hr4-j3g2","Warn: Project is vulnerable to: GHSA-wrvw-hg22-4m67","Warn: Project is vulnerable to: GHSA-9vjp-v76f-g363","Warn: Project is vulnerable to: GHSA-grg4-wf29-r9vv","Warn: Project is vulnerable to: GHSA-269q-hmxg-m83q","Warn: Project is vulnerable to: GHSA-5jpm-x58v-624v","Warn: Project is vulnerable to: GHSA-5mcr-gq6c-3hq2","Warn: Project is vulnerable to: GHSA-cqqj-4p63-rrmm","Warn: Project is vulnerable to: GHSA-wx5j-54mm-rqqq","Warn: Project is vulnerable to: GHSA-f256-j965-7f32","Warn: Project is vulnerable to: GHSA-prj3-ccx8-p6x4","Warn: Project is vulnerable to: GHSA-wm47-8v5p-wjpj","Warn: Project is vulnerable to: GHSA-xpw8-rcwv-8f8p","Warn: Project is vulnerable to: GHSA-389x-839f-4rhx","Warn: Project is vulnerable to: GHSA-xq3w-v528-46rv","Warn: Project is vulnerable to: GHSA-6mjq-h674-j845","Warn: Project is vulnerable to: GHSA-mm9x-g8pc-w292","Warn: Project is vulnerable to: GHSA-p2v9-g2qv-p635","Warn: Project is vulnerable to: GHSA-2qrg-x229-3v8q","Warn: Project is vulnerable to: GHSA-65fg-84f6-3jq3","Warn: Project is vulnerable to: GHSA-f7vh-qwp3-x37m","Warn: Project is vulnerable to: GHSA-fp5r-v3w9-4333","Warn: Project is vulnerable to: GHSA-w9p3-5cr8-m3jj"],"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-20T18:16:10.173Z","repository_id":53311472,"created_at":"2025-08-20T18:16:10.173Z","updated_at":"2025-08-20T18:16:10.173Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28026948,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-25T02:00:05.988Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["distributed-systems","failure-detection","membership-management","strong-consistency"],"created_at":"2025-11-16T03:00:36.826Z","updated_at":"2025-12-25T10:38:10.895Z","avatar_url":"https://github.com/lalithsuresh.png","language":"Java","funding_links":[],"categories":["分布式开发"],"sub_categories":[],"readme":"[![CircleCI](https://circleci.com/gh/lalithsuresh/rapid.svg?style=svg)](https://circleci.com/gh/lalithsuresh/rapid) [![codecov](https://codecov.io/gh/lalithsuresh/rapid/branch/master/graph/badge.svg)](https://codecov.io/gh/lalithsuresh/rapid)\n\nWhat is Rapid?\n==============\n\nRapid is a distributed membership service. It allows a set of processes to\neasily form clusters and receive notifications when the membership changes.\n\nWe observe that datacenter failure scenarios are not always crash failures, but\ncommonly involve misconfigured firewalls, one-way connectivity loss, flip-flops\nin reachability, and some-but-not-all packets being dropped. However, existing\nmembership solutions struggle with these common failure scenarios, despite\nbeing able to cleanly detect crash faults. In particular, existing tools take\nlong to, or never converge to, a stable state where the faulty processes are\nremoved.\n\nTo address the above challenge, we present Rapid, a scalable, distributed\nmembership system that is stable in the face of a diverse range of failure\nscenarios, and provides participating processes a strongly consistent view of\nthe system's membership.\n\n\n\nHow does Rapid work?\n====================\n\nRapid achieves its goals through the following three building blocks:\n\n* **Expander-based monitoring edge overlay.** To scale monitoring load, Rapid\norganizes a set of processes (a *configuration*) into a stable failure\ndetection topology comprising *observers* that monitor and disseminate reports\nabout their communication edges to their *subjects*.  The monitoring\nrelationships between processes forms a directed expander graph with strong\nconnectivity properties, which ensures with a high probability that healthy\nprocesses detect failures.  We interpret multiple reports about a subject's\nedges as a high-fidelity signal that the subject is faulty.\n\n* **Multi-process cut detection.** For stability, processes in Rapid (i)\nsuspect a faulty process *p* only upon receiving alerts from multiple observers\nof *p*, and (ii) delay acting on alerts about different processes until the\nchurn stabilizes, thereby converging to detect a global, possibly multi-node\n*cut* of processes to add or remove from the membership.  This filter is\nremarkably simple to implement, yet it suffices by itself to achieve\n*almost-everywhere agreement* -- unanimity among a large fraction of processes\nabout the detected cut.\n\n* **Practical consensus.** For consistency, we show that converting\nalmost-everywhere agreement into full agreement is practical even in\nlarge-scale settings. Rapid's consensus protocol drives configuration changes\nby a low-overhead, leaderless protocol in the common case: every process simply\nvalidates consensus by counting the number of identical cut detections.  If\nthere is a quorum containing three-quarters of the membership set with the same\ncut, then without a leader or further communication, this is a safe consensus\ndecision.\n\n\nPluggable failure detectors\n===========================\n\nA powerful feature of Rapid is that it allows users to use custom failure\ndetectors. By design, users inform Rapid how an observer *o* can announce its\nmonitoring edge to a subject *s* as faulty by implementing a simple interface\n(`IEdgeFailureDetectorFactory`). Rapid builds the expander-based monitoring\noverlay using the user-supplied template for a monitoring edge.\n\n\nPluggable messaging\n===================\n\nWhen embedding a membership service in a larger system, there is no reason\nfor the membership service to use its own messaging implementation. For\nthis reason, Rapid also allows users to plugin their own messaging \nimplementations by implementing two interfaces, `IMessagingClient` and\n`IMessagingServer`. To see example usage, have a look at \n`examples/src/main/.../AgentWithNettyMessaging.java`.\n\n\nWhere can I read more?\n======================\n\nWe suggest you start with our [USENIX ATC 2018 paper](https://www.usenix.org/conference/atc18/presentation/suresh).\nThe paper and an accompanying tech report are both available in the `docs` folder.\n\n\nHow do I use Rapid?\n===================\n\nClone this repository and install rapid into your local maven repository:\n\n```shell\n   $: mvn install\n```\n\nIf your project uses maven, add the following dependency into your project's pom.xml:\n\n```xml\n  \u003cdependency\u003e\n     \u003cgroupId\u003ecom.github.lalithsuresh\u003c/groupId\u003e\n     \u003cartifactId\u003erapid\u003c/artifactId\u003e\n     \u003cversion\u003e0.8.0\u003c/version\u003e\n  \u003c/dependency\u003e\n```\n\nFor a simple example project that uses Rapid's APIs, see `examples/`.\n\n\nRunning Rapid\n=============\n\nFor the following steps, ensure that you've built or installed Rapid:\n\n```shell\n  $: mvn package  # or mvn install\n```\n\nTo launch a simple Rapid-based agent, run the following commands in your shell\nfrom the top-level directory:\n\n```shell\n  $: java -jar examples/target/standalone-agent.jar \\ \n          --listenAddress 127.0.0.1:1234 \\\n          --seedAddress 127.0.0.1:1234\n```\n\nFrom two other terminals, try adding a few more nodes on different listening\naddresses, but using the same seed address of \"127.0.0.1:1234\". For example:\n\n```shell\n  $: java -jar examples/target/standalone-agent.jar \\ \n          --listenAddress 127.0.0.1:1235 \\\n          --seedAddress 127.0.0.1:1234\n\n  $: java -jar examples/target/standalone-agent.jar \\\n          --listenAddress 127.0.0.1:1236 \\\n          --seedAddress 127.0.0.1:1234\n```\n\nOr use the following script to start multiple agents in the background that\nbootstrap via node 127.0.0.1:1234.\n\n```bash\n  #! /bin/bash\n  for each in `seq 1235 1245`;\n  do\n        java -jar examples/target/standalone-agent.jar \\\n             --listenAddress 127.0.0.1:$each \\\n             --seedAddress 127.0.0.1:1234 \u0026\u003e /tmp/rapid.$each \u0026\n  done\n```\n\n\nTo run the `AgentWithNettyMessaging` example, replace `standalone-agent.jar`\nin the above commands with `netty-based-agent.jar`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flalithsuresh%2Frapid","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flalithsuresh%2Frapid","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flalithsuresh%2Frapid/lists"}