2013-11-25 3 views
4

У меня есть приложение, которое читает сообщение из SQS (давайте вызовите очередь «p»), выполняет дорогостоящую обработку изображений (шаг № 1), загружает результат на S3 и удаляет сообщение из очереди «p», а затем отправляет уведомление в тему SNS (этот вопрос SNS направляет сообщение в другую очередь под названием «q»). Существует еще одно приложение, которое считывает из очереди «q» и выполняет второй этап обработки изображения (загружает результат шага №1 из S3 и выполняет дополнительные математические операции над этим результатом).SQS/SNS и архитектор для одноразовых вычислений (EC2 SPOT экземпляры)

У меня есть комбинация обычных экземпляров + экземпляров пятен, работающих с приложением № 1. Я знаю, что (из-за концепции тайм-аута видимости SQS), если спотовые экземпляры закрываются во время фазы обработки изображений, SQS делает сообщения снова видимыми для других потребителей, поэтому экземпляры EC2 без пятна в конечном итоге выполняют работу, случайным экземплярам не удалось завершить из-за выключения системы.

Теперь мой вопрос: что произойдет, если спотовые экземпляры будут закрыты точно после удаления, но до отправки сообщения в SNS? Как мы можем оправиться от такого события?

# PSEUDO CODE 
msg = read message from queue 
result = doWork(msg) 
upload result to S3 
delete msg 
publish to sns about result 

Cheers!

+0

Считаете ли вы использование Amazon SWF?Это выглядит как вариант использования, поскольку у вас есть различные моменты принятия решений и какое-то «состояние задачи». SWF позаботится об этом, а также освободит вас от проблемы, связанной с идемпотенцией, с использованием SNS/SQS. – Pepster

ответ

7

Прежде всего, процесс A не должен удалять сообщение из очереди SQS до тех пор, пока ПОСЛЕ того, что он отправил сообщение SNS, чтобы запустить второй процесс. Удаление сообщения из очереди - это последнее, что вы должны сделать, чтобы сигнализировать, что «моя работа выполнена». Пока сообщение SNS не будет отправлено, работа не будет выполнена.

Во-вторых, одна из ключевых вещей, которые вы должны принять при проектировании процессов, как это, (особенно при использовании выборочные экземпляров) является понятие идемпотентность: http://en.wikipedia.org/wiki/Idempotence

Унарная операция (или функция), если идемпотентна, всякий раз, когда он применяется в два раза на любое значение, это дает тот же результат, как если бы он был применен один раз

Дальше больше: http://aws.amazon.com/sqs/faqs/#How_many_times_will_I_receive_each_message

Amazon SQS спроектирован так, чтобы обеспечить доставку «по крайней мере один раз» всех сообщений в своих очередях. Хотя в большинстве случаев каждое сообщение будет доставлено в ваше приложение ровно один раз, вы должны разработать свою систему, чтобы обработка сообщения несколько раз не создавала ошибок или несоответствий.

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

Не зная точно, что ваша обработка влечет за собой я не могу сказать вам, как сделать ваш процесс идемпотента, но не пытаюсь решить проблему «, что произойдет, если спотовые экземпляры получает завершение работы переправы», думает, about 'Как я могу создать каждый шаг процесса, чтобы его можно было запускать несколько раз с теми же входами и не вызывать никаких проблем. - если вы это сделаете, вы убьете двух зайцев одним выстрелом.

Смежные вопросы