Почему я должен использовать Amazon Kinesis, а не SNS-SQS?


У меня есть вариант использования, когда будет поток данных, и я не могу потреблять его в том же темпе и нужен буфер. Это может быть решена с использованием СНС-система SQS очереди. Я узнал, что Кинезис решает ту же цель, так в чем разница? Почему я должен предпочесть (или не должен предпочесть) Кинезис?

10 88

10 ответов:

на поверхности они смутно похожи, но ваш случай использования определит, какой инструмент подходит. IMO, если вы можете обойтись с SQS, то вы должны - если он будет делать то, что вы хотите, это будет проще и дешевле, но вот лучшее объяснение Из FAQ AWS, которое дает примеры подходящих вариантов использования для обоих инструментов, чтобы помочь вам решить:

часто задаваемые вопросы

имейте в виду, что этот ответ был правильным для июня 2015 года

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

есть 2 основных преимущества для Kinesis (1) Вы можете прочитать одно и то же сообщение из нескольких приложений и (2) Вы можете перечитывать сообщения в случае необходимости к.

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

кроме того, мы добавили еще один SQS, который подписан на SNS, который будет содержать сообщения в течение 14 дней. В обычном случае никто не читал из этого Но в случае ошибки, которая заставляет нас хотеть перемотать данные, мы можем легко прочитать все сообщения из этого SQS и повторно отправить их в SNS. Пока Кинезис только обеспечивает удерживание 7 дней.

В заключение, SNS + SQSs гораздо проще и обеспечивает большинство возможностей. ИМО вам нужен действительно сильный случай, чтобы выбрать Kinesis над ним.

Kinesis поддерживает несколько возможностей потребителей, что означает, что одни и те же записи данных могут обрабатываться одновременно или в разное время в течение 24 часов у разных потребителей, аналогичное поведение в SQS может быть достигнуто путем записи в несколько очередей, а потребители могут читать из нескольких очередей. Однако запись снова в несколько очередей добавит дополнительные секунды {несколько миллисекунд} задержки в системе.

во-вторых, Kinesis обеспечивает возможность маршрутизации для выборочных записей данных маршрута к различным сегменты с использованием ключа раздела, который может быть обработан конкретными экземплярами EC2 и может включать вычисление микропакетов {подсчет и агрегирование}.

работа с любым программным обеспечением AWS проста,но с SQS проще всего. С Кинезисом, потребность обеспечить достаточные черепки заранее, динамически увеличивая число Черепков для того чтобы управлять нагрузкой Спайка и уменьшать для того чтобы сохранить цену также необходима, что управляла. это боль в Кинезе, такие вещи не требуются с SQS. ЗК бесконечно масштабируемый.

самым большим преимуществом для меня является тот факт, что Kinesis является воспроизводимой очередью, а SQS-нет. Таким образом, вы можете иметь несколько потребителей одних и тех же сообщений Kinesis (или одного и того же потребителя в разное время), где с помощью SQS, как только сообщение было получено, оно ушло из этой очереди. Из-за этого SQS лучше подходит для рабочих очередей.

фрагмент документация AWS:

мы рекомендуем Amazon Kinesis Streams для случаев использования с требованиями, которые похожи на следующие:

  • маршрутизация связанных записей в тот же процессор записи (как в потоковом MapReduce). Например, подсчет и агрегирование проще, когда все записи для данного ключа направляются в один и тот же процессор записей.

  • заказ учетная документация. Например, вы хотите перенести данные журнала с узла приложения на узел обработки / архивирования, сохраняя при этом порядок инструкций журнала.

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

  • возможность использовать записи в том же порядке через несколько часов. Например, у вас есть приложение выставления счетов и приложение аудита, которое работает на несколько часов позже приложения выставления счетов. Поскольку Amazon Kinesis Streams хранит данные до 7 дней, вы можете запустить приложение аудита до 7 дней после приложения выставления счетов.

мы рекомендуем Amazon SQS для случаев использования с требованиями, аналогичными следующее:

  • семантика сообщений (например, ack/fail на уровне сообщений) и тайм-аут видимости. Например, у вас есть очередь рабочих элементов, и вы хотите отслеживать успешное завершение каждого элемента независимо. Amazon SQS отслеживает ack/fail, поэтому приложение не должно поддерживать постоянную контрольную точку / курсор. Amazon SQS удалит подтвержденные сообщения и повторно доставит неудачные сообщения после настроенного тайм-аута видимости.

  • индивидуальная задержка сообщения. Например, у вас есть очередь заданий, и вам нужно запланировать отдельные задания с задержкой. С помощью Amazon SQS можно настроить задержку отдельных сообщений до 15 минут.

  • динамическое увеличение параллелизма / пропускной способности во время чтения. Например, у вас есть рабочая очередь и вы хотите добавить больше читателей, пока отставание не будет очищено. С помощью Amazon Kinesis Streams можно масштабировать до достаточного количества осколков (Примечание, однако, что вам нужно будет обеспечить достаточное количество осколков заранее).

  • использование возможности прозрачного масштабирования Amazon SQS. Например, вы буферов запросов и изменения нагрузки в результате случайных скачков нагрузки или естественного роста вашего бизнеса. Поскольку каждый буферизованный запрос может обрабатываться независимо, Amazon SQS может прозрачно масштабироваться для обработки нагрузки без каких-либо инструкций по подготовке.

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

  • SNS / SQS: элементы в потоке не связаны друг с другом
  • Кинезис: элементы в потоке are связаны друг с другом

давайте разберемся в разнице на примере.

  1. предположим, что у нас есть поток заказов, для каждого заказа нам нужно зарезервировать некоторый запас и запланируйте доставку. Как только это будет завершено, мы можем безопасно удалить элемент из потока и начать обработку следующего заказа. Мы полностью сделал с предыдущим заказом, прежде чем мы начнем следующий.
  2. опять же, у нас есть тот же поток заказов, но теперь наша цель-группировать заказы по направлениям. Как только у нас есть, скажем, 10 заказов в одно и то же место, мы хотим доставить их вместе (Оптимизация доставки). Теперь история другая: когда мы получаем новый товар от поток, мы не можем закончить обработку его; скорее мы "ждем" больше элементов, чтобы прийти для достижения нашей цели. Кроме того, если процесс процессора выходит из строя, мы должны "восстановить" состояние (так что порядок не будет потерян).

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

другое дело: Кинезис может вызвать лямбду, в то время как SQS не может. Таким образом, с SQS вам нужно либо предоставить экземпляр EC2 для обработки сообщений SQS (и справиться с ним, если он не работает), либо у вас должна быть запланированная лямбда (которая не масштабируется вверх или вниз - вы получаете только один в минуту).

Kinesis решает проблему части карты в типичном сценарии map-reduce для потоковой передачи данных. В то время как SQS не гарантирует этого. Если у вас есть потоковые данные, которые необходимо агрегировать по ключу, kinesis гарантирует, что все данные для этого ключа отправляются в определенный сегмент, и сегмент может быть использован на одном хосте, что упрощает агрегацию по ключу по сравнению с SQS

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

  • плата SQS за сообщение (каждый 64 КБ считается одним запросом).
  • Кинезис взимает плату за осколок в час (1 осколок может обрабатывать до 1000 сообщений или 1 МБ/с), а также за объем данных, которые вы вводите (каждые 25 КБ).

подключение по текущим ценам и без учета бесплатных уровень, если вы отправляете 1 ГБ сообщений в день при максимальном размере сообщения, Kinesis будет стоить намного больше, чем SQS ($10.82/месяц для Kinesis против $0.20/месяц для SQS). Но если вы отправляете 1 ТБ в день, Kinesis несколько дешевле ($158/месяц против $ 201/месяц для SQS).

детали: SQS взимает $ 0.40 за миллион запросов (64 КБ каждый), поэтому $0.00655 за ГБ. При 1 ГБ в день это чуть менее $ 0,20 в месяц; при 1 ТБ в день это составляет чуть более $201 в месяц.

Кинезис сборы $ 0.014 за миллион запросов (25 КБ каждый), поэтому $0.00059 за ГБ. При 1 ГБ в день это составляет менее $ 0,02 в месяц; при 1 ТБ в день это около $18 в месяц. Однако Kinesis также взимает $ 0.015 за осколок-час. Вам нужен по крайней мере 1 осколок на 1 МБ в секунду. На 1 ГБ в день, 1 осколок будет достаточно, так что добавит еще $0.36 в день, при общей стоимости $10.82 в месяц. При 1 ТБ в день вам понадобится не менее 13 осколков, что добавляет еще $ 4,68 в день, для общей стоимости $158 в месяц.

Я добавлю еще одну вещь, которую никто больше не упоминал - SQS на несколько порядков дороже.