Рубрики
Без рубрики

AWS Kinesis против SNS против SQS (с примерами Python)

Как выбрать службу развязки, которая соответствует вашим варианту использования? В этой статье мы возьмем тебя, хотя … Tagged с помощью AWS, Python, Server, DevOps.

Как выбрать службу развязки, которая соответствует вашим варианту использования? В этой статье мы возьмем вас, хотя некоторые сравнения между услугами AWS – Kinesis против SNS против SQS – которые позволяют вам отделять отправку и получение данных. Мы покажем вам примеры, используя Python, чтобы помочь вам выбрать службу развязки, которая соответствует вашим варианту использования.

Разъединение предлагает множество преимуществ, но выбор правильного инструмента для работы может быть сложным. Одна только AWS предоставляет несколько услуг, которые позволяют нам отделять отправку и получение данных. В то время как на первый взгляд эти услуги, по -видимому, обеспечивают аналогичную функциональность, они предназначены для различных вариантов использования, и каждый из них может быть полезен, если применить должным образом к решению проблемы.

AWS SQS

Как одна из старейших сервисов в AWS, SQS имеет послужной список предоставления чрезвычайно простого и эффективного механизма развязки. Вся служба основана на отправка сообщений в очередь и разрешение на приложения ( Ex. ECS контейнеры, Lambda функции ) для опроса для сообщений и их обработки. Сообщение остается в очереди, пока какое -то приложение не поднимет его, обрабатывает его и не удалит сообщение, когда оно будет сделано.

Наиболее важным различием между SQS и другими службами развязки является то, что это не услуга Publish-Subscribe. SQS не имеет концепции производителей, потребителей, тем или подписчиков. Все, что он делает, – это предоставить распределенную очередь, которая позволяет:

  • отправка сообщений в очередь,
  • Опрос для сообщений, находящихся в очереди,
  • собирать сообщения из очереди,
  • Удаление сообщения из очереди после того, как сообщение будет успешно обработано.

SQS делает не толкать Сообщения любым приложениям. Вместо этого, как только сообщение отправляется на SQS, заявление должно активно Опрос для сообщений для их получения и обработки. Кроме того, недостаточно забрать сообщение из очереди, чтобы его исчезнуть-сообщение остается в очереди до:

  • он был успешно обработан и удалено из очереди,
  • Тайм -аут видимости имеет истек — Представьте, что одно из контейнерных приложений подобрало сообщение, но при его обработке оно застряло в процессе зомби. Чтобы убедиться, что это сообщение будет обработано, оно становится видимым другим работникам после истечения времени ожидания видимости. Этот тайм -аут может быть установлен от 0 секунд до 12 часов, а по умолчанию – 30 секунд.

Приведенный ниже фрагмент кода демонстрирует, как вы можете:

  • создать очередь,
  • Отправить сообщение в очередь,
  • получить, обрабатывать и удалить сообщение.

Вот Ссылка на Github Gist показывая тот же код, что и ниже.

Пример, показывающий использование SQS в Python — Изображение автором

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

sqs.create_queue ( queuename = queue_name,

Атрибуты = {‘VisibilityOut’: ‘3600’, ‘fifoqueue’: ‘true’})

SNS

Несмотря на то, что SNS означает простую службу уведомлений, он обеспечивает гораздо больше функциональности, чем просто возможность отправлять push -уведомления ( Электронные письма, SMS и мобильный push ). На самом деле, это без сервера Publish-Subscribe System Message System Разрешение отправлять события в несколько приложений ( подписчики ) одновременно ( Fanout ), включая очереди SQS, функции Lambda, потоки данных Kinesis и общие конечные точки HTTP.

Чтобы использовать сервис, нам нужно только:

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

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

Например, представьте себе сценарий, такой простой, как возможность опубликовать одно и то же событие ( Сообщение ) как к разработке ( Постановка ) и производственную среду:

Использование SNS для реализации механизма вентилятора, позволяющего различать ресурсы Dev и Prod-изображение автором

Снова Вот простой сценарий Python это демонстрирует, как:

  • Создайте тему SNS,
  • подписаться на тему SNS,
  • Публикуйте сообщения в тему SNS.

Пример, показывающий использование SNS в Python — Изображение автором

AWS Kinesis Data Streams

AWS предоставляет целый набор услуг в рамках семьи кинезис. Когда люди говорят кинезис, они обычно относятся к Потоки данных кинезиса — Сервис, позволяющая обрабатывать большие объемы потоковых данных в Рядом в реальном времени Используя производители и Потребители работа на Шарсы из Записи данных Анкет

  • Производители Являются ли сценарии, сгенерированные агентами кинезиса, библиотеками производителей или AWS SDK, которые отправляют данные в поток данных .
  • Потребители Являются ли клиентские библиотеки или службы AWS ( AWS Lambda, Kinesis Data Firehose, Kinesis Data Analytics ) Какие данные обрабатывают данные из этих потоки данных .
  • Каждый Поток данных состоит из одного или нескольких Шарсы Анкет
  • A Шард это коллекция Записи данных которые уникально идентифицированы по номеру последовательности.
  • Каждый Запись данных имеет Ключ раздела Чтобы определить, какой Шард хранит конкретный Запись данных . Это должно помочь группировать записи данных, обычно доступные вместе в один и тот же осколок.
  • Каждый Запись данных также имеет Blob Это содержит фактические данные. Эти данные могут храниться в различных формах, если они вписываются в объект Blob 1 МБ.
  • Однажды Запись данных отправляется в Поток данных , он может оставаться там на указанный период хранения от 24 часов до 7 дней.

Помимо потоков данных кинезиса, «семейство кинезис» включает в себя:

  • Kinesis Data Firehose — Сервис, которая автоматически предоставляет записи данных в S3, Redshift, поставщики услуг, такие как DataDog, New Relic, MongoDB или Splunk, а также в другие источники через общие конечные точки HTTP. Предостережение этой службы заключается в том, что он не доставляет данные в данных в реальном времени, а скорее как микро-партии. Данные доставляются в выбранный пункт назначения либо на 60-900 секунд, либо после того, как предварительно определенный размер буфера (1–128 МБ) заполняется.
  • Kinesis Data Analytics — Сервис, которая позволяет нам преобразовать и анализировать данные по мере того, как они входят в поток. Мы можем использовать SQL-подобный интерфейс для преобразования ( Ex. Используйте REGEX для анализа информации из JSON или потоковых журналов ) и собрать понимание путем агрегирования потоковых данных в своевременные ведра ( Ex. 15-минутные ведра ) с помощью скользящего окна агрегации.

Простая демонстрация потоков данных кинезиса

Чтобы продемонстрировать, как можно использовать потоки данных кинезиса, мы запросите текущие цены на рынок криптовалют ( Производитель данных ) и проглатываем их в кинезис поток данных .

Чтобы создать поток данных в консоли AWS, нам необходимо предоставить имя потока и настроить количество осколков:

Создайте поток данных — изображение автором

Затем мы можем начать отправлять цены на рынок в прямом эфире в потоку. В приведенном ниже примере мы отправляем их каждые 10 секунд. Вот ссылка на GitHub Gist с тем же кодом.

Пример, показывающий использование потоков данных Kinesis в Python — Изображение автором

Сценарий будет работать на неопределенный срок, пока мы вручную остановим его.

Использование Kinesis Data Firehose в качестве потребителя данных

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

Мы можем настроить Kinesis Data Firehose отправлять данные на S3 непосредственно в консоли AWS. Нам нужно выбрать наш ранее созданный поток данных, и для всего остального мы можем применить значения по умолчанию.

Создайте поток доставки-изображение автором

Самая важная часть-настройка пункта назначения — В нашем варианте использования мы выбираем S3 и выбираем конкретное ведро:

Создайте поток доставки-изображение автором

Нам нужно настроить, как часто микро-партии данных следует отправлять на S3:

Создайте поток доставки-изображение автором

Затем мы можем подтвердить, чтобы создать поток доставки:

Создайте поток доставки-изображение автором

Вскоре после создания потока доставки мы должны видеть новые данные, прибывающие каждую минуту в нашем ведре S3:

Данные из потока доставки в S3 — Изображение автором

Чтобы увидеть, как выглядят эти данные, мы можем скачать один файл с S3 и проверить его контент:

Данные из потока доставки — Изображение автором

Как контролировать здоровье потоков данных?

Несмотря на то, что потоки данных Kinesis без сервера, это требует надлежащего распределения данных по осколкам. Один из возможных способов отслеживать любые дроссели записи – использовать Dashbird. На изображении ниже мы видим, сколько записей отправляется в поток каждую минуту. Это показывает нам, что мы не всегда получаем ровно 10 записей в минуту.

Потоки данных кинезиса в Решетка — Изображение автора

Решетка Позволяет настроить оповещения на дросселях записи:

Оповещения о потоках данных кинезиса в Решетка — Изображение автора

Так может выглядеть предупреждение, если бы вызвано:

Оповещения о потоках данных кинезиса в Решетка — Изображение автора

Какой сервис вы должны выбрать для вашего варианта использования?

Среди трех услуг из названия Kinesis является наиболее сложным для использования и эксплуатации в масштабе. Лучше всего начать с темы SNS и одной или нескольких очередей SQS, подписанных на нее. Кинезис сияет, когда вам нужно выполнять операции, похожие на карты, на потоковых данных, поскольку он позволяет собирать аналогичные записи и создавать аналитические приложения в реальном времени. В то же время мониторинг потоковой пропускной способности осколков и кинезиса добавляет некоторую дополнительную сложность и увеличивает пространство ошибок, где что -то может пойти не так.

Если вашим единственным аргументом в отношении потоков данных Kinesis является возможность воспроизведения данных, вы можете достичь того же самого, введя функцию Lambda, которая подписывается на тему SNS и загружает все полученные сообщения в некоторую базу данных, такую как DynamoDB или Aurora. Используя временную метку вставки данных, вы бы точно знали, когда было получено конкретное сообщение, которое упрощает отладку в случае ошибок.

Чтобы облегчить выбор службы развязки для вашего варианта использования, я создал таблицу, сравнивая функции и характеристики этих трех сервисов.

SNS против SQS против Kinesis Streams — Изображение автором

Вывод

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

Ссылки и дальнейшее чтение:

Запуска AWS Lambda с SNS

6 распространенных ловушек AWS Lambda с триггером Kinesis

Amazon Kinesis Streams Terminology and Concepts

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

Оригинал: “https://dev.to/dashbird/aws-kinesis-vs-sns-vs-sqs-with-python-examples-3ce3”