Пару недель назад я прочитал на dev.by о семинаре для веб-архитекторов и сразу загорелся желанием его посетить – события подобного рода в нашей стране пока не проводилось. Семинар организовывался компанией, где я сейчас работаю, так что по ходу дела помогал организовывать сие действо на месте.
Семинар проходил в образовательном центре IBB, в котором я до этого ни разу не был и который мы с таксистом с трудом нашли :). Здание выглядит необычно, а внутри встречает приятной обстановкой и мягкими яркими диванами.
Заявленную аудиторию нашел быстро, хотя, как оказалось, ее заменили на соседнюю – чуть более просторную. Оставив вещи, пошел на вход встречать участников семинара и направлять их в нашу аудиторию. Первым пришел Володя – ведущий семинара, ну а за ним стали подтягиваться и остальные. Перед началом мероприятия каждый из участников получил бедж для распознавания друг друга и блокнот с ручкой для записывания умных мыслей. Блокнотами я обычно не пользуюсь, но в этот раз исписал его почти до половины – информационный поток просто зашкаливал!
Пару слов о Владимире Лешкевиче, ведущем семинара. У Володи за плечами 14 лет профессиональной разработки ПО; начав простым разработчиком, он прокачался до технического директора, попутно успев побыть и техлидом, и менеджером. Он занимается обучением и коучингом проектных команд по различным технологическим направлениям и процессам разработки. Проработав с Володей некоторое время на реальном проекте, я ожидал от семинара многого, и, конечно, мои надежды оправдались на все 200% - субъективно для меня это был лучший IT день за прошедшие несколько лет.
Все началось, как в первом классе – с представления себя и своего рода деятельности. Уровень участников был очень высокий – не припомню никого ниже senior software engineer. Что приятно удивило – среди участников было два человека из Могилева, специально приехавшие в Минск на семинар.
Выступления Володя проводил по четырем основным темам:
Плюсы:
Минусы:
Request/Response цикл
XML-based
Java
Adobe Flex
Оптимизируй только то, что действительно надо оптимизировать
Разделяй ответственность за производительность со всей командой
Далее Володя подчеркнул основные моменты клиентской производительности:
Инструменты
Техники:
Caching
Clustering
Database
- Архитектура веб-приложений;
- Сервисно-ориентированные архитектуры;
- Объекты-значения в DDD;
- Производительность и масштабируемость веб-приложений.
Архитектура веб-приложений
Первой рассмотренной темой была «Архитектура веб-приложений» - наверное, самое простое, что было обсуждено в этот день. Выступление началось с опроса – что интересует участников? Основные интересующие моменты таковы:- Как и где проводить границу между Model, View и Controller в паттерне MVC?
- Как разделять серверную и клиентскую части приложения?
- Как бороться с разрастанием веб-приложений?
- Оригинальная концепция
- MVC model 1: Page = View + Controller, где были тесно связаны View и Controller
- MVC model 2: архитектура с Front Controller, Filter Chain и кучей Actions для обработки запросов.
- MVCS – MVC на сервисах
- Flex/Flash
- Silverlight
- Java FX
- GWT – здесь, кстати, опять выскакивает закон протекающих абстракций: Java код компилируется в JavaScript, что может привести к необычным ошибкам, которые Java сама по себе вызвать не могла.
- Selenium
- Fit
- HttpUnit
Кофе-пауза
Сразу после первого выступления мы устроили себе перерыв и разбились по кучкам с чашками свежего кофе и вкусным печеньем. Что порадовало – люди легко шли на контакт и с удовольствием обсуждали архитектурные проблемы и их решения. И надо сказать, момент такой неформальной коммуникации между специалистами различных компаний очень приятен и вызывает желание провести подобный семинар хотя бы ради него.Сервисно-ориентированная архитектура
Второй темой выступления была «Сервисно-ориентированная архитектура». Для старта мы рассмотрели основные критерии сервиса:- Автономный;
- Имеет явные границы;
- Имеет явный контракт для взаимодействия;
- RPC – Remote Procedure Call – наверное, первое, что использовалось для подобных целей
- XML-RPC – формализация RPC, использующая XML в качестве основного формата передачи данных
- Web Services – SOAP формат на основе XML.
- REST – Representational State Transfer
- SOA – сервисно-ориентированные архитектуры
- Открытые стандарты и протоколы
- Четко выверенный и разделенный интерфейс
- Service discovery
- Богатый набор инструментов
- Сложность и протекающие абстракции
- Несовместимость
- Производительность
- У каждого ресурса есть свой URI, по которому они доступны
- Представления – то, что идет вовне и видно всем
- Переходы состояний:
- GET – получить
- POST – создать
- PUT – обновить
- DELETE – удалить
- Простота запросов и действий
- Малый порог вхождения – все очень просто
- Масштабируемость простым копированием
- Oчень узкий интерфейс для всего многообразия действий
- Не очень легко настроить
- Обмен неструктурированными данными
- Связь presentation flow и обмена данными
- Проблема с кнопкой Back (о нет, не напоминайте...)
- Нет прямого взаимодействия двух клиентов
- Разделение Application Download, Presentation Flow, Data Interchange
- Различные варианты Application Download (тонкий/толстый клиенты)
- Presentation Flow определяется только клиентом, не должно проходить никаких Request/Response циклов для смены экрана
- Обмен данными не должен быть слабым звеном
- B Presentation должен использоваться MVC
- DHTML/AJAX:
- JS
- GWT
- XAML
- MXML
- JavaFX
- Java WebStart
Кофе-брейк
На этом кофе-брейке образовательный центр IBB порадовал нас не только печеньем, но и бутербродами :) Опять все те же группки, уже более активные обсуждения – людям явно нравилось все происходящее.Value objects in DDD
Тема DDD очень обширная, поэтому в данном выступлении Володя лишь провел обзор DDD и углубился именно в объекты-значения. Для начала мы рассмотрели взаимосвязь домена заказчика и доменной модели нашего приложения, обсудили вопросы создания доменного языка, с помощью которого можно единым образом описывать все происходящие в системе процессы. DDD характеризуется:- Связью с бизнес-доменом
- Явно выделенной доменной моделью приложения
- Ubiquitous language – четко определенный язык
- Model-Driven Design – MDD – развитие приложения «от модели»
- ООП – нативное представление естественных концепций
- Многослойная архитектура
- Entities – сущности
- Value Objects – объекты-значения
- Доменные сервисы
- Bounding contexts - граничные контексты
- Действие делает не модель, а его делают над моделью
- Primitive Obsession – одержимость простыми типами (в противовес грамотному определению объектов-значений)
- Сущности просто несут данные без какой-либо логики
- Явное представление контекста домена
- Центры гравитации для поведения – концентрируют логику
- Явно определяют свой интерфейс
- Они всегда корректны – валидация происходит в момент создания объекта-значения и уже созданный объект-значение всегда корректен
- Тестируемость
- Локальность
- Когерентность – обладают высоким уровнем внутренней согласованности, как FirstName и LastName, а не FirstName и CarBestseller
Заключительный кофе-брейк
К моменту окончания третьего выступления мы уже вышли за ранее предполагавшиеся рамки мероприятия, однако никто не утратил запала и мы вышли на финишную прямую.Web application performance. Scalability.
Для начала мы определились с терминологией:- Производительность (performance) – количество действий в единицу времени
- Масштабируемость (scalability) – способность функционировать при увеличении доступных ресурсов
- Доступность (availability) – способность работать в заданных интервалах времени
- Определить требования к производительности приложения
- Обосновать выбор технологии
- Тестировать репрезентативно в реальных условиях
- Тестировать постоянно, чем раньше, тем лучше
- Наблюдай и диагностируй
- Измеряй, не гадай
- Введи счетчики производительности
- Используй средства диагностики
- Три правила оптимизации:
- Не оптимизируй
- Еще не оптимизируй
- Профайли и смотри, где надо оптимизировать
- Определи, изолируй, диагностируй, улучши, проверь
- Рендер страницы может быть медленным (до 80% времени загрузки страницы)
- Правила:
- Минимизируй количество HTTP запросов
- Используй Content Delivery Networks
- Используй кеш браузера и прокси
- Используй GZip
- Размещай стили вверху, а скрипты внизу
- Минимизируй количество DNS lookups
- Вынеси JS и CSS из HTML
- Уменьшай JS & CSS
- YSlow
- Google PageSpeed
- Выбор: доступность или масштабируемость
- Измерение доступности – количество девяток. Идеал – компания Ericsson с их 99.999999% доступностью в году
- Уровень доступности приложения, явно указанный в контракте – допустим, не меньше 99.9999%
- Типы:
- Горизонтальная – увеличиваем количество серверов
- Вертикальная – увеличиваем мощность серверов
- Load balancing
- Кеширование
- Кластеризирование
- Load balancing
- Stateful
- Sticky sessions
- Write policy
- Appication caching
- Web caching
- Distributed caching (memcached)
- Grid-схема
- NOSQL подход – Not Only SQL
- In-memory – базы данных в памяти
- Distributed базы данных
- Распределенные вычисления на серверах другой компании
- Типы cloud computing:
- Веб-сервисы: Saleforce.com, Google maps
- Сервисные платформы: Google App Engine, Amazon EC2, S3
- Четко определенные требования по масштабируемости
- Анализ поведения пользователей – они больше сохраняют данные или просматривают их
- Динамика контента – общий или персональный, часто или не часто меняется
- Держать в уме устаревание данных – у вас всегда устаревшие данные! Следует учесть, что уровень устаревания данных определяется не вами, а вашим заказчиком и его бизнес-требованиями
- Придерживаться принципа subscribe/publish вместо традиционного request/response – на такой подход недавно перешли такие многомиллионные сервисы, как Twitter и Facebook
- Использовать Command-Query Separation
- Использовать Actors – независимые асинхронные модули выполнения логики, изначально появились в языке Erlang и с тех пор обеспечивают компании Ericsson заветные 99.999999% доступности в году.
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.