1.1 KiB · text History 1ce9641
pub mod messages;
pub mod publisher;
pub mod consumer;

pub use messages::{JobKind, JobMessage};
pub use publisher::{publish_job, Publisher};
pub use consumer::{run_worker, JobHandler, JobOutcome};

use lapin::{Connection, ConnectionProperties};

pub const EXCHANGE: &str = "dms.jobs";
pub const DLX_EXCHANGE: &str = "dms.jobs.dlx";

pub async fn connect(amqp_url: &str) -> Result<Connection, lapin::Error> {
    Connection::connect(amqp_url, ConnectionProperties::default()).await
}

/// Routing key + queue name for a given job kind. Each kind has its own queue
/// so workers can be scaled per-kind. All queues bind to the same exchange.
pub fn routing_key(kind: JobKind) -> &'static str {
    match kind {
        JobKind::Thumbnail => "job.thumbnail",
        JobKind::Ocr => "job.ocr",
        JobKind::Describe => "job.describe",
        JobKind::ExtractTags => "job.extract_tags",
        JobKind::SimilaritySearch => "job.similarity",
    }
}

pub fn queue_name(kind: JobKind) -> String {
    format!("dms.{}", routing_key(kind).replace('.', "_"))
}

pub fn dlq_name(kind: JobKind) -> String {
    format!("dms.{}.dlq", routing_key(kind).replace('.', "_"))
}