一个非阻塞、事件驱动的 Swift Disque 客户端,无耻地复制了 构建于 Vapor 的 Redis 客户端之上。Disque 是由 Salvatore Sanfilippo (@antirez) 创建的分布式作业队列,从 Redis "fork" 而来。
GETJOB
命令从多个队列中获取作业。 Disque 将从定义的队列中搜索作业,首先从最左边的队列开始,模拟作业优先级。1. 使用 Docker 启动 Disque 容器,或遵循 Disque 的 安装说明。
docker run -d --rm -p 7711:7711 --name disque efrecon/disque:1.0-rc1
2 将依赖项添加到 Package.swift。
.package(url: "https://github.com/johnbona/disque", from: "0.1.0")
3. 在 configure.swift
中注册 provider 和 config。
public func configure(_ config: inout Config, _ env: inout Environment, _ services: inout Services ) throws {
// ...
try services.register(DisqueProvider())
var databases = DatabasesConfig()
let disqueConfig = DisqueDatabase(config: DisqueClientConfig())
databases.add(database: disqueConfig, as: .disque)
services.register(databases)
}
4. 从连接池中获取连接并使用 Disque 客户端。
return req.withPooledConnection(to: .disque) { disque -> Future<[Job<TestJob>]> in
return disque.get(count: 1, from: ["test-queue"], as: TestJob.self)
}
Disque 的所有命令(除了 HELLO
、QPEEK
、QSCAN
、JSCAN
)都在 Swift 中实现,作业正文符合 Codable
。
return req.withPooledConnection(to: .disque) { disque -> Future<[Job<TestJob>]> in
return disque.get(count: 1, from: ["test-queue"], as: TestJob.self)
}
return req.withPooledConnection(to: .disque) { disque -> Future<[Job<TestJob>]> in
return disque.get(count: 1, from: ["high-priority", "low-priority"], as: TestJob.self)
}
req.withPooledConnection(to: .disque) { disque -> Future<String> in
return try disque.add(job: TestJob(), to: "test-queue")
}
req.withPooledConnection(to: .disque) { disque -> Future<Int> in
return try disque.ack(jobIDs: ["D-00000000-000000000000000000000000-0000"])
}
Disque 在 MIT 许可下发布。