探索高效能的分布式任务队列:SwiftQ
SwiftQ 是一款专为服务器端Swift应用程序设计的分布式任务队列。它利用消息传递机制,通过Redis作为消息代理,实现了可靠的分布式任务处理。这款强大的工具允许您在多机器环境中分配工作负载,确保即使在网络问题或消费者故障的情况下也能完成所有任务。
项目简介
SwiftQ的核心是其基于可靠队列模式的设计,保证了任务的至少一次交付。它可以实现实时操作和延迟执行任务,并且可以由多个生产者和消费者构成,以实现高可用性和水平扩展。它特别适合那些超出了常规HTTP请求响应周期的任务。
应用场景
SwiftQ适用于各种后台任务,包括但不限于:
- 发送邮件
- 记录指标
- 删除/停用数据
- 与第三方API交互
- 批量数据库插入的分时处理
- 图像处理
- 创建缩略图
- 任何耗时超过200毫秒的操作
主要特性
- 任务调度
- 定期任务
- 任务链式调用
- 任务依赖注入
- 失败重试策略
- 至少一次交付保证
配置
配置SwiftQ需要设定Redis连接参数,例如数据库ID、主机名和端口。此外,还需要设置轮询间隔、是否启用任务调度、并发数等。默认配置如下:
let redisConfig = RedisConfig(redisDB: 0, hostname: "127.0.0.1", port: 6379, password: nil)
let configuration = Configuration(pollingInterval: 1000,
enableScheduling: true,
concurrency: 4,
redisConfig: .development,
tasks: [EmailTask.self])
使用方法
- 生产者(Producer): 创建并推送任务到队列。
let producer = try SwiftQProducer(redisConfig: .development)
let demoTask = DemoTask()
try producer.enqueue(demoTask)
- 消费者(Consumer): 开始接收和处理任务。
let consumer = try SwiftQConsumer(configuration)
consumer.start()
- 创建任务: 每个任务都需遵循
Task
协议,包括存储属性以便SwiftQ保存额外信息。任务自动符合Codable
协议,如有自定义编码逻辑,可添加func encode(to encoder: Encoder) throws
。
final class EmailTask: Task {
let storage: Storage
let email: String
init(email: String) {
self.storage = Storage(EmailTask.self)
self.email = email
}
func execute() throws {}
}
进阶使用
- 定时任务: 可以设定任务在特定时间执行。
try producer.enqueue(task: demo, time: .seconds(30))
- 定期任务: 如每天固定时间执行的任务,用于定时采集数据等。
final class PollTask: PeriodicTask {
let storage: Storage
let url: String
init(url: String) {
self.storage = Storage(PollTask.self)
self.url = url
}
func execute() throws {}
var frequency: PeriodicTime {
return .daily(minute: 30, hour: 5)
}
}
- 自定义队列: 可以指定任务仅在特定队列中运行,供特定消费者消费。
支持的数据类型
SwiftQ支持的原始JSON表示类型包括字符串、数字、数组和布尔值。
安装
只需在Package.swift
文件中添加以下依赖:
.Package(url: "https://github.com/John-Connolly/SwiftQ.git", majorVersion: 0)
总的来说,SwiftQ是一个强大而灵活的工具,为您的服务器端Swift应用提供了出色的后台任务管理能力。无论是简单的邮件发送还是复杂的图像处理,它都能胜任,是值得信赖的后端助手。快来试试看吧!