如何在Go中进行后台处理/排队?
例如,用户注册,并向您发送确认电子邮件 - 您希望在后台发送确认电子邮件,因为它可能很慢,邮件服务器可能已关闭等等。
在Ruby中,一个非常好的解决方案是DelayedJob,它将您的工作排入关系数据库(即简单可靠),然后使用后台工作程序来运行任务,并在作业失败时重试。
我正在寻找一种简单可靠的解决方案,如果可能的话,不是低级别的。
答案 0 :(得分:8)
一个简单的Goroutine可以完成这项工作: http://golang.org/doc/effective_go.html#goroutines
使用电子邮件递送打开gorutine,然后回答HTTP请求或其他
如果您希望使用工作队列,可以使用Rabbitmq或Beanstalk客户端,例如: https://github.com/streadway/amqp https://github.com/kr/beanstalk
或许您可以在进程中使用在goroutine中运行的FIFO队列创建队列 https://github.com/iNamik/go_container
但也许最好的解决方案是这个作业队列库,使用这个库可以设置并发限制等: https://github.com/otium/queue
import "github.com/otium/queue"
q := queue.NewQueue(func(email string) {
//Your mail delivery code
}, 20)
q.Push("foo@bar.com")
答案 1 :(得分:6)
虽然您可以打开一个goroutine并执行您想要的每个异步任务,但如果您需要可靠性,这不是一个很好的解决方案,即如果您触发任务它将完成的承诺。
如果您确实需要将其作为生产等级,请选择分布式工作队列。我不知道任何特定于golang的队列,但您可以使用rabbitmq,beanstalk,redis或类似的排队引擎从您的进程中卸载此类任务并添加容错和队列持久性。
答案 2 :(得分:6)
我创建了一个使用消息队列运行异步任务的库(目前RabbitMQ和Memcache是受支持的代理,但是可以很容易地添加其他代理,如Redis或Cassandra。)
你可以看看。它可能足以满足您的用例(并且它还支持链接和工作流)。
https://github.com/RichardKnop/machinery
这是一个早期阶段的项目。
答案 3 :(得分:3)
您还可以使用goworker库来安排工作。
答案 4 :(得分:0)
如果您来自Ruby,并且正在寻找Sidekiq,Resque或DelayedJob之类的东西,请查看库asynq。
队列语义与sidekiq非常相似。
答案 5 :(得分:0)
如果您想要一个界面非常简单且健壮的库,感觉像Go,使用Redis作为后端,使用RabbitMQ作为消息代理,则可以尝试