2 个版本
0.1.1 | 2022 年 12 月 6 日 |
---|---|
0.1.0 | 2022 年 12 月 2 日 |
#1110 in 异步
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)
元组,以便于轻松解构数据。
作者
- 蒂姆·韦罗夫, [email protected]
依赖项
~5.5–8MB
~174K SLoC