init repository
This commit is contained in:
commit
5762654b4b
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
redis-queueing-sample/target
|
||||||
|
redis-queueing-sample/Cargo.lock
|
||||||
13
Makefile
Normal file
13
Makefile
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
run-redis:
|
||||||
|
docker compose up redis -d
|
||||||
|
|
||||||
|
run-server:
|
||||||
|
$(MAKE) -C redis-queueing-sample run-server
|
||||||
|
|
||||||
|
build:
|
||||||
|
$(MAKE) -C redis-queueing-sample build
|
||||||
|
|
||||||
|
run: build run-redis run-server
|
||||||
|
|
||||||
|
run-client:
|
||||||
|
$(MAKE) -C redis-queueing-sample run-client
|
||||||
3
README.md
Normal file
3
README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# redis-queueing-sample
|
||||||
|
|
||||||
|
This repo aims to show how to communicate between two `services` using **Redis** as a message broker with pub/sub channels.
|
||||||
12
docker-compose.yml
Normal file
12
docker-compose.yml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
services:
|
||||||
|
redis:
|
||||||
|
image: redis/redis-stack-server:latest
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- '6379:6379'
|
||||||
|
command: redis-stack-server --save 20 1 --loglevel warning --requirepass 11677f0c-ead4-4434-ad14-3d54ce2521ce
|
||||||
|
volumes:
|
||||||
|
- cache:/data
|
||||||
|
volumes:
|
||||||
|
cache:
|
||||||
|
driver: local
|
||||||
12
redis-queueing-sample/Cargo.toml
Normal file
12
redis-queueing-sample/Cargo.toml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[package]
|
||||||
|
name = "redis-queueing-sample"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
tokio = { version = "1", features = ["full"] }
|
||||||
|
redis = { version = "0.23.0", features = ["tokio-comp", "json"] }
|
||||||
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
|
serde_json = "1.0"
|
||||||
9
redis-queueing-sample/Makefile
Normal file
9
redis-queueing-sample/Makefile
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
build:
|
||||||
|
cargo build --release --bin client
|
||||||
|
cargo build --release --bin server
|
||||||
|
|
||||||
|
run-server: build
|
||||||
|
@./target/release/server
|
||||||
|
|
||||||
|
run-client:
|
||||||
|
@while true; do ./target/release/client; sleep 1; done
|
||||||
16
redis-queueing-sample/src/bin/client.rs
Normal file
16
redis-queueing-sample/src/bin/client.rs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
use redis_queueing_sample::model::{Action, Message};
|
||||||
|
use redis_queueing_sample::{GenericError, REDIS_QUEUE_NAME, REDIS_URL};
|
||||||
|
use redis::{AsyncCommands, Client};
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() -> Result<(), GenericError> {
|
||||||
|
let client = Client::open(REDIS_URL)?;
|
||||||
|
let mut conn = client.get_tokio_connection().await?;
|
||||||
|
|
||||||
|
let message = Message::new(1, Action::Download);
|
||||||
|
let json_str = serde_json::to_string(&message)?;
|
||||||
|
|
||||||
|
let _: () = conn.rpush(REDIS_QUEUE_NAME, json_str).await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
25
redis-queueing-sample/src/bin/server.rs
Normal file
25
redis-queueing-sample/src/bin/server.rs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
use redis::AsyncCommands;
|
||||||
|
|
||||||
|
use redis_queueing_sample::model::Message;
|
||||||
|
use redis_queueing_sample::{GenericError, REDIS_QUEUE_NAME, REDIS_URL};
|
||||||
|
|
||||||
|
async fn read_queue(mut conn: redis::aio::Connection) -> Result<(), GenericError> {
|
||||||
|
loop {
|
||||||
|
let (_, json_data): (String, String) = conn.blpop(REDIS_QUEUE_NAME, 0).await?;
|
||||||
|
|
||||||
|
let data: Message = serde_json::from_str(&json_data)?;
|
||||||
|
println!("Received data: {:?}", data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() -> Result<(), GenericError> {
|
||||||
|
println!("listening message...");
|
||||||
|
|
||||||
|
let client = redis::Client::open(REDIS_URL)?;
|
||||||
|
let conn = client.get_tokio_connection().await?;
|
||||||
|
|
||||||
|
read_queue(conn).await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
31
redis-queueing-sample/src/lib.rs
Normal file
31
redis-queueing-sample/src/lib.rs
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
pub static REDIS_URL: &str = "redis://:11677f0c-ead4-4434-ad14-3d54ce2521ce@127.0.0.1:6379/";
|
||||||
|
|
||||||
|
pub type GenericError = Box<dyn std::error::Error>;
|
||||||
|
|
||||||
|
pub const REDIS_PATH: &'static str = "queueing-sample";
|
||||||
|
pub const REDIS_QUEUE_NAME: &'static str = "messages";
|
||||||
|
|
||||||
|
pub mod model {
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub enum Action {
|
||||||
|
Download,
|
||||||
|
Format,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct Message {
|
||||||
|
id: u32,
|
||||||
|
action: Action,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Message {
|
||||||
|
pub fn new(id: u32, action: Action) -> Self {
|
||||||
|
Self {
|
||||||
|
id,
|
||||||
|
action,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user