2 个版本

0.1.1 2022 年 12 月 6 日
0.1.0 2022 年 12 月 2 日

#1110 in 异步

Apache-2.0

37KB
613

ElkMQ (基于事件日志的紧凑消息队列)

ElkMQ 是 Redis 上消息队列模式的纯 Rust 实现。

我可以使用 ElkMQ 做什么?

ElkMQ 允许在 Redis 实例上异步传递消息。如果已经部署了安全的 Redis 实例,ElkMQ 可以连接到它并使用它来通信。

每条消息都保证只被投递一次。这允许进行安全的 N:M 客户端通信。ElkMQ 还允许等待响应。这使得 ElkMQ 可用作独立服务的通信骨干。

在现有的 Rust 程序中使用 ElkMQ 与将其包括在依赖列表中一样简单。将 ElkMQ 作为 Python 模块使用与使用 Pip 安装它一样简单。

最低要求

  • Redis 6.0
  • Rust 1.65
  • Python 3+(用于 Python 模块)

示例

Rust 示例

以下示例展示了 ElkMQ 在 Rust 客户端中的使用。它们展示了如何入队、出队和等待事件。一些示例还展示了它们的输出。

在新建队列中入队和出队事件很简单,如下所示

use elk_mq::{ EventQueue, ServiceEvent, Timestamp, TimestampedEvent };

fn main() {
    // Create a queue with a name
    let mut queue: EventQueue = EventQueue::new("foo", "redis://127.0.0.1");

    // Create an event
    let event: ServiceEvent = ServiceEvent::new(10, "test_event", Some("serialized_data".to_string()));

    // Enqueueing returns the event timestamp registered by the Redis instance
    let _timestamp: Timestamp = queue.enqueue(&event).unwrap();

    // Dequeueing returns the timestamp of the event, and the event itself as a timestamped event type
    let timestamped_event: TimestampedEvent = queue.dequeue().unwrap();

    println!("{:#?}", timestamped_event)
}

此示例生成的输出如下所示

TimestampedEvent(
    1669887505996,
    ServiceEvent {
        request_uuid: 215842608724208526221701166594411877883,
        timeout: 10,
        action: "test_event",
        payload: Some(
            "serialized_data",
        ),
    },
)

等待事件的响应与入队事件类似,但 await 可能会超时。如果发生这种情况,将返回 EventQueueError,程序继续执行。任何服务在处理事件之前都应确保事件的超时时间已过期。如果响应已入队,但原始事件超时已过期,则响应将永远不会被处理。这在使用中不是问题,但会在您的 Redis 实例中占用空间。

    // -- snip -- //

    // an event with a 20 second timeout
    let event: ServiceEvent = ServiceEvent::new(
        20, // timeout in seconds
        "test_awaited_event", // event name
        Some("serialized_data".to_string())
    );

    // after 20 seconds this either panics with a TimeoutExpired error
    // or returns the received response as a TimestampedEvent
    let response: TimestampedEvent = queue.await_response(&event).unwrap();

    // -- snip -- //

关于 Python 模块的说明

Python 模块的功能与 Rust 库完全相同。所有 Python 类型都与其 Rust 对应类型相同,除了 TimestampedEvent。在 Python 中,这是一个 (int, ServiceEvent) 元组,以便于轻松解构数据。

作者

依赖项

~5.5–8MB
~174K SLoC