Фоновая обработка Golang

Как можно сделать фоновую обработку/очередь в Go?

например, пользователь регистрируется, и вы отправляете им подтверждение по электронной почте - вы хотите отправить подтверждение по электронной почте в фоновом режиме, как это может быть медленно, и почтовый сервер может быть вниз и т.д.

в Ruby очень хорошее решение DelayedJob, который помещает ваше задание в очередь к реляционной базе данных (т. е. простой и надежный), а затем использует фоновых работников для запуска задач и повторяет попытки, если задание неудачи.

Я ищу простое и надежное решение, а не что-то низкое, если это возможно.

4 ответов


хотя вы можете просто открыть goroutine и выполнить все асинхронные задачи, это не отличное решение, если вы хотите надежности, то есть обещание, что если вы запустите задачу, она будет выполнена.

Если вам действительно нужно, чтобы это был производственный класс, выберите распределенную рабочую очередь. Я не знаю таких очередей, которые специфичны для golang, но вы можете работать с RabbitMQ, beanstalk, redis или подобными механизмами очередей, чтобы разгрузить такие задачи из вашего процесса и добавить отказоустойчивость и настойчивость очереди.


простой Goroutine может сделать работу: http://golang.org/doc/effective_go.html#goroutines

откройте gorutine с доставкой по электронной почте, а затем ответьте на HTTP-запрос или что угодно

Если вы хотите использовать workqueue, вы можете использовать RabbitMQ или Beanstalk client как: https://github.com/streadway/amqp https://github.com/kr/beanstalk

или, возможно, вы можете создать очередь в процессе с помощью очереди FIFO бег в goroutine 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")

Я создал библиотеку для запуска асинхронных задач с использованием очереди сообщений (в настоящее время RabbitMQ и Memcache поддерживаются брокерами, но другие брокеры, такие как Redis или Cassandra, могут быть легко добавлены).

вы можете взглянуть. Это может быть достаточно хорошо для вашего варианта использования (а также поддерживает цепочки и рабочие процессы).

https://github.com/RichardKnop/machinery

Это проект на ранней стадии, хотя.


вы также можете использовать библиотеку goworker для планирования заданий.

http://www.goworker.org/