Мне нужно выполнить трудоемкую и подверженную ошибкам задачу (например, вызов конечной точки SOAP, которая инициирует доставку SMS) всякий раз, когда вызывается данная конечная точка моего REST API, но я бы предпочел не заставлять своих пользователей дождитесь этого, прежде чем отправлять ответ обратно. Spring AMQP уже является частью моего стека, поэтому я думаю об использовании его для создания «рабочей очереди» и наличия ряда рабочих процессов, потребляющих из очереди и заботящихся о «рабочих единицах». Однако у меня есть следующие требования:
- Единица работы гарантированно будет доставлена и доставлена ровно одному работнику.
- Если единица работы не может быть завершена по какой-либо причине, она должна быть помещена обратно в очередь, чтобы другой рабочий мог забрать ее позже.
- Рабочие единицы выдерживают перезагрузки и сбои сервера. Это обязательно, потому что я не буду использовать какую-либо БД для их хранения.
Я знаю, что RabbitMQ и Spring AMQP можно настроить таким образом, чтобы обеспечить эти три требования, но я когда-либо использовал их только для достижения RPC, поэтому я мало знаю ни о чем, кроме этого. Есть ли какой-нибудь пример, которому я мог бы последовать? На какие подводные камни стоит обратить внимание?