Disque

CircleCI Swift Vapor

一个非阻塞、事件驱动的 Swift Disque 客户端,无耻地复制了 构建于 Vapor 的 Redis 客户端之上。Disque 是由 Salvatore Sanfilippo (@antirez) 创建的分布式作业队列,从 Redis "fork" 而来。

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 的所有命令(除了 HELLOQPEEKQSCANJSCAN)都在 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 许可下发布。