В этом году я посетил 2 дня конференции в Devoxx UK, проходившей в Лондоне 10–11 мая. Эта статья является кратким изложением моих заметок. Если вас интересуют более подробные сведения о выступлении, вы можете посмотреть соответствующее видео.

Будущее без серверов с Данило Поччиа

Как создать лучшее программное обеспечение с лучшим пользовательским интерфейсом?

Работайте в обратном направлении от клиента и до начала реализации:

  • Написать пресс-релиз
  • Напишите FAQ
  • Определить клиентский опыт
  • Написать руководство пользователя

Идея состоит в том, чтобы сделать вашу систему простой. Сложная система вначале была простой, а стала сложной!

Архитектура меняется

  • 10 лет назад: мы разделяем наши монолитные приложения, используя XML и SOAP для связи
  • 5 лет назад: мы создаем архитектуру микросервисов с использованием REST/JSON или бинарного протокола для связи
  • Сейчас: мы создаем событийно-ориентированную архитектуру с эфемерными функциями.

А как насчет данных?

Хранилища данных становятся источником событий. Каждое событие – это неизменная информация о бизнесе.

Происходит переход от ACID (атомарный, последовательный, изолированный, устойчивый) к ACID 2.0 (ассоциативный, коммутативный, идемпотентный, распределенный).

При проектировании, управляемом событиями, мы думаем о причине/следствии, а не о триггерах: «Услуга B вызывается A» вместо «Услуга A вызывает B». Мы используем механизм уведомления и подтверждения.

Итак, как будет выглядеть будущее?

Мы напишем только код бизнес-логики!

Давайте поленимся: исследуя реальную силу потоков, с Венкатом Субраманиамом

Венкат Субраманиам очень хороший оратор. Я впервые услышал его, и я был впечатлен его манерой изложения, я предлагаю вам посмотреть одно из его видео.

Haskell по умолчанию является ленивым языком. В Scala это возможно с помощью ключевого слова «ленивый». Но как насчет Java? Ключевого слова «ленивый» не существует, но это возможно с функциональным кодом и потоками, представленными в Java 8.

Императивный код отличается высокой церемонностью и акцидентальной сложностью. Вы говорите, что и как делать.

В функциональном коде меньше церемоний и меньше сложности. Вы говорите, что делать. Очень легко читать сверху вниз.

Однако, если код «симпатичный», он может оказаться неустойчивым. Так что насчет производительности? Например. Должны ли мы вычислить всю коллекцию, чтобы взять только первую? FindFirst() — это терминальная операция выполнения. Пока мы его не вызовем, ничего (т.е. все промежуточные операции) выполняться не будет.

Stream не выполняет функцию для каждого объекта в коллекции, вместо этого он выполняет набор функций для каждого объекта, но только по мере необходимости.

Поток — это не набор объектов, это набор функций.

Лямбда не имеет гражданства.

List<Integer> numbers = Arrays.asList(1, 2, 3);
Stream<Integer> stream = numbers.stream()
                            .map (e -> e * 2); // This is a lambda
stream.forEach(System.out::println);

Замыкания имеют неизменяемое состояние, будьте очень осторожны при их использовании.

List<Integer> numbers = Arrays.asList(1, 2, 3);
final int factor = 2;
Stream<Integer> stream = numbers.stream()
                   .map (e -> e * factor); // This is a closure
stream.forEach(System.out::println);

Лень делает возможным использование бесконечных потоков, иначе приведенная ниже программа была бы бесконечным циклом.

Stream<Integer> infiniteStream = Stream.iterate(0, e -> e + 1);
List<Integer> numbers = infiniteStream 
                          .limit(5)
                          .collect(Collectors.toList());

Kotlin для программистов Java, с Венкатом Субраманиамом

Я остался в той же комнате, так как мне очень нравится первое выступление Венката. При таком же способе подачи, это второе выступление также было очень хорошим.

Поскольку я никогда не экспериментирую с Kotlin, для меня это было хорошим введением. Этот язык на основе JVM в наши дни становится действительно популярным, особенно с учетом того, что Jetbrain продвигает его как основной язык программирования для Android. Венкат дал нам много разных трюков, чтобы сделать код лаконичным, и предложил поиграть с ним самим, используя REPL (kotlinc). Без сомнения, он менее многословен, чем Java, и обладает очень хорошими функциями (включая нулевую безопасность и ключевое слово lazy…). Я, вероятно, дам ему попробовать в какой-то момент.

Как использовать AI и Java для обучения вашего приложения распознавать людей по именам, с Рут Якубу

Рут представила нам Microsoft Face API, работающий на платформе облачных вычислений Azure. Face API — это одна из когнитивных услуг, предоставляемых Microsoft, например. есть сервис для распознавания речи и обработки естественного языка.

Она показала нам приложение, написанное с помощью Spring Boot, которое взаимодействует с Face API. Сначала она загрузила набор фотографий актера Мэтью МакКонахи (если вы его не знаете, он был главным героем «Интерстеллара») для обучения модели. Затем она загрузила новую фотографию его и его жены, которую система еще не знала. Алгоритм с высокой точностью распознает, что это был актер, хотя он не знал, кто эта женщина, но смог дать ее точное описание (улыбающаяся женщина лет тридцати и т. д.).

С помощью Java можно построить собственный алгоритм машинного обучения, например, используя библиотеку DeepLearning4J. При создании модели важно разделить данные на 2 группы: обучающие данные (80%) и тестовые данные (20%), чтобы вы могли убедиться, что ваша модель дает хороший прогноз. Также важно использовать GPU не только CPU для повышения производительности, сейчас этим пользуются библиотеки, в том числе DL4J.

Создание самоуправляемой радиоуправляемой машины с Тимом ван Эйндховеном

Это был интересный разговор о создании самоуправляемого (игрушечного) автомобиля на основе комплекта радиоуправления (RC). Они строят этот прототип как часть задачи. Идея состоит в том, чтобы заставить автомобиль двигаться автономно и следовать по маршруту (путь, ограниченный двумя белыми линиями) с потенциальными поворотами и препятствиями.

Если Тесла может это сделать, то почему не мы? В наших масштабах, конечно…

Вдобавок к комплекту RC они добавили Raspberry Pi, преобразователь/блок питания, камеру и безопасное отключение (полезно, когда машина выходит за пределы зоны действия Wi-Fi, чтобы она где-нибудь не разбилась…). Общий бюджет около 300 евро.

Что касается технологий, которые они используют:

  • Vert.x, реактивное приложение на JVM, управляемое событиями и неблокирующее
  • Библиотека OpenCV (Computer Vision) для обработки видеопотока в режиме реального времени и проверки движения автомобиля по белым линиям.

Есть много вещей, о которых нужно подумать, окружающая среда, вероятно, самая сложная. Алгоритм может потеряться в зависимости от:

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

У них много идей по улучшению на будущее:

  • Нет необходимости анализировать все изображения, поступающие из видеопотока (особенно на прямой линии). В настоящее время они анализируют одно изображение каждые 100 мс (почему 100 мс? потому что для обработки одного изображения требуется столько времени)
  • Не нужно анализировать все изображение (какую-то часть можно отбросить, то, что выше горизонта, не нужно)
  • Выполнение вычислений на самом автомобиле, а не на ноутбуке через WiFi, чтобы избежать задержки в сети (однако вычислительная мощность Raspberry Pi может быть ограничена)
  • Используйте ИИ и алгоритм глубокого наклона, чтобы автомобиль лучше ориентировался с помощью обучающего набора: видео, когда автомобилем управляет человек удаленно (однако на создание множества треков и съемку множества видео могут уйти годы)

Cloud Native Java, вторая часть, с Джошем Лонгом

Джош является адвокатом разработчиков Spring в Pivotal, и я впервые присутствовал на одном из его выступлений. Мне это очень понравилось, и я был очень впечатлен скоростью речи и кодирования одновременно, не забывая при этом множество шуток. Такой блестящий оратор.

Джош использовал https://start.spring.io/ для создания небольшого проекта для управления бронированием с использованием Spring Cloud (построенного на Spring Boot). Почему вы должны использовать этот онлайн-инструмент для инициализации вашего проекта? Посмотрите видео, чтобы получить ответ от Джоша, это было весело!

Он выбрал Kotlin для службы (почему бы и нет?) с некоторыми конечными точками для получения сообщений и резервирований с использованием реактивного хранилища данных MongoDB. Служба загружала некоторые данные во время запуска.

Он выбрал Java для клиента, используя различные технологии, поставляемые вместе со Spring (Eureka, безопасность Spring, Hystrix для внутреннего балансировщика нагрузки и запасных вариантов). Клиент смог запросить службу для получения данных.

В конце демонстрации он также показывает нам бессерверную архитектуру с использованием RIFF, FaaS для Kubernetes. Он написал функцию для перевода строки в верхний регистр, а затем с помощью командной строки вызвал функцию, развернутую в Kubernetes. Он не успел показать нам звонок из сервиса, но мы поняли.

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

Не стесняйтесь продолжать читать, ниже речь пойдет о втором дне, и мы поговорим о машинном обучении!

Глубокое обучение: будущее искусственного интеллекта, с Мэтью Ренце

В прошлом нам приходилось явно программировать компьютер шаг за шагом, чтобы заставить его решить проблему (включая операторы if-then, циклы for и другие логические операции). В будущем машины научатся решать проблемы самостоятельно, нам просто нужно предоставить данные.

Что такое глубокое обучение?

Глубокое обучение — это форма искусственного интеллекта (ИИ), которая использует тип машинного обучения (МО), называемый искусственной нейронной сетью с несколькими скрытыми слоями, в попытке изучить иерархические представления базовых данных, чтобы делать прогнозы на основе новых данных.

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

Использовать (существующие) Данные -› для изучения Функции -› для создания прогноза (для новых данных)

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

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

Нейронная сеть состоит из нескольких нейронов, организованных в разные слои: входной слой (данные, которые мы передаем), 1 или несколько скрытых слоев и выходной слой (прогноз). Глубокая нейронная сеть содержит более одного скрытого слоя. Добавление более одного скрытого слоя, по сути, позволяет нам моделировать гораздо более сложную функцию, чем простой одиночный слой.

Пример глубокого обучения

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

Почему мы говорим о глубоком обучении только сейчас?

Ведь первый алгоритм машинного обучения Perceptron был создан в 1957 году, более 60 лет назад!

  • Мы живем в эпоху больших данных. За последние 2 года мы создали больше данных, чем за всю оставшуюся историю человечества. У нас никогда не было так много доступных данных, эти данные необходимы для обучения сложных моделей.
  • Компьютеры никогда не были такими мощными: более быстрые процессоры, больше памяти, твердотельный накопитель. Мы можем использовать мощь графических процессоров, матричные операции необходимы для графики видеоигр, а также для машинного обучения. У нас также есть доступ к технологиям распределенных вычислений, где мы можем распределять обработку данных между несколькими машинами.

Что мы можем сделать с помощью машинного обучения?

  • Классификация. Мы хотим предсказать дискретную переменную, которая может принимать только определенное количество значений. Это кошка или собака? Это письмо спам или нет? У этого человека рак или нет? Какова категория этой статьи
  • Регрессия. Мы хотим предсказать непрерывную переменную, которая имеет бесконечное число возможных значений. По какой цене мне продать этот дом? Каков кредитный рейтинг этого человека?
  • Генерация текста. Генерируйте заголовок статьи, описание изображения на основе его содержимого, конвертируйте голос в текст для автоматических субтитров.
  • Генерация изображения. Имитировать старение лица, нарисовать нового Рембрандта, которого даже эксперт не смог бы определить как фальшивку, создать знаменитостей, которые выглядят знакомыми, но не существуют, создают образ по описанию.
  • Генерация аудио. Заставьте алгоритм говорить с человеком при телефонном звонке (Google Duplex), измените свой голос на основе текста (редактирование голоса), чтобы избежать повторной записи вашего голоса, если вы ошиблись.
  • Генерация видео. Основываясь на потоке видео и аудио от Барака Обамы, создайте новое видео с синхронизацией губ на базе искусственного интеллекта.

Если вы просмотрели некоторые из приведенных выше примеров, вам, вероятно, будет очень сложно отличить реальный контент от компьютерного. Это довольно страшно, если подумать, и мы с трудом можем себе представить, что будет через 10 лет!

С чего начать, если я хочу заниматься машинным обучением в своей компании?

Вариант 1 — Глубокое обучение как услуга (Google Cloud, AWS, Microsoft Cognitives, IBM Watson…)
В нем участвует сторонняя компания, которой принадлежат модель и данные. По сути, вы можете запросить их API с вашими новыми данными, чтобы сделать прогноз.
Этот вариант хорош для узких случаев использования, если вы не хотите изобретать велосипед и использовать уже обученную модель.
За: Просто, быстро, недорого
Против: Узкий, удаленный (например, вы не защищены от сетевых сбоев или задержек), оплата по факту использования (если ваше использование увеличится, то будет и стоимость)

Вариант 2 — Платформа глубокого обучения (Microsoft Azure, Cognitive Services…)
Этот вариант подходит для нестандартных вариантов использования. Вы загружаете свои данные для обучения модели (перенос обучения), а затем можете запросить API, чтобы получить свои прогнозы.
Плюсы:Просто, быстро, недорого
Минусы: Вам нужны обучающие данные для обучения вашей модели, дистанционно, с оплатой по мере использования (за транзакцию для прогноза, но также и за транзакции для обучения).

Вариант 3. Сделай сам(TensorFlow, Torch…)
Используется, если варианты 1 и 2 не работают. Вы создаете с нуля свой собственный алгоритм, предоставляете данные и размещаете их самостоятельно.
За: Пользовательский (вы можете настроить его по своему усмотрению), локальный, частный (в случае, если вы имеете дело с конфиденциальные данные)
Минусы: сложный, трудоемкий, дорогой

Обучение детей машинному обучению с Дейлом Лейном

Дейл создал веб-сайт для обучения детей машинному обучению с использованием платформы визуального языка программирования Scratch. Scratch — это способ познакомить детей с программированием с помощью простого интерфейса, в котором вы можете перетаскивать блоки, представляющие операции программирования (циклы for, операторы if-then…) и собирать их для создания более сложной логики. Дейл использует ScratchX (экспериментальные расширения для Scratch) и создал новые блоки, связанные с машинным обучением (внутренне используя IBM Watson).

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

  • Создайте чат-бота, например. животное, которое может ответить на вопросы о своем виде.
  • Предсказать газету, из которой была извлечена статья, на основе ее названия.
  • Заставьте Пакмана избегать призраков, играя в игру несколько раз. Чем больше вы играете и тренируете модель, тем лучше становится Pacman.
  • Классифицировать изображения. Загрузка изображений чашек и автомобилей для обучения модели, чтобы она могла классифицировать новое и неизвестное изображение по одной из этих двух категорий. Загружая изображения обложки книги для разных категорий (научная фантастика, мелодрама, триллер…), модель может предсказать категорию новой обложки. Чтобы сделать его более интерактивным, вы также можете загрузить изображения с веб-камеры, например, сфотографировать свою руку для игры камень/ножницы-бумага и сыграть против компьютера. Алгоритм распознает форму, которую вы делаете руками, если вы достаточно натренируетесь.
  • Распознавайте написанный от руки почтовый индекс, чтобы выяснить, в какой город должна быть доставлена ​​почта. Это хороший пример из жизни.
  • Играйте в игры, похожие на Уолли. Компьютер автоматически определяет, где на картинке находится котенок.
  • И многие другие упражнения.

Дейл также упомянул о проблемах ИИ:

  • Проблема с фоном, погодными условиями. Если для человека это очевидно, то компьютер может совершать глупые ошибки, если обучающая выборка неполная.
  • История русских танков, где модель обучалась на изображениях американских танков в высоком разрешении, но на изображениях российских танков низкого разрешения и размытых изображениях. Он действительно плохо идентифицирует танки в реальности.
  • Google photo может автоматически добавлять текст для описания изображения, некоторые чернокожие были отнесены к категории горилл…
  • Модель, которая может консультировать по вопросам медицины, но спонсируется фармацевтической компанией. Что, если компания попросит добавить больше ссылок на свой продукт в набор для обучения, правильно ли это?

Есть много важных понятий, связанных с этикой, предвзятостью, переоснащением модели и качеством обучающей выборки. Важно, чтобы дети понимали это сами, и они обычно это понимают!

В конце Дейл дал несколько ссылок, чтобы идти дальше:

Простые микросервисы с JHipster, с Сендилом Кумаром Н.

Эта презентация была сеансом живого кодирования. Я слышал о JHipster некоторое время назад, но никогда не имел возможности увидеть его в действии, и тот факт, что проект был инициирован французским разработчиком, был еще одной причиной.

JHipster ускоряет создание новых приложений, генерируя шаблонный код и работая с большей частью конфигурации (например, с конфигурацией для Kubernetes, файлами Maven POM и т. д.). Это инструмент командной строки, в котором вы можете создать монолитное приложение, микрослужбу или UAA (службу учета и авторизации пользователей для защиты вашего приложения с помощью OAuth2). После того, как вы выбрали тип приложения, вы можете выбрать множество вариантов для своего технического стека: внешний интерфейс, серверная часть, источник данных, сборка, ведение журнала, развертывание CI/CD, реестр служб, документация (например, Swagger), фреймворки для тестирования.

Для демонстрации Sendil создал шлюзовое приложение, которое опрашивало приложение микросервиса. Он запустил приложение локально, а затем развернул его на Google Cloud Platform (GCP) через Kubernetes, не вводя ни одной строки кода.

Решить, какие фреймворки и технологии вы хотите использовать, вероятно, будет сложной задачей, поскольку вариантов так много. Также вы должны помнить, что вам нужно настроить конфигурацию (например, конфигурация по умолчанию, которую они предоставляют для Kubernetes, может не соответствовать вашим потребностям).

Устранение неполадок и отладка рабочих микросервисов в Kubernetes, с Рэем Цангом

Рэй показывает нам небольшое приложение гостевой книги, в котором пользователь может опубликовать сообщение с именем (сервис гостевой книги), а также получить приветствие после публикации (сервис приветствия). Это приложение Spring Boot, развернутое в Kubernetes и состоящее из пользовательского интерфейса и двух микросервисов (каждый с несколькими экземплярами). Когда он пытался получить к ней доступ, появлялась страница с ошибкой 500, указывающая null и ошибку 404. На этот раз это был не демонстрационный эффект или иллюстрация закона Мерфи, а часть презентации. Он шаг за шагом прошел процесс отладки проблемы, используя различные инструменты, предоставляемые Google Cloud Platform.

Просматривая журналы, он смог определить 2 экземпляра службы пользовательского интерфейса, в которых было много ошибок по сравнению с другими экземплярами. Убить/перезапустить их — это не решение, так как это не предотвратит повторения ошибки. Поэтому он решил вывести один из неисправных экземпляров из балансировщика нагрузки с помощью одной команды в kubectl (интерфейс командной строки для запуска команд против кластеров Kubernetes), изменив serving установить флаг false. Идея состоит в том, чтобы изолировать его от производственного трафика и свободно отлаживать его. Обратите внимание, что при отключении экземпляра Kubernetes автоматически запускает новый экземпляр службы. Затем он настроил переадресацию портов на этом модуле, чтобы иметь возможность запрашивать этот конкретный экземпляр локально. С помощью Stackdriver Trace он смог увидеть отслеживание звонков. Отфильтровав ошибки 5xx и конкретный экземпляр, он затем понял, что проблема возникла на уровне службы Hello, когда вызывается конечная точка hello, но в ответ возвращается 404. Похоже, это тот случай, когда имя отсутствовало. Чтобы подтвердить поведение, он на лету добавил журнал для отображения имени, и действительно, оно было пустым, а приложение давало сбой. По сути, в форме отсутствовала некоторая проверка, чтобы сделать имя обязательным.

Подводя итог, можно упомянуть 4 основных инструмента отладки, поставляемых с GCP:

  • Просмотр и запрос журналов с помощью Stackdriver Logging (инструмент, похожий на Splunk)
  • Отслеживание всех вызовов с помощью Stackdriver Trace (инструмент, похожий на Zipkin)
  • Добавление журналов отладки и точек останова на лету в экземпляр продукта с помощью Stackdriver Debug
  • Наличие истории ошибок в журналах, а также различных показателей по службам (время отклика…) с помощью Stackdriver Monitoring.

Это была хорошая презентация, но я могу только сожалеть, что в заголовке не упоминается тот факт, что демонстрация будет в основном использовать коммерческие инструменты Google Cloud, я думал, что она будет больше сосредоточена на Kubernetes. Но все же стоит знать, что предоставляет Google. Я должен признать, что игра с точками останова и добавление журналов в код удаленного экземпляра продукта, все из веб-интерфейса, была весьма впечатляющей.

Полностью бессерверное решение, тематическое исследование со Стивеном Коулбурном и Крисом Кентом.

В OpenGamma создали новую финансовую платформу на базе AWS и решили использовать бессерверные технологии (AWS Lambda).

Что такое бессерверные технологии и Lambda?

Бессерверная среда — это, по сути, когда инфраструктура невидима, вы не знаете, где работает код, и у вас нет контроля.
AWS Lambda в основном состоит из двух классов: простого интерфейса и его реализации, где вы реализуете метод handleRequest. Lambda завершает работу после завершения метода.
Вы упаковываете код в JAR (который включает все необходимые зависимости) и загружаете его в AWS для запуска.

Как вы можете активировать лямбду?

  • Вы можете использовать CloudWatch (подобно CRON).
  • Вы можете использовать событие. Это может быть вызов REST API, сохранение файла в AWS S3, приход сообщения в очередь, добавление строки в таблицу или вызов непосредственно из другой Lambda.

Ограничения, ограничения везде!

При работе с Lambdas нужно быть очень осторожным с ограничениями AWS Lambda.

  • Тайм-аут выполнения по умолчанию: 5 минут
  • Максимальный объем памяти, который вы можете использовать: 3 ГБ
  • Максимальный размер файла JAR, который вы можете загрузить: 50 МБ.
  • Максимальное дисковое пространство, которое вы можете использовать: 512 МБ.

Для какой-то конкретной тяжелой обработки они достигли большинства из этих ограничений, и им пришлось найти разные способы справиться с этим:

  • Вместо этого используйте AWS Batch, который также включает бессерверные функции, единственным недостатком которого является то, что они не могут инициировать процесс мгновенно, т. е. когда вы отправляете пакетное задание, оно будет обработано в какой-то момент, но вы не можете предположить, что это будет мгновенно (может быть через 2 или даже 10 минут). Это ограничение устраивало их, очевидно, что это не сработает для всех.
  • Максимально разделите и предварительно обработайте данные, прежде чем передавать их в Lambda. Lambda не должна выполнять предварительную обработку, занимающую много времени и памяти. Кроме того, поскольку данные загружаются по запросу, это приводит к некоторой задержке, но для них это было приемлемо.
  • Вместо того, чтобы передавать копию данных между лямбда-выражениями, что может требовать больших затрат памяти/сети и быть дорогостоящим, они сохраняют данные в S3, а затем используют ссылку на них (метаданные).

В итоге они получили 4 сервиса, состоящих из 23 лямбда-выражений и 2 пакетов.

Извлеченные уроки

Автоматическое масштабирование с помощью Lambda является основным преимуществом. Он полностью прозрачен и управляется AWS. Когда запросов много, Lambda создаются и распределяют нагрузку. Когда все запросы обработаны, лямбда-выражения уменьшаются (до 0 при простое). Однако это не серебряная пуля, потому что у вас может быть узкое место на другом уровне вашей системы (например, ваше хранилище данных слишком медленное), и вы не сможете в полной мере использовать масштабируемость Lambda.

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

С отладкой все непросто, нужно развернуть на AWS для тестирования, отлаживать сложно. В настоящее время существуют библиотеки и фреймворки, которые помогут вам в этом.

Журналы от Lambdas попадают в журналы AWS CloudWatch. Этот инструмент не очень удобен в использовании, поэтому они создали Lambda для копирования журналов из AWS в специальный инструмент-агрегатор журналов: Sumo Logic, инструмент, похожий на Splunk. Для оповещений и мониторинга они используют CloudWatch Metrics, а также настроили оповещения в Sumo Logic, что упрощает поиск журналов.

Сборка из небольших простых частей увеличивает сложность на уровне инфраструктуры (во время сборки), а также взаимодействия между компонентами (во время выполнения). Мониторинг и оповещение также усложняются, поскольку система становится еще более фрагментированной. Важно иметь в виду, что лямбда имеет очень строгие ограничения, превысив единицу, ваша лямбда будет убита. Обратите внимание, что ограничения развиваются и со временем снимаются. Технология все еще молода, а доступные инструменты и фреймворки довольно ограничены, но, учитывая уровень интереса к Lambda, ясно, что она будет улучшаться.

С другой стороны, вам не нужно думать о серверах и их обслуживании. Масштабирование прозрачно и автоматически обрабатывает нагрузку. У вас есть большая потенциальная экономия средств с помощью Lambda, например, если ваша система зависит от страны, вы знаете, что трафик будет очень ограничен в ночное время. Наконец, модель программирования очень проста, просто файл JAR, просто функция.

Этот второй день в Devoxx был отличным, особенно утренние разговоры о машинном обучении. Я вышел из этих 2 дней с большим количеством инновационных идей.

Спасибо Devoxx UK и, возможно, увидимся снова в следующем году!