Amazon S3 — это мощный сервис внутри экосистемы AWS. Вы можете использовать его для хранения петабайт данных, размещения статических веб -сайтов, создания данных и многих других вариантов использования.
Сегодня мы рассмотрим одного из незамеченных героев Amazon S3, уведомлений о событиях. Мы рассмотрим, как мы можем использовать уведомления о событиях в качестве автобуса событий для архитектуры, управляемой событиями.
Событие что за что ???
Мы могли бы часами говорить о архитектурах, основанных на событиях. На самом деле, есть много книг, которые сосредоточены только на этой теме. Но мы не собираемся погружаться в этот уровень детализации здесь.
Вместо этого собирался упростить Архитектура, управляемая событиями Анкет Для нашей цели архитектура, управляемая событиями,-это система системы, которая использует события для общения. Событие — это изменение в состоянии. Он может нести информацию о государстве с ним или просто быть уведомлением.
Услуги в архитектуре производят события, мы называем их производителями. Между тем, есть и другие услуги, которые потребляют мероприятия, которые мы называем потребителями. Нет ничего, что говорит, что услуга не может производить и потреблять события одновременно.
Теперь, когда у нас есть представление о том, что такое архитектура, основанная на событиях, давайте построим один!
Автобус событий
То, что мы собираемся построить, — это образец архитектура, которая использует Amazon S3 в качестве автобуса событий. Но что такое автобус в любом случае?
В целом, автобус событий похож на центральный центр для архитектуры, основанной на событиях. Именно там, где все услуги производителей пишут свои мероприятия, и потребительские услуги их поднимают. Есть несколько вариантов дизайна, когда речь заходит о том, как ваш автобус публикует сообщения.
Подход № 1: опубликовать все для всех
Это самая простая реализация для шины событий. Он получает мероприятие и публикует это событие для всех подписчиков.
Это имеет некоторые уникальные преимущества и недостатки для других подходов. Одним из преимуществ является то, что это делает бис событий очень легко рассуждать. Любой продюсер событий может опубликовать сообщение в автобусе, и оно уведомит всех подписчиков автобуса. Ответственность и логика автобуса ясны и кратко.
Недостатком является то, что все подписчики получат мероприятие, даже если они не могут работать на нем или заботиться об этом. Потребители должны построить некоторую логику фильтрации, чтобы отфильтровать события, которые они получают, но не заботятся.
Подход № 2: События фильтрации для потребителей
Продюсеры продолжают публиковать все свои мероприятия в автобусе. Но события фильтруются для потребителей. Позволяя производителям продолжать публиковать все мероприятия, но потребители получают только те, которые их заботятся.
Это устраняет недостаток Подход № 1
Анкет Теперь потребители могут ожидать получить только события, которые они заботятся.
В этом подходе есть недостаток. С подходом фильтра потребители должны subrcribe к фильтру в дополнение к автобусе событий. Они подписываются на события, поступающие из автобуса и Зарегистрируйте фильтр только для конкретных событий.
Публикуйте все для всех архитектуры
Теперь, когда мы понимаем немного больше о автобусах событий и о том, как они могут публиковать события, пришло время взглянуть на одного в AWS. Для целей этого поста мы собираемся сосредоточиться на Amazon S3 как на автобусе событий. Давайте посмотрим на первый подход — опубликуем все для всех с точки зрения S3.
S3 часто рассматривается как общая служба хранения объектов. Но на самом деле у него есть много других функций, чем просто хранение обильных объемов данных. Мы собираемся использовать одну из этих функций, уведомления о событиях, чтобы превратить ведро S3 в автобус.
Мы собираемся опубликовать все для всех, поэтому мы можем добавить одно уведомление о событии, которое подтолкнет новые события всем потребителям. Архитектурная схема высокого уровня этого первого подхода выглядит следующим образом:
Производители напишут свои мероприятия в ведро S3. Мы настроим уведомление о событии на ведре для Любые новые объекты Создан в ведре. Когда новое событие записано продюсером в ведро, затем уведомляется уведомление всем потребителям.
Но как это толчок на самом деле случилось? Когда объект создается в ведре, уведомление о событии поднимается. Но мы должны сказать ведро, куда отправить уведомление. Amazon S3 из коробки позволяет нам отправлять события в любое из следующих направлений.
- Amazon Simple Servication Service (Amazon SNS) Тема
- Amazon Simple Queue Service (Amazon SQS) очередь (не FIFO)
- AWS Lambda
Поэтому нам нужно немного уточнить нашу предлагаемую архитектуру. Благодаря нашему нынешнему подходу потребители не могут получить мероприятия, потому что они ни на что не подписаны. Нам нужно настроить ведро для отправки уведомлений о событиях где -нибудь. На данный момент давайте настроим наши уведомления о событиях S3, чтобы перейти к теме SNS.
Теперь продюсеры напишут свои мероприятия в ведро S3. События подтолкнут уведомления к теме SNS. Потребители этих событий могут подписаться на тему SNS, чтобы получить их. Как только потребитель получает уведомление, он может получить ключ от S3, который вызвал уведомление. В рамках этого ключа, хранящегося на S3 событие, написанное продюсером.
Фильтруя события в архитектуру потребителей
С архитектурой, предложенной выше, все события производителей отправляются всем подписчикам. Это означает, что любой продюсер событий, который пишет событие в ведро S3, уведомит тему SNS, и, таким образом, все потребители подписались на эту тему.
Это нормально, если все потребители должны увидеть каждое событие. Но это, вероятно, не так. Более вероятно, что данный потребитель заботится только об одном типе событий, а не о весь корпус событий. Таким образом, с архитектурой сверху, потребительская служба должна иметь какой -то фильтр, чтобы игнорировать события, о которых они не заботятся.
Это действительный подход. Но что, если бы мы могли вытолкнуть фильтрацию из данной службы и вниз на автобус. Тогда каждая потребительская служба будет получать только те события, которые им действительно заботятся.
Оказывается, есть несколько способов, которыми мы могли бы сделать это.
Уведомление о событиях и тема SNS для продюсера
Одним из подходов было бы, чтобы производители событий писали в свой собственный префикс в ведре S3. Тогда у нас может быть уведомление о событии для каждого префикса ключа в ведре, которое перемещается на его собственную тему SNS.
Эта предложенная архитектура решает нашу проблему фильтрации. Каждый Тип Производитель событий может написать в свой собственный префикс, Fooproducer
пишет в /foo/
в ведре S3. Тогда мы можем настроить уведомление о событии для каждый Префикс в ведре, чтобы перейти к отдельной теме SNS. Итак, когда Fooproducer
пишет событие в /foo/
Уведомление о событии подталкивается к теме SNS для этого конкретного префикса.
Ключевой префикс имеет ровно одно уведомление о событии и тема SNS. Потребители, которые заботятся об этих событиях, могут подписаться на тему SNS для этого типа производителя.
Это работает, но у него есть некоторая сложность и недостатки.
Во -первых, есть намного больше инфраструктуры и движущихся предметов. Каждый Тип Производитель событий должен иметь префикс ключа в ведре, уведомление о событии S3 и тему SNS.
Во -вторых, существует ограничение на количество уведомлений о событиях, которые вы можете иметь на одном ведре S3. Скажем, этот предел составил 100, тогда у вас может быть только 100 различных производителей событий, которые пишут в ведро. Может быть, это проблема, может быть, это не так, но это ограничение.
Наконец, это меняет ответственность с потребителей на производителей. Теперь вместо того, чтобы потребители фильтруют события, которые они получают, производители должны помнить, чтобы написать специальному префиксу. Это не сложно, но можно написать неправильному префиксу и перенести неправильное событие не тому потребителю.
Уведомление о событии и тема SNS с фильтрацией
Есть еще один способ отфильтровать события для потребителей. Что если мы расширили функциональность нашего оригинала Публикуйте все для всех архитектуры
архитектура.
Эта архитектура в его нынешнем виде подтолкнет каждое событие каждому потребителю. Это означает, что потребители должны иметь логику внутри них, чтобы пропустить события, которые им не волнуют.
Что, если бы мы могли заставить тему SNS, сделать эту фильтрацию от нашего имени? Мы удалили бы необходимость фильтровать внутри потребителя и удалить несколько тем SNS.
Итак, как мы можем добраться до этой модели?
Один подход, этот S3 не В настоящее время поддержка будет определять атрибуты тематического сообщения SNS в уведомлении о событии S3.
Атрибуты сообщения — это полезная нагрузка, которую вы можете включить в уведомление SNS. Это не что иное, как пары ключей, которые действуют как метаданные в уведомлении. С SNS Message Filtering Ваши подписчики могут подписаться на получение только тех сообщений, которые содержат атрибут сообщения, о котором они заботятся.
В сочетании с уведомлениями о событиях S3 мы хотим определить уведомление о событии S3 с помощью атрибута сообщения. Затем это может быть передано в тему SNS, когда событие будет вызвано. Вот пример того, как будет выглядеть эта идея:
Это все еще имеет ограничение вокруг уведомлений о событиях, и производители все еще пишут на свой собственный префикс. Но теперь эти уведомления могут подтолкнуть к одной теме SNS.
С этой идеей все продюсеры продолжают писать свои события на S3, как и раньше. В ведро есть уведомления о событиях, настроенные для продвижения событий к одной теме SNS. Но ** Каждая конфигурация уведомления настроена на передачу атрибута сообщения в тему SNS. Этот атрибут сообщения может быть чем -то вроде оказание услуг: Fooproducer
Анкет
Позволяя Fooconsumer
Чтобы получить только события от Fooproducer
через фильтрацию сообщений SNS.
Звучит отлично, верно? За исключением того, что в настоящее время это невозможно с событиями S3. Вы не можете настроить события S3, которые подталкивают к теме SNS, чтобы передавать любые атрибуты сообщения.
Итак, с этой идеей за столом, что еще мы можем сделать?
Оказывается, мы можем создать аналогичное поведение, добавив дополнительный шаг к нашим производителям. В настоящее время продюсер пишет свои события для BUS, в нашем случае это S3. Затем производитель полагается на автобус мероприятия, чтобы доставить это мероприятие потребителям. Мы видели это в более ранних примерах по уведомлениям о событиях, подталкивающих нашу тему SNS.
Если мы добавим дополнительный шаг к нашим производителям, мы сможем получить фильтрацию сообщений SNS. Продюсер пишет событие в ведро S3. Затем он отправляет сообщение в тему SNS формы ниже:
{ "eventStore": "", "eventPath": "/foo/my-event-xyz" }
Когда производитель отправляет сообщение SNS, он также устанавливает атрибут сообщения в что -то вроде оказание услуг: Fooproducer
Анкет Затем потребители могут подписаться и заявить, что они хотят только сообщения, которые имеют этот атрибут.
Вот как будет выглядеть наша архитектура для этого подхода:
Как мы видим, продюсеры все еще пишут свои события S3 (Bubble 1
). Но теперь после того, как они пишут их, они отправляют сообщение в общую тему SNS, которую слушают потребители (Bubble 2
).
При таком подходе мы вообще удалили уведомления о событиях S3. S3 больше не наш Мероприятие автобус а скорее наш Хранение событий Анкет При таком подходе тема SNS является фактическим автобусом событий, который доставляет мероприятия потребителям.
Потребители теперь могут получать только мероприятия производителя, которые им заботятся. После того, как они получат уведомление о теме SNS, которое они заботятся, они могут затем захватить событие, которое продюсер написал S3. Вся информация о том, где найти событие в сообщении SNS.
Что мы узнали?
Мы взглянули на вступительные концепции, связанные с архитектурами, основанными на событиях. Нам нужно было застегнуть себя в концепцию автобуса, прежде чем посмотреть, как Amazon S3 может действовать как один.
Мы рассмотрели два разных подхода для получения мероприятий от производителей к потребителям в архитектуре, основанной на событиях. В частности, мы рассмотрели, как автобус событий может выбрать каждое событие для каждого потребителя или как мы можем фильтровать события для потребителей.
Мы погрузились в то, как обе эти концепции можно использовать внутри AWS. Мы исследовали, как S3 с уведомлениями о событиях может опубликовать все события в одну тему SNS, на которую подписываются потребители.
Спрыгивая с этой идеи, мы взглянули на то, как мы можем фильтровать события, опубликованные S3 для потребителей. В частности, мы могли бы установить префиксы в ведре S3 для каждого типа производителя событий. Каждый из этих префиксов может иметь свою собственную тему SNS. Затем потребители могут выбрать, на какие темы SNS они хотят подписаться, чтобы получить только мероприятия от производителей, которые им заботятся.
Это был жизнеспособный подход, но требовал немало дополнительной инфраструктуры. Поэтому мы исследовали, как было бы хорошо, если бы мы могли иметь одно уведомление о событии к одной теме, но добавили атрибуты сообщения SNS к событию. Если бы это было возможно с уведомлениями о событиях S3, мы могли бы затем отфильтровать события в потребителей через эти атрибуты сообщения. К сожалению, это еще не поддерживается уведомлениями о событиях S3.
Так что это привело нас к подходу, который дал нам что -то подобное. Вместо того, чтобы полагаться на уведомления о событиях S3, у нас есть продюсеры отправлять сообщение в центральную тему SNS. Эти производители все еще пишут свои события S3. Но они публикуют сообщение в тему SNS с набором атрибутов сообщения, например Сервис
Анкет Это позволяет потребителям подписаться на тему и выбирать атрибуты сообщения, для которых они хотят получить сообщения. Это изменило определение S3 с автобуса событий на хранение событий, но это жизнеспособный обходной путь.
Вывод
Amazon S3 — это услуга мощности в экосистеме AWS. Помимо высокой долговечности и доступности, он предлагает множество основных функций, которые вписываются в различные архитектуры.
В этом посте мы сосредоточились на уведомлениях о событиях S3 и на том, как они используются, чтобы превратить ведро в автобус. Мы также исследовали ограничения этой идеи.
Надежда состоит в том, что вы можете принять концепции, которые мы рассмотрели здесь, и применить их к своим собственным проектам. Или, по крайней мере, возьмите эти концепции и распознайте ограничения, которые они могут ввести, и определить, что они не будут работать.
Хотите проверить другие мои проекты?
Я большой поклонник сообщества разработчиков. Если у вас есть какие -либо вопросы или вы хотите поговорить о различных идеях, касающихся рефакторинга, Обратитесь в Twitter или бросить комментарий ниже.
Вне блогов я создал Учитесь AWS, используя его курс Анкет В курсе мы сосредоточены на изучении веб -сервисов Amazon, фактически используя его для размещения, защиты и доставки статических веб -сайтов. Это простая проблема со многими решениями, но она идеально подходит для наращивания вашего понимания AWS. Недавно я добавил две новые бонусные главы к курсу, которые сосредоточены на инфраструктуре в качестве кода и непрерывного развертывания.
Оригинал: «https://dev.to/kylegalbraith/how-to-use-amazon-s3-as-an-event-bus-in-your-next-architecture-4oe9»