gossip
Version, currently main branch1 version
- main branchlatestJun 25, 2025
github.com/wyhaines/gossip.cr
An efficient, fault tolerant gossip protocol implementation for Crystal.
Installation
# Add this to your shard.yml
dependencies:
gossip:
github: wyhaines/gossip.cr
branch: mainmain is a branch, not a release, so this tracks it rather than pinning a version.
Then run:
shards installshard.yml
- Crystal
>= 1.15.1- License
- MIT
- Author
- Kirk Haines
Dependencies
This version declares no dependencies.
README
gossip.cr
A robust, efficient, and fault-tolerant gossip protocol implementation for Crystal.
Overview
gossip.cr provides a modular, reliable implementation of gossip protocols for distributed systems. It enables peer-to-peer communication between nodes in a network with the following features:
- Decentralized: No single point of failure or central coordination
- Fault-tolerant: Resilient against node failures and network partitions
- Scalable: Efficiently handles adding and removing nodes dynamically
- Self-healing: Automatically recovers from failures
- Guaranteed Delivery: Ensures messages reach all nodes despite failures
Algorithms & Design
This library implements several key protocols:
HyParView Membership Protocol
The foundation of the network is built on the HyParView protocol, which maintains two views per node:
- Active View: A small set of nodes with direct connections
- Passive View: A larger set of nodes kept as backups
This approach provides both efficiency and resilience. When nodes in the active view fail, they are replaced with nodes from the passive view, ensuring the network remains connected.
Plumtree Broadcast Protocol
For reliable broadcast, gossip.cr implements the Plumtree (Push-Lazy-Push Multicast Tree) algorithm which:
- Constructs an efficient spanning tree for eager push dissemination
- Uses lazy push for redundancy to recover from failures
- Adaptively optimizes the tree as the network evolves
Message Acknowledgment & Recovery
To ensure reliability, the system:
- Tracks missing messages through lazy push notifications
- Requests full message content from peers when missing messages are detected
- Implements heartbeats to detect node failures
Installation
Add this to your application's shard.yml:
dependencies:
gossip:
github: wyhaines/gossip.cr
Then run:
shards install
Basic Usage
Creating a Node
require "gossip"
# Create a node
address = NodeAddress.new("localhost", 7001, "node1@localhost:7001")
network = NetworkNode.new(address)
node = Node.new("node1@localhost:7001", network)
# Start accepting connections
# Network operations are handled asynchronously in fibers
Joining an Existing Network
# Join an existing network through a bootstrap node
join_msg = Join.new(my_node_id)
network.send_message("bootstrap_node@hostname:port", join_msg)
Broadcasting Messages
# Send a message to all nodes in the network
message_id = node.broadcast("Hello, network!")
Extending Node Behavior
You can extend the Node class to customize message handling:
class MyCustomNode < Node
def handle_broadcast(message : BroadcastMessage)
# Custom message handling logic
puts "Received message: #{message.content} from #{message.sender}"
# Call super to maintain the gossip protocol's default behavior
super
end
end
Configuration
Key configuration parameters can be adjusted in src/protocol/config.cr:
module Config
# View sizes
MAX_ACTIVE = 5 # Max connections in active view
MAX_PASSIVE = 10 # Max nodes in passive view
# Message propagation
LAZY_PUSH_PROB = 0.05 # Probability of using lazy push
# Timing settings
SHUFFLE_INTERVAL = 5.0 # Seconds between shuffles
HEARTBEAT_INTERVAL = 2.0 # Seconds between heartbeats
end
Examples
The repository includes several examples:
- demo.cr: Interactive demo with terminal UI
- network_test.cr: Basic network connectivity testing
- integration_test.cr: Comprehensive integration tests
To run the demo:
# Terminal 1: Start bootstrap node
crystal run examples/demo.cr bootstrap
# Terminal 2: Join network with second node
crystal run examples/demo.cr join 7002 node2
Project Structure
src/
├── gossip.cr # Main entry point
├── messages/ # Message type definitions
│ ├── base.cr
│ ├── broadcast.cr
│ ├── membership.cr
│ └── heartbeat.cr
├── network/ # Network communication
│ ├── address.cr
│ └── node.cr
├── protocol/ # Protocol implementation
│ ├── config.cr
│ ├── node.cr
│ └── handlers.cr
└── debug.cr # Debug utilities
Testing
Run the test suite:
crystal spec
Integration tests demonstrate reliable message delivery, recovery from node failures, and handling of network partitions.
Performance Considerations
- Message Size: Keep broadcast messages reasonably sized for efficient propagation
- Network Size: The protocol is most efficient with 5-50 nodes; for larger networks, consider hierarchical structures
- Timing Parameters: Adjust shuffle and heartbeat intervals based on network stability and message frequency
Contributing
- Fork it (https://github.com/wyhaines/gossip.cr/fork)
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create a new Pull Request
License
This project is available under the Apache 2.0 License. See the LICENSE file for details.
Documentation
Built from the current release. The first visit to a release nobody has asked for starts its build.
Links
This branch
- Branch
main- Seen
- Jun 25, 2025
- Crystal
>= 1.15.1- Indexed
- yes
Dependents
No indexed shard depends on this one yet.
Repository
github.com/wyhaines/gossip.cr
Metadata
- Created
- Aug 12, 2026
- Updated
- Aug 15, 2026
- Synced
- Aug 15, 2026
- Versions
- 1