В районе Торонто, когда в прошлом году (весна 2020 года) разразилась пандемия COVID-19, одним из последствий (преимуществ?) Стало то, что все предприятия, на которых сотрудники могли разумно работать из дома, в конечном итоге были вынуждены делать это.

Это оказало интересное влияние на рестораны и индустрию общественного питания. В пригородных заведениях общественного питания наблюдался огромный рост продаж, люди покупали обед возле своих домов, а не в центре Торонто. К сожалению, это также означало длинные очереди на вынос, которые обычно занимали бы всего 5 минут.

Некоторые продуктовые магазины перешли исключительно на онлайн-заказы, одним из них была франшиза Bubble Tea под названием Chatime, вы, наверное, слышали о ней, она, по-видимому, самая большая в мире. Это на самом деле вызвало действительно неприятную проблему для тех, кто хотел заказать, включая мою жену и меня.

Учитывая увеличившийся объем заказов, ближайший к нам Chatime «включал» свою систему онлайн-заказов на несколько минут, ждал, пока она заполнится заказами, а затем снова выключала ее, отчаянно пытаясь сохранить вверх (заказы, по-видимому, все еще выполнялись более часа). В течение недели мы с женой много раз пытались сделать заказ, и каждый раз, когда мы попадали на страницу отправки заказа ... Uber Eats сдавался и говорил, что магазин больше не работает, и одновременно с радостью уничтожал бы нашу корзину (спасибо ). Мягко говоря, разочарование.

Так что же нам делать? Продолжайте нажимать F5, пока он не соберется, надеясь поймать магазин, когда он снова откроет свой онлайн-заказ? К счастью, нет.

Войдите в AWS.

Подобные ситуации - одна из причин, по которой мне нравятся облака, в особенности бессерверные технологии. Примерно за день я смог собрать быстрое и грязное бессерверное приложение, которое (эффективно) нажимало бы F5 для нас, а затем отправляло бы SMS-сообщение, чтобы сообщить нам, когда онлайн-заказы снова открываются.

Это сработало! В первый раз, когда мы получили SMS-сообщение, нам удалось оформить заказ!

Введите 2021 год.

Пришло время очистить то, что я построил, и выложить это, чтобы другие могли учиться, переделывать и т. Д.

Для тех, кто не заинтересован в многословном обходе и объяснении, не стесняйтесь пропустить остальное и сразу перейти к коду (хотя бы хлопнуть и следовать за ним было бы неплохо, прежде чем уйти, если вы также чувствуете себя щедрым :)

cdk-serverless-chatime-ordering-helper - https://github.com/aaronbrighton/cdk-serverless-chatime-ordering-helper

Что касается остальных, давайте погрузимся в это!

Amazon Pinpoint для двустороннего SMS

Прошлой весной по какой-то причине (возможно, эта функция еще не была доступна, кто-нибудь, пожалуйста, поправьте меня в комментариях) я не мог найти способ экономически эффективно обрабатывать входящие SMS на AWS. Таким образом, первоначальная реализация фактически использовала SMS от Twilio с Webhooks и API для взаимодействия с SMS.

Очищая код на прошлой неделе, я понял, что могу вырезать Twilio и напрямую использовать Amazon Pinpoint. Что значительно упрощает настройку и объяснение.

Amazon Pinpoint - это… гибкий и масштабируемый сервис исходящих и входящих маркетинговых коммуникаций. Вы можете общаться с клиентами по таким каналам, как электронная почта, SMS, push или голосовая связь.

Pinpoint - это тот элемент, который мне не удалось автоматизировать с помощью IaC (Infrastructure as Code), поэтому, если вы будете следовать инструкциям, вам придется вручную предоставить телефонный номер с длинным кодом для SMS. Это довольно просто сделать в Консоли управления AWS.

Абонент Lambda и Amazon Location Service

Как только SMS-сообщение получено на номер телефона в Amazon Pinpoint, оно передается некоторой настраиваемой логике с помощью темы Amazon SNS (Простая служба уведомлений). Таким образом, двусторонние SMS-сообщения интегрируются с нисходящими услугами в Pinpoint.

Служба определения местоположения Amazon

Другой внешний сервис, который я в конечном итоге заменил в рамках этой очистки, был Google Maps API. Одна из вещей, которые необходимо сделать приложению, - это преобразовать почтовый индекс пользователя (канадский) в координаты LAT / LONG. В первоначальной реализации я использовал для этого Google Maps. На re: Invent 2020 Amazon анонсировала сервис определения местоположения Amazon - так что пора воспользоваться и этим.

Первым SMS-сообщением, которое конечный пользователь отправляет в это приложение, будет его почтовый индекс. Как вы можете видеть из приведенной выше диаграммы, мы затем обращаемся к внешнему API, размещенному на Chatime. Их API ожидает, что пользователь предоставит координаты LAT / LONG, поэтому сначала мы выполняем перевод с помощью службы местоположения Amazon, а затем POST в API местоположения Chatime. Мы получаем список местоположений Chatime рядом с координатами пользователя, а также такую ​​информацию, как URL-адрес онлайн-заказа Uber Eats. Отрывок кода ниже:

Регистрация магазина для мониторинга

Прежде чем мы начнем мониторинг, необходимо провести второй обмен данными между приложением и конечным пользователем. Мы возвращаем им список трех ближайших к нам мест Chatime, где есть интернет-магазин Uber Eats. Затем они должны ответить идентификатором магазина, в котором они хотят отслеживать / заказывать.

Как только выбранный идентификатор магазина будет получен приложением (он также будет передан в Lambda подписчика). Мы создаем тему Amazon SNS для этого магазина Chatime с URL-адресом Uber Eats в качестве тега (для «надежного хранения»). Наконец, мы подписываем конечного пользователя на эту тему в соцсети, используя «sms» в качестве протокола.

Исследование, часть 1: Amazon EventBridge и Populator Lambda

Следующая часть нашего приложения - это первая половина части мониторинга. Мы хотим проверять страницы магазина Uber Eats Chatime хотя бы раз в минуту. Поэтому мы используем наш надежный бессерверный cron AKA Amazon EventBridge (ранее - CloudWatch Rules).

Populator Lambda

Заполнитель Lambda просканирует ранее созданные темы SNS, представляющие магазины Chatime, подлежащие мониторингу, и заполнит очередь Amazon SQS (Simple Queuing Service) сообщениями, содержащими URL-адрес Uber Eats (из тегов тем SNS) и тему SNS. Сам ARN.

Проверка, часть 2: Amazon SQS и Worker Lambda

На последних этапах наш Amazon SQS настроен на «разветвление» сообщений в Worker Lambda с размером пакета 1 (это означает, что только 1 SQS-сообщение будет отправлено в Lambda за раз - мы не хотим перегружать ;) страницы внешнего магазина Uber Eats.

Наша Worker Lambda выдает GET для страницы магазина и проверяет, есть ли вхождения слова «В настоящее время недоступно» - это то, что происходит, когда магазин отключает возможность онлайн-заказа.

Если вхождение обнаружено, Lambda просто завершает работу и пытается повторить попытку примерно через 60 секунд. Если вхождение не обнаружено, мы публикуем его в созданной ранее теме в социальных сетях, в результате чего всем желающим будет отправлено SMS-сообщение, если онлайн-заказ в этом магазине поступил онлайн.

Проверка, часть 3: пошаговые функции AWS и Lambda для отмены подписки

Наконец, мы хотим удалить подписку конечного пользователя, поскольку мы сделали свою часть работы. Одна из «ловушек» тем в социальных сетях заключается в том, что если вы публикуете их, а затем сразу же пытаетесь удалить эти темы, есть вероятность, что не все уведомления будут отправлены.

Удаление темы может помешать доставке подписчикам некоторых сообщений, ранее отправленных в эту тему. - AWS SDK для Javascript (deleteTopic)

Итак, у нас есть пара вариантов:

Сон лямбда, вероятно, первая мысль, которую кто-то может придумать, но это не очень хорошо по ряду причин. Один из них заключается в том, что вы платите каждую миллисекунду, которой работает Lambda ... так что это просто финансово расточительно.

С помощью пошаговых функций мы можем определить шаг «Ждать», скажем, 30 секунд, перед выполнением дополнительной пользовательской логики (наша лямбда-функция отмены подписки).

Лямбда, отписавшаяся от подписки

Наш последний шаг в этом приложении - полностью удалить тему SNS вместе со всеми ее подписками, это то, что делает эта Lambda, код очень простой.

Как мне самому это развернуть?

Я не буду вдаваться в подробности, поскольку в значительной степени это уже задокументировано в README.md репозитория cdk-serverless-chatime-ordering-helper.

Если у вас есть опыт работы с CDK (AWS Cloud Development Kit), это должно быть довольно просто. Если у вас нет опыта работы с CDK, настоятельно рекомендую вам ознакомиться с ним! Это кардинальное изменение в облачной разработке, особенно в бессерверных архитектурах.

Здесь есть действительно потрясающий семинар по CDK с небольшими затратами времени: https://cdkworkshop.com/

В заключение… как это выглядит для конечного пользователя?

Вам было трудно представить себе, что происходило повсюду? Надеюсь, это поможет:

Спасибо за прочтение!

Если вы нашли этот контент ценным, нажмите кнопку хлопка и подпишитесь, прокомментируйте, что вам понравилось или не понравилось, и дайте мне знать, что мне следует осветить дальше!

Больше контента на plainenglish.io