Чому я повинен використовувати Amazon Kinesis, а не SNS-SQS?


164

У мене є випадок використання, коли надходитимуть потоки даних, і я не можу споживати їх у тому ж темпі та мені потрібен буфер. Це можна вирішити за допомогою черги SNS-SQS. Я дізнався, що Kinesis вирішує ту саму мету, тож у чому різниця? Чому я віддаю перевагу (або не слід віддавати перевагу) кінези?

Відповіді:


59

На поверхні вони нечітко схожі, але ваш випадок використання визначить, який інструмент підходить. IMO, якщо ви зможете обійтись через SQS, тоді вам слід - якщо він зробить те, що ви хочете, це буде простіше і дешевше, але ось краще пояснення з поширених запитань AWS, яке дає приклади відповідних випадків використання обох інструментів для допоможемо вирішити:

Поширені запитання



80

Пам'ятайте, що ця відповідь була правильною для червня 2015 року

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

Є дві основні переваги для Kinesis:

  1. ви можете прочитати одне і те ж повідомлення з кількох програм
  2. ви можете перечитати повідомлення у разі необхідності.

Обидві переваги можна досягти, використовуючи SNS як вентилятор SQS. Це означає, що виробник повідомлення надсилає лише одне повідомлення до SNS, тоді вболівальники SNS видають повідомлення на кілька SQS, по одному для кожної програми споживача. Таким чином у вас може бути стільки споживачів, скільки ви хочете, не замислюючись про посилення потужностей.

Крім того, ми додали ще один SQS, який підписаний на SNS, який буде зберігати повідомлення протягом 14 днів. У звичайному випадку ніхто не читає з цього SQS, але у випадку помилки, яка змушує нас захотіти перемотування даних, ми можемо легко прочитати всі повідомлення цього SQS та повторно надіслати їх до SNS. У той час як Kinesis забезпечує лише 7 днів утримання.

На закінчення, SNS + SQS набагато простіше і забезпечує більшість можливостей. ІМО вам потрібен справді вагомий випадок, щоб вибрати Кінезис над ним.


2
FYI: Кінези можна зберігати до 7 днів.
Дідьє А.

30
Нещодавно AWS оголосила про SQS FIFO [ docs.aws.amazon.com/AWSSimpleQueueService/latest/…, який може обслуговувати час замовлення повідомлень.
VijeshJain

4
супер незначні коментарі - ймовірно , не використовуватиме слово splitв , SNS split the message to multiple SQSsтак як не зламатися повідомлення на шматки , але копії його за кількома напрямками.
Mobigital

2
Кінезис непридатний для випадків використання вентиляторів (pub-sub) через обмеження у кількості читачів на фрагмент / секунду. Хоча це не стосується початкового запиту, той, хто покладається на Kinesis-масштабування для n-читачів, повинен врахувати цей факт. forums.aws.amazon.com/message.jspa?messageID=760351
codeasone

2
Гарантія замовлення Kinesis - "шахрай", а не "потік". Після того, як у вас більше однієї черепки, весь потік не матиме гарантії на замовлення. Для черги SQS, коли пропускна здатність є відносно низькою, вона майже FIFO. Тільки коли ваша пропускна здатність піднімається вище, порядок менше дотримується. Це стосується класичних черг SQS, а не черг FIFO.
йорото

54

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

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

Робота над будь-яким програмним забезпеченням AWS проста, але з SQS - це найпростіше. У Kinesis виникає необхідність передбачити достатню кількість осколків заздалегідь, динамічно збільшуючи кількість черепків для управління шиповим навантаженням і зменшуючи, щоб заощадити витрати, необхідні для управління. болі в Кінезі, таких SQS не потрібно. SQS нескінченно масштабується.


11
Щодо вас пояснення щодо SQS. Ви можете домогтися простого способу надсилати одне і те ж повідомлення на кілька SQS, маючи перед собою SNS.
Roee Gavirel

8
додаток -> sns тема ---> sqs1, sqs2, sqs3 ...?
Картик

4
Так, я мав на увазі саме цей підхід.
Roee Gavirel

@RoeeGavirel як щодо обмеження запиту / секунди для sns api?
Barbaros Alp

@BarbarosAlp - Я знаю лише обмеження SMS (мобільних текстових повідомлень), яке тут поза темою. це офіційна документація: docs.aws.amazon.com/general/latest/gr/…
Roee Gavirel

43

Семантика цих технологій відрізняється тим, що вони були розроблені для підтримки різних сценаріїв:

  • SNS / SQS: елементи в потоці не пов'язані один з одним
  • Kinesis: елементи в потоці будуть пов'язані один з одним

Розберемо різницю на прикладі.

  1. Припустимо, у нас є потік замовлень, для кожного замовлення нам потрібно зарезервувати деякий запас і запланувати доставку. Після того, як це буде завершено, ми можемо безпечно вилучити товар із потоку та розпочати обробку наступного замовлення. Ми повністю виконали попереднє замовлення, перш ніж розпочати наступне.
  2. Знову ми маємо той самий потік замовлень, але зараз наша мета - групувати замовлення за напрямками. Отримавши, скажімо, 10 замовлень на тому самому місці, ми хочемо доставити їх разом (оптимізація доставки). Зараз історія інша: коли ми отримуємо новий елемент із потоку, ми не можемо закінчити його обробку; швидше ми "чекаємо", коли більше предметів надійде для досягнення нашої мети. Більше того, якщо процес процесора вийде з ладу, ми мусимо «відновити» стан (тому жоден порядок не буде втрачено).

Як тільки обробка одного елемента не може бути відокремлена від обробки іншого, ми повинні мати семантику Kinesis, щоб безпечно обробляти всі випадки.


З чергою SQS FIFO, ми б упорядковували повідомлення під час їх надсилання. Чи робить це SQS подібним до Kinesis в цьому аспекті?
Енді Дуфресне

1
@AndyDufresne: це добре висвітлює сценарій, коли важливий порядок. У випадку (1) вище, ви можете обробляти замовлення "по порядку". Тож якщо у вас не вистачає запасів, пізніші замовлення будуть відхилені або відкладені. Семантика FIFO не вирішує основної задачі щодо відносності (групування).
Костянтин Трігер

35

Витяг з документації 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 може прозоро масштабувати обробку вантажу без будь-яких інструкцій щодо надання.


34

Найбільшою перевагою для мене є той факт, що Kinesis є чергою, що повторюється, а SQS - ні. Таким чином, ви можете мати декількох споживачів одних і тих же повідомлень Kinesis (або одного і того ж споживача в різний час), коли з SQS, як тільки повідомлення було ack'd, воно пішло з цієї черги. SQS краще для черг на працівників через це.


Як ви приєднаєте повідомлення? Ви мали на увазі видалити?
NeverEndingQueue

Так, по суті. Сказавши, що ви закінчили це повідомлення
Метью Керрі

15

Інша справа: Kinesis може викликати лямбда, тоді як SQS не може. Таким чином, з SQS вам або потрібно надати екземпляр EC2 для обробки SQS-повідомлень (і вирішувати це, якщо він не працює), або вам доведеться мати заплановану лямбда (яка не масштабується вгору або вниз - ви отримуєте лише одну хвилину) .

Редагувати: Ця відповідь більше не є правильною. SQS може безпосередньо запустити Lambda станом на червень 2018 року

https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html


1
-1 Не погоджуюсь. Хоча Kinesis може викликати лямбда, це не дає переваги перед запланованою лямбда SQS. Останній буде плавно масштабуватися (тобто, якщо це займе більше хвилини, то лямбда розгориться). Ціна вказана за розрахунковий час, тому різниці там також немає. І якщо вам потрібно більше 5 одночасних лямбда, тоді просто додайте кілька тригерів, запланованих на кілька секунд (використовуючи cron). Це не привід використовувати Kinesis над SNS / SQS.
Стівен де Салас

5
Я не впевнений, що я згоден з незгодою;] - ви можете запланувати одну лямбда / хвилину, що обмежить вам пакетну обробку повідомлень, що надійшли в цей інтервал. Kinesis дозволить вам негайно прочитати повідомлення. Або я щось неправильно зрозумів?
Моссі

Існує величезна різниця між парочками хмарних годин і сотнями, коли потрібно викликати лямбда, що тягне проти SQS.
Кодування свині

14
Lambda тепер підтримує SQS як тригер!
шістдесят біт

11

Моделі ціноутворення різні, тому залежно від конкретного випадку використання те чи інше може бути дешевшим. Використовуючи найпростіший випадок (не включаючи 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 долара на місяць.

Kinesis стягує $ 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 невеликий, скажімо, 1 кбіт або менше?
mcmillab

1
@mcmillab SQS стягуватиме те саме, чи ваше повідомлення становить 1 Кб або 64 Кб - див . сторінку ціноутворення SQS Amazon . Отже, якщо ваші повідомлення становлять лише 1 КБ, SQS обійдеться в 64 рази стільки, скільки цифри, які я наводив вище, якщо ви надсилаєте однаковий загальний обсяг даних. Однак один запит може містити до 10 повідомлень, тож якщо ви зможете групувати повідомлення разом, це може бути лише 6 разів (залежно від того, наскільки ваші пакети).
Джон Велоніс

1
@JohnVelonis Наведені вище розрахунки для ціноутворення на SQS не мають ключової деталі. Необхідна додаткова обережність, щоб зрозуміти, як стягуються запити SQS. 1 запит = 1 Дія API. Щоб обробити єдине "повідомлення", необхідно виконати щонайменше 3 дії API: 1 надіслати + 1 прочитати + 1 видалити. Інші функції SQS, такі як зміна видимості, спричинить більше дій API. Цей несподіваний множник є досить неприємним і, як правило, призводить до того, що SQS у 2-10 разів дорожче, ніж Kinesis Streams для великих наборів даних (скажімо, обробка 100 мільйонів повідомлень на місяць).
Влад Поскачеєв

9

Kinesis вирішує проблему частини карти в типовому сценарії зменшення карти для потокової передачі даних. Хоча SQS не впевнений у цьому. Якщо у вас є потокові дані, які потрібно агрегувати по ключу, kinesis гарантує, що всі дані для цього ключа спрямовані на певний фрагмент, а осколок може бути використаний на одному хості, що робить агрегацію ключа ключою легшою порівняно з SQS


5

Додам ще одну річ, яку ніхто більше не згадував - SQS на кілька порядків дорожча.


3
Ти впевнений? З мого розрахунку, Kinesis коштує набагато дорожче, але я ніколи не був талановитим, використовуючи простий калькулятор цін Amazon.
Дідьє А.

Дивлячись на поточні приклади ціноутворення на Aws: Kinesis з 267M повідомленнями коштує близько 60 доларів, тоді як розміщення такої кількості повідомлень через SQS призведе до 107 доларів. Очевидно, що я просто зробив по-справжньому швидке порівняння, і це сильно відрізняється в різних випадках використання, але ця відповідь, безумовно, повинна заслуговувати на деяку заслугу.
Моссі

1
Припустимо, ви любите говорити 2 споживача та 100 мільйонів повідомлень на день. Вартість SNS - 50 доларів / день. Вартість SQS становить 40 доларів на день / споживача або 80 доларів США на день. Кінезис становить 1,4 долара на день для PUT та 0,36 долара / штам. Навіть при 100 осколках (100 Мб / с, 200 Мб / с) це всього 3,60 дол. / День + 1,40 дол. / День. Таким чином, Kinesis за $ 4 / день проти SNS / SQS за $ 130 / день.
Карлос Рендон

@Moszi Як ти дійшов до цього розрахунку? Стандартна черга SQS з 15000000 повідомлень на місяць та 10 Гб передачі даних та передачі даних коштує лише скупі 5,60USD / місяць, тоді як навантаження на 256 КБ (максимум SQS) та ~ 15 000 000 одиниць PUT / місяць (130 штук) у Kinesis коштує 1638,43 USD / міс.
simoncpu

3
Мені було б цікаво дізнатись, чому існує така невідповідність витрат у цій темі.
Томас

2

Випадки використання кінезу

  • Збір даних журналів та подій
  • Аналітика в режимі реального часу
  • Мобільний захоплення даних
  • Лента даних "Інтернет речей"

Випадки використання SQS

  • Інтеграція додатків
  • Роз'єднання мікросервісів
  • Виділіть завдання на декілька робочих вузлів
  • Розв'язуйте запити користувачів наживо від інтенсивної фонової роботи
  • Пакетні повідомлення для подальшої обробки
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.