Golang后台处理

Lee*_*Lee 8 go

如何在Go中进行后台处理/排队?

例如,用户注册,并向您发送确认电子邮件 - 您希望在后台发送确认电子邮件,因为它可能很慢,邮件服务器可能已关闭等等.

在Ruby中,一个非常好的解决方案是DelayedJob,它将您的工作排队到关系数据库(即简单可靠),然后使用后台工作程序来运行任务,并在作业失败时重试.

我正在寻找一个简单可靠的解决方案,如果可能的话,不是低级别的.

mcu*_*ros 9

一个简单的Goroutine可以完成这项工作:http://golang.org/doc/effective_go.html#goroutines

通过电子邮件传递打开gorutine,然后回答HTTP请求或其他

如果您希望使用工作队列,可以使用Rabbitmq或Beanstalk客户端,例如:https : //github.com/streadway/amqp https://github.com/kr/beanstalk

或者也许您可以在进程中创建一个队列,并在goroutine https://github.com/iNamik/go_container中运行FIFO队列

但也许最好的解决方案是这个作业队列库,使用这个库你可以设置并发限制等: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")
Run Code Online (Sandbox Code Playgroud)


Not*_*fer 6

虽然您可以打开一个goroutine并执行您想要的每个异步任务,但如果您需要可靠性,这不是一个很好的解决方案,即如果您触发任务它将完成的承诺.

如果您确实需要将其作为生产等级,请选择分布式工作队列.我不知道任何特定于golang的队列,但您可以使用rabbitmq,beanstalk,redis或类似的排队引擎从您的进程中卸载此类任务并添加容错和队列持久性.


Ric*_*nop 6

我已经使用消息队列创建了一个用于运行异步任务的库(目前RabbitMQ和Memcache是​​受支持的代理,但是可以很容易地添加其他代理,如Redis或Cassandra).

你可以看看.它可能对您的用例来说足够好(它还支持链接和工作流).

https://github.com/RichardKnop/machinery

这是一个早期的项目.