mirror of
https://github.com/thilo-behnke/wasm-pong.git
synced 2026-07-12 11:09:38 +00:00
87 lines
2.9 KiB
Rust
87 lines
2.9 KiB
Rust
use std::time::Duration;
|
|
use kafka::consumer::{Consumer, FetchOffset, GroupOffsetStorage, MessageSet};
|
|
use kafka::producer::{Producer, Record, RequiredAcks};
|
|
use pong::event::event::{Event, EventReaderImpl, EventWriter, EventWriterImpl};
|
|
|
|
pub struct KafkaEventWriterImpl {
|
|
producer: Producer
|
|
}
|
|
impl KafkaEventWriterImpl {
|
|
pub fn default() -> KafkaEventWriterImpl {
|
|
KafkaEventWriterImpl::new("localhost:9092")
|
|
}
|
|
|
|
pub fn new(host: &str) -> KafkaEventWriterImpl {
|
|
let mut producer = Producer::from_hosts(vec![host.to_owned()])
|
|
.with_ack_timeout(Duration::from_secs(1))
|
|
.with_required_acks(RequiredAcks::One)
|
|
.create()
|
|
.unwrap();
|
|
KafkaEventWriterImpl {
|
|
producer
|
|
}
|
|
}
|
|
}
|
|
impl EventWriterImpl for KafkaEventWriterImpl {
|
|
fn write(&mut self, event: Event) -> Result<(), String> {
|
|
let record = Record::from_key_value(event.topic.as_str(), event.key.as_str(), event.msg.as_str());
|
|
match self.producer.send(&record) {
|
|
Ok(()) => Ok(()),
|
|
Err(e) => Err(format!("{}", e))
|
|
}
|
|
}
|
|
}
|
|
|
|
pub struct KafkaEventReaderImpl {
|
|
consumer: Consumer
|
|
}
|
|
impl KafkaEventReaderImpl {
|
|
pub fn default() -> KafkaEventReaderImpl {
|
|
KafkaEventReaderImpl::new("localhost:9092")
|
|
}
|
|
|
|
pub fn new(host: &str) -> KafkaEventReaderImpl {
|
|
let mut consumer = Consumer::from_hosts(vec![host.to_owned()])
|
|
.with_topic("move".to_owned())
|
|
.with_topic("status".to_owned())
|
|
.with_topic("input".to_owned())
|
|
.with_fallback_offset(FetchOffset::Earliest)
|
|
.with_group("group".to_owned())
|
|
.with_offset_storage(GroupOffsetStorage::Kafka)
|
|
.create()
|
|
.unwrap();
|
|
KafkaEventReaderImpl {
|
|
consumer
|
|
}
|
|
}
|
|
}
|
|
impl EventReaderImpl for KafkaEventReaderImpl {
|
|
fn read(&mut self) -> Vec<Event> {
|
|
self.consume(None, None)
|
|
}
|
|
|
|
fn read_from_topic(&mut self, topic: &str, key: &str) -> Vec<Event> {
|
|
self.consume(Some(topic), Some(key))
|
|
}
|
|
}
|
|
|
|
impl KafkaEventReaderImpl {
|
|
fn consume(&mut self, topic: Option<&str>, key: Option<&str>) -> Vec<Event> {
|
|
let polled = self.consumer.poll().unwrap();
|
|
let message_sets: Vec<MessageSet<'_>> = polled.iter().collect();
|
|
let mut events = vec![];
|
|
for ms in message_sets {
|
|
let topic = ms.topic();
|
|
let partition = ms.partition();
|
|
println!("topic={},partition={}", topic, partition);
|
|
for m in ms.messages() {
|
|
let event = Event {topic: String::from(topic), key: std::str::from_utf8(m.key).unwrap().parse().unwrap(), msg: std::str::from_utf8(m.value).unwrap().parse().unwrap() };
|
|
events.push(event);
|
|
}
|
|
self.consumer.consume_messageset(ms).unwrap();
|
|
}
|
|
self.consumer.commit_consumed().unwrap();
|
|
events
|
|
}
|
|
}
|