У меня есть сценарий использования, при котором поступает поток данных, и я не могу использовать его с той же скоростью, и мне нужен буфер. Это можно решить с помощью очереди SNS-SQS. Я узнал, что Kinesis решает ту же задачу, так в чем же разница? Почему я должен предпочесть (или не предпочесть) Kinesis?
164
Имейте в виду, что этот ответ был правильным на июнь 2015
После некоторого изучения проблемы, имея в виду тот же вопрос, я обнаружил, что SQS (с SNS) предпочтительнее для большинства случаев использования, если только порядок сообщений не важен для вас (SQS не гарантирует FIFO для сообщений).
У Kinesis есть 2 основных преимущества:
Оба преимущества могут быть достигнуты при использовании SNS в качестве вентилятора для SQS. Это означает, что производитель сообщения отправляет только одно сообщение в SNS. Затем SNS разветвляет сообщение на несколько SQS, по одному для каждого потребительского приложения. Таким образом, вы можете иметь столько потребителей, сколько захотите, не думая о том, как распределить емкость.
Кроме того, мы добавили еще одну SQS, которая подписана на SNS, которая будет хранить сообщения в течение 14 дней. В обычном случае никто не читает из этого SQS, но в случае ошибки, которая заставляет нас хотеть перематывать данные, мы можем легко прочитать все сообщения из этого SQS и повторно отправить их в SNS. В то время как Kinesis обеспечивает только 7 дней хранения.
В заключение, SNS + SQS намного проще и предоставляют большинство возможностей. IMO, вам нужен действительно веский аргумент, чтобы выбрать Kinesis.
источник
split
в ,SNS split the message to multiple SQSs
так как не сломаться сообщения на куски , но копии его по нескольким направлениям.Kinesis поддерживает возможности нескольких потребителей, что означает, что одни и те же записи данных могут обрабатываться в одно и то же время или в разное время в течение 24 часов у разных потребителей, аналогичное поведение в SQS может быть достигнуто путем записи в несколько очередей, и потребители могут читать из нескольких очередей. Однако повторная запись в несколько очередей увеличит задержку в секундах (несколько миллисекунд) в системе.
Во-вторых, Kinesis предоставляет возможность маршрутизации для выборочной маршрутизации записей данных на разные сегменты с использованием ключа разделения, который может обрабатываться конкретными экземплярами EC2, и может включать микропакетный расчет {Подсчет и агрегирование}.
Работать с любым программным обеспечением AWS легко, а с SQS - проще всего. В Kinesis необходимо заранее выделять достаточное количество сегментов, динамически увеличивая количество фрагментов для управления пиковой нагрузкой и уменьшая их для экономии затрат, также необходимых для управления. это боль в Kinesis, с SQS таких вещей не требуется. SQS бесконечно масштабируется.
источник
Семантика этих технологий различна, потому что они были разработаны для поддержки различных сценариев:
Давайте разберем разницу на примере.
Как только обработка одного элемента не может быть отделена от обработки другого, мы должны иметь семантику Kinesis для безопасной обработки всех случаев.
источник
Выдержка из документации AWS :
источник
Самым большим преимуществом для меня является тот факт, что Kinesis является воспроизводимой очередью, а SQS - нет. Таким образом, у вас может быть несколько получателей одних и тех же сообщений Kinesis (или одного и того же получателя в разное время), где с помощью SQS, когда сообщение было подтверждено, оно ушло из этой очереди. Из-за этого SQS лучше подходит для рабочих очередей.
источник
Другое дело: Kinesis может вызвать лямбду, а SQS - нет. Так что с SQS вы должны либо предоставить экземпляр EC2 для обработки сообщений SQS (и справиться с ним в случае сбоя), либо у вас должна быть запланированная лямбда (которая не масштабируется или увеличивается - вы получаете только один раз в минуту) ,Изменить: этот ответ больше не является правильным. SQS может напрямую запускать лямбду с июня 2018 года
https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html
источник
Модели ценообразования отличаются, поэтому в зависимости от вашего варианта использования одна или другая может быть дешевле. Используя простейший случай (не включая SNS):
С учетом текущих цен и без учета уровня бесплатного пользования, если вы отправляете 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 доллара в месяц.
Kinesis взимает 0,014 доллара за миллион запросов (по 25 КБ каждая), то есть 0,00059 доллара за ГБ. При 1 ГБ в день это меньше, чем 0,02 доллара в месяц; при 1 ТБ в день это около 18 долларов в месяц. Тем не менее, Kinesis также взимает $ 0,015 за шард-час. Вам нужен как минимум 1 осколок на 1 МБ в секунду. При 1 ГБ в день будет достаточно одного шарда, так что это добавит еще 0,36 доллара в день, при общей стоимости 10,82 доллара в месяц. При 1 ТБ в день вам потребуется как минимум 13 осколков, что добавляет еще 4,68 долл. В день, а общая стоимость - 158 долл. В месяц.
источник
Kinesis решает проблему части карты в типичном сценарии сокращения карты для потоковой передачи данных. Пока SQS в этом не уверен. Если у вас есть потоковые данные, которые должны быть агрегированы по ключу, kinesis гарантирует, что все данные для этого ключа отправляются на определенный сегмент, а сегмент может использоваться на одном хосте, что упрощает агрегацию по ключу по сравнению с SQS.
источник
Я добавлю еще одну вещь, о которой никто не упомянул - SQS на несколько порядков дороже.
источник
Случаи использования Kinesis
Примеры использования SQS
источник