| Crates.io | rust_kafka_like |
| lib.rs | rust_kafka_like |
| version | 0.1.0 |
| created_at | 2024-12-26 15:47:20.594315+00 |
| updated_at | 2024-12-26 15:47:20.594315+00 |
| description | A Kafka-like message broker in Rust |
| homepage | |
| repository | https://github.com/mila411/rust-kafka-like |
| max_upload_size | |
| id | 1495735 |
| size | 105,019 |
This is a Rust implementation of a distributed messaging system. It uses a simple design inspired by Apache Kafka. It simply records messages to local files.
use rust_kafka_like::broker::Broker;
use rust_kafka_like::schema::registry::SchemaRegistry;
use rust_kafka_like::subscriber::types::Subscriber;
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
// Create a schema registry
let schema_registry = SchemaRegistry::new();
let schema_def = r#"{"type":"record","name":"test","fields":[{"name":"id","type":"string"}]}"#;
schema_registry.register_schema("test_topic", schema_def).unwrap();
// Create a broker
let broker = Arc::new(Mutex::new(Broker::new("broker1", 3, 2, "logs")));
// Create a topic
{
let mut broker = broker.lock().unwrap();
broker.create_topic("test_topic", None).unwrap();
}
// Create a producer
let broker_producer = Arc::clone(&broker);
let producer_handle = thread::spawn(move || {
let message = "test_message".to_string();
let mut broker = broker_producer.lock().unwrap();
broker.publish_with_ack("test_topic", message, None).unwrap();
});
// Create a consumer
let broker_consumer = Arc::clone(&broker);
let consumer_handle = thread::spawn(move || {
let subscriber = Subscriber::new(
"consumer_1",
Box::new(move |msg: String| {
println!("Consumed message: {}", msg);
}),
);
broker_consumer
.lock()
.unwrap()
.subscribe("test_topic", subscriber, Some("group1"))
.unwrap();
});
// Wait for producer and consumer to finish
producer_handle.join().unwrap();
consumer_handle.join().unwrap();
}
The system includes mechanisms for fault detection and automatic recovery. Nodes are monitored using heartbeat signals, and if a fault is detected, the system will attempt to recover automatically.
use rust_kafka_like::broker::Broker;
use std::time::Duration;
fn main() {
let broker = Broker::new("broker1", 3, 2, "logs");
// Check node health
if broker.detect_faults() {
broker.recover_node();
}
}
MIT
To execute a basic example, use the following command:
cargo run --example simple-send-recv
cargo run --example mulch-send-recv
cargo bench