Разработка надежных
параллельных, распределенных
приложений: быстро и дешево
Евгений Тюменцев
HWdTech, LLC
hwdtech.ru
12-я конференция .NET разработчиков
15 мая 2016
dotnetconf.ru
2
Докладчик
Тюменцев Евгений
15 лет преподаю
ИМИТ, ФКН ОмГУ
ИТ-компании
Школа программиста
11 лет разрабатываю ПО
разработчик, архитектор,
PM, руководство до 70 человек
3
Особенности разработки ПО
Фредерик Брукс
«Мифический человеко-
месяц»
4
• Сроки нарушаются
• ?
• ?
5
• Сроки нарушаются
• Требуется все больше разработчиков
• ?
6
• Сроки нарушаются
• Требуется все больше разработчиков
• Быстрее переписать, чем продолжать
7
Активная
разработка
Схема разработки
Ядро
Кандидаты
в ядро
Направление миграции кода
8
Процессоры уже не те!
• Рост производительности одного
ядра процессора остановился!
• Рост производительности
приложений теперь должен
обеспечиваться за счет активного
использования многоядерности.
Herb Sutter, 2005 The Free Lunch Is Over A
Fundamental Turn Toward Concurrency in Software
“The bad news is that, at least in the short term, the
growth will come mostly in directions that do not take
most current applications along for their customary
free ride.
9
Многопоточные приложения сложны
• Нужны специалисты
• Трудно прогнозировать результат
• Дорого
10
Базы данных
• Скорость выполнения запросов
• Миграция
• Репликация
• Непротиворечивость
• ORM
11
Один формат для всех данных
• Все данные хранятся в виде JSON в реляционной БД (не NoSQL
база). Почему реляционная – есть транзакции.
• Структура базы очень проста – всего 6 (!) запросов к БД.
• Всегда известно среднее время выполнения любого запроса (в том
числе полнотекстовых поисковых запросов). Поскольку запросы
фиксированы, то время их выполнения не зависит от квалификации
разработчика.
• Не нужно миграций вообще – одновременно можно хранить сразу
несколько версий одних данных (система будет корректно работать
со всеми версиями)
• Базу легко масштабировать и поддерживать скорость выполнения
запросов – достаточно выделить нужные записи в отдельную
коллекцию. Например, если у Вас объявления о продаже
автомобилей и из них половина – это Toyota, то их можно выделить в
отдельную коллекцию, или, наоборот, из-за ухода General Motors
количество продаваемых Chevrolet, Opel снизилось, то их можно
собрать в одну коллекцию. Это делается однажды написанными
процедурами и хорошо отлаженными слияния и разделения
коллекций, то есть участие программиста для этих операций не
требуется.
{
‘фамилия’: ‘Иванов’,
‘заказы’: [
{
‘дата’: ’01.09.2015’,
‘стоимость’: 2000
},
{
‘дата’: ’01.10.2015’,
‘стоимость’: 2000
}
]
}
12
Интерфейс работы с данными
interface IObject
{
object getValue(string name);
void setValue(string name, object val);
}
class Field<T>
{
public Field(string name) {…}
public abstract T this[IObject o]
{
get;
set;
}
}
Генерация строго типизированных
оберток для IObject по интерфейсам
interface MyObj
{
int A
{
get;
}
string B
{
get;
set;
}
}
13
Акторы – альтернатива многопоточности
Carl Hewitt,
Peter Bishop,
Richard Steiger
A Universal Modular ACTOR
Formalism for Artificial Intelligence
1973
14
Что такое актор?
Актор – вычислительная
сущность, которая может
за один шаг
• Отправить конечное число
сообщений другим акторам
• Создать конечное число
акторов
• Выбрать поведение для
приема следующего
сообщения
15
Многопоточность vs Акторы
Многопоточность больше всего
похожа на телефонию. Доступ к
ресурсу – телефонный звонок.
Адресат может быть занят или не
брать трубку – живая и мертвая
блокировки. Чтобы одновременно
принимать много звонков, в
телефонии используют офисные
АТС – объекты синхронизации.
Акторы похожи на почтовую систему.
Чтобы выполнить какое-либо действие
актор посылает сообщение – письмо
адресату, и дальше занимается своими
делами. Не нужно никаких блокировок
вообще, можно послать много
сообщений за 1 раз, но нет гарантий,
что каждое сообщение будет
доставлено адресату.
16
Архитектура
Каждый актор запущен внутри некоторого процесса – Node. Каждый актор
подключен к одному или нескольким каналам шины сообщений – MessageBus.
Чтобы отправить сообщение актору, надо его опубликовать в соответствующем
канале.
17
Разработка одного актора
[Actor(Name = “Authorization”, version = “1.2.0.0”)]
class AuthorizationActor
{
[Channel(“Login”)]
public void LoginHandler(ILoginMessage) {…}
[Channel(“Register”)]
public void RegisterHandler(IregisterMessage) {…}
}
interface ILoginMessage
{
string AccountName {get;}
string PasswordHash {get;}
string SessionId {set;}
}
18
Библиотека акторов
Актор имеет имя и версию. Чтобы система
стала использовать актор, разработчик обязан
опубликовать его в библиотеке акторов. Ни
один актор не потеряется, а библиотека будет
хранить информацию обо всех акторах,
которые когда либо были в нашей системе, а
также о тех, кто их опубликовал! Исключается
человеческий фактор при деплое на сервера,
обеспечивается безопасность.
19
Маршруты сообщений
• Акторную модель можно представить в
виде графа, где каждая вершина – это
актор, а стрелка показывает, что один
актор (основание стрелки) посылает
сообщение другому актору (конец
стрелки)
• Маршрут сообщения – это путь в графе,
которое проходит сообщение от
момента создания до завершения
обработки.
• Обычно, информация о том, кому
посылать сообщение зафиксирована в
исходном коде актора.
• Это требует модификации актора и,
соответственно, обновления сервера,
каждый раз, когда нам необходимо
внести изменения в соответствующий
алгоритм (например, в
запрограммированный бизнес-процесс)
20
Управление маршрутами без программиста
• Наше решение предлагает вынести
информацию об адресатах сообщений
за пределы актора, так чтобы он ничего
не знал о следующих акторах
маршрута.
• В таком случае акторы можно легко
компоновать в любых сочетаниях для
реализации сложных операций.
• Маршруты формируются динамически,
так что их можно менять без
обновлений и перезагрузки сервера.
• Изменение маршрута может проходить
без участия программиста.
Программисты нужны только для
разработки новых акторов.
21
Библиотека конфигураций
• Структура каждого сервера описывается
JSON
• Все конфигурации с версиями хранятся в
библиотеке конфигураций
• Чтобы обновить конфигурацию на
сервере, ему посылается сообщение с
идентификатором конфигурации
• Сервер обращается в библиотеку
конфигураций и получает требуемую
конфигурацию
• При необходимости сервер сам
выкачивает из библиотеки акторов
требуемые конфигурацией акторы
{
‘actors’: [{
‘name’: ‘emailSender’,
‘smtp’: …,
},
{
‘name’: ‘dailyReport’,
…
}
‘messagePaths’: [{
‘name’: ‘newAd’,
…
}],
‘enpoints’: […]
}
22
Преимущества библиотеки
конфигураций
• Быстро клонировать сервера – достаточно
установить нашу библиотеку (скопировать
файлы) и послать сообщение с необходимой
конфигурацией
• Автоматический деплой – надо только написать
конфигурационный файл
• Можно выставлять время обновления
• Автоматический откат – если возникают ошибки
при инициализации сервера, то автоматически
откатываемся до старой конфигурации
• Ни одна конфигурация не теряется
• Можно иметь одновременно сервера, которые
работают с разными версиями данных,
например, если часть клиентов, которые
работают с Вами по API еще не перешла на
новую версию
{
‘actors’: [{
‘name’: ‘emailSender’,
‘smtp’: …,
},
{
‘name’: ‘dailyReport’,
…
}
‘messagePaths’: [{
‘name’: ‘newAd’,
…
}],
‘enpoints’: […]
}
23
Надежность
Компонент – это любой сервис, который
может нарушить контракт при верных
входных данных
pi – надежность компонента i
Тогда надежность цепочки n компонент
p1*p2*…*pn
Цепочка не может быть надежнее, чем
самый ненадежный компонент
24
Контрольные точки
• При поступлении запроса
(сообщение) от пользователя, при
прохождении через контрольную
точку сообщение сохраняется как
есть в базе данных.
• Дальше сообщение отправляется по
маршруту
• Если в результате сбоя в работе
какого-либо актора, запрос в данный
момент не может быть выполнен, то
благодаря тому, что все данные
сохранены в контрольной точке, мы
можем исправить ошибку и
повторить операцию без
дополнительных действий со
стороны пользователя.
Контрольная точка
сохраняет в БД входящее
сообщение как есть
Конечная точка маршрута
сообщения
25
Надежность в цифрах
Надежность 0,999 (даунтайм 8,76 часов в год)
Тогда надежность цепочки из 6 компонент 0,994
Проверить, что такого пользователя нет
Создать нового пользователя
Получить шаблон письма для уведомления
Сформировать письмо
Поставить письмо в очередь на отправку
Отправить письмо
26
Как повысить надежность
Если надежность компонента 0,01?
Избыточность!
Например, если повторить операцию 453
раза, то вероятность отказа будет 1%
27
Преимущества контрольных точек
• Можно ответить пользователю раньше, чем
завершится обработка операции, что
уменьшает время отклика (ответ значит не
то, что операция завершена, а то, что
успешно принята заявка на выполнение
операции – в большинстве случаев этого
достаточно, как например, в платежном
терминале)
• Пользователь не видит, что внутри нашей
системы могут проблемы – для него система
всегда работает правильно – ошибка
выражается лишь в увеличении времени
обработки операции
• Можно использовать несколько
контрольных точек в одном маршруте,
чтобы уменьшить объем работы в случае
сбоя
• Не теряется информация от внешних систем,
например, платежных, в случае сбоя в
нашей системе – данные от внешних систем
сохранятся в некоторой контрольной точке
Контрольная точка сохраняет в
БД входящее сообщение как
естьвходящий
запрос
ответ
28
Методы обнаружения разладки
Используем мат.
статистику для
обнаружения и
исправления
ошибок. Акторы-
датчики измеряют
поведение системы,
потом эта
передается на вход
специальных
алгоритмов,
позволяющих
обнаруживать
ошибки на
работающей
системе без
программистов и
тестировщиков.
29
Как узнать, что изменения дали
положительный эффект
Карта количества сообщений в контрольной точке
Рост числа сообщений говорит о возникновении систематической
ошибки, резкий спад – о том, что ошибка была устранена.
30
Все ли пользователи
одинаково полезны
Обмен сообщениями между пользователями
Анализ аномальной активности показал, что появился
пользователь, который стал активно предлагать другим
переходить на ресурс-конкурент.
31
Если коллеги не идут на
сотрудничество
Аргумент при общении со сторонними разработчиками
Один из клиентов предъявлял претензии, потому что его
разработчики (компания-аутсорсер) говорили, что проблема в
нас.
32
Активность пользователей можно
создавать
Грамотный троллинг увеличивает рейтинги
Постоянные посетители готовы общаться – им нужно только
немного помочь. Стоит ли эффект вложенных средств?
33
Преимущества решения
• Масштабируемые приложения могут
строить разработчики с небольшим
опытом работы или вообще без
опыта
• Нет проблем с миграциями данных
• Методы объективного контроля
работоспособности всей системы, не
зависящие от программистов и
тестировщиков
• Быстрое клонирование и
развертывание серверов по
необходимости
• Возможность адаптации или правки
автоматизируемых бизнес-
процессов без участия
программистов.
34
Существующие внедрения – портал
бесплатных объявлений и новостей
• Команда – 5 студентов без опыта
работы и филолог
• Среднее время открытия страницы
уменьшено с 4,5 с до 400 мс
• Количество ошибок по сравнению с
предыдущей версией уменьшилось в
1000 раз!
• Количество серверов уменьшено с 15
до 3!
• Объявление можно подавать
простым текстом вместо длинной
формы: “Двушка в Советском округе,
проспект Мира, 64, в районе ост.
Политех, 50/34/8, 3/5п, не требует
ремонта, санузел раздельный, хрущевка.”
35
Существующие внедрения – платформа
для контекстной рекламы
• Требование – время отклика строго меньше 100 мс
• Попытки задействовать ElasticSearch, MongoDb и т.д. дают
в некоторых случаях 200 мс и больше
• Был написан актор, который хранит все критерии
рекламных компаний сразу в памяти.
• Получили время отклика 7-46 мс (сам поиск по структуре
в памяти < 1 мс)
• Для масштабирования система поддерживает работу с
несколькими экземплярами серверов
36
Существующие внедрения –
кроссплатформенное приложение
• Приложение считает время по
каждой задаче программиста,
снимает скриншоты, мониторит
активность клавиатуры и мыши
• Интерфейс написан на HTML5 и CSS3
• Бизнес-логика написана на нашей
библиотеке
• Приложение работает без
изменений под Mac, Window, Linux
(кроме методов снятия скриншота и
логирования активности – это малая часть
– до 40 ч работы – по сравнению со всем
приложением)
37
Пример: Регистрация пользователя
• При выполнении операции могут
возникнуть ошибки при:
• Записи в БД
• Отправки email
• Отправки ответа пользователю
• Если запись в контрольную точку
прошла, то операция может быть
полностью выполнена, даже если при
первом выполнении возникла ошибка
на любом из этапов
• ! Единственный компонент, о
надежности которого необходимо
заботиться – контрольная точка.
• ! Компоненты должны быть
идемпотентными
Запись нового
пользователя в БД
Отправить
email
38
Пример: Разделяемый объект Корзина
• В БД хранится не самое последнее
состояние из-за гонок параллельных
запросов, которые модифицируют одну
и туже корзину
• В памяти хранится всегда актуальное
состояние из-за того, что один актор в
любой момент времени обрабатывает
только одно сообщение
• Идемпотентность корзины достигается
за счет регистрации в корзине тех
операций, которые были обработаны
• При восстановлении после сбоя, чтобы
получить актуальное состояние
корзины, необходимо повторить
операции, которые не отражены в
последнем записанном состоянии
корзины
Добавить в
корзину (в памяти)
Сохранить
корзину в БД
39
Спасибо за внимание
Евгений Тюменцев
HWdTech, LLC
etyumentcev@hwdtech.ru
twitter.com/etyumentcev

Разработка надежных параллельных, распределенных приложений: быстро и дешево

  • 1.
    Разработка надежных параллельных, распределенных приложений:быстро и дешево Евгений Тюменцев HWdTech, LLC hwdtech.ru 12-я конференция .NET разработчиков 15 мая 2016 dotnetconf.ru
  • 2.
    2 Докладчик Тюменцев Евгений 15 летпреподаю ИМИТ, ФКН ОмГУ ИТ-компании Школа программиста 11 лет разрабатываю ПО разработчик, архитектор, PM, руководство до 70 человек
  • 3.
    3 Особенности разработки ПО ФредерикБрукс «Мифический человеко- месяц»
  • 4.
  • 5.
    5 • Сроки нарушаются •Требуется все больше разработчиков • ?
  • 6.
    6 • Сроки нарушаются •Требуется все больше разработчиков • Быстрее переписать, чем продолжать
  • 7.
  • 8.
    8 Процессоры уже нете! • Рост производительности одного ядра процессора остановился! • Рост производительности приложений теперь должен обеспечиваться за счет активного использования многоядерности. Herb Sutter, 2005 The Free Lunch Is Over A Fundamental Turn Toward Concurrency in Software “The bad news is that, at least in the short term, the growth will come mostly in directions that do not take most current applications along for their customary free ride.
  • 9.
    9 Многопоточные приложения сложны •Нужны специалисты • Трудно прогнозировать результат • Дорого
  • 10.
    10 Базы данных • Скоростьвыполнения запросов • Миграция • Репликация • Непротиворечивость • ORM
  • 11.
    11 Один формат длявсех данных • Все данные хранятся в виде JSON в реляционной БД (не NoSQL база). Почему реляционная – есть транзакции. • Структура базы очень проста – всего 6 (!) запросов к БД. • Всегда известно среднее время выполнения любого запроса (в том числе полнотекстовых поисковых запросов). Поскольку запросы фиксированы, то время их выполнения не зависит от квалификации разработчика. • Не нужно миграций вообще – одновременно можно хранить сразу несколько версий одних данных (система будет корректно работать со всеми версиями) • Базу легко масштабировать и поддерживать скорость выполнения запросов – достаточно выделить нужные записи в отдельную коллекцию. Например, если у Вас объявления о продаже автомобилей и из них половина – это Toyota, то их можно выделить в отдельную коллекцию, или, наоборот, из-за ухода General Motors количество продаваемых Chevrolet, Opel снизилось, то их можно собрать в одну коллекцию. Это делается однажды написанными процедурами и хорошо отлаженными слияния и разделения коллекций, то есть участие программиста для этих операций не требуется. { ‘фамилия’: ‘Иванов’, ‘заказы’: [ { ‘дата’: ’01.09.2015’, ‘стоимость’: 2000 }, { ‘дата’: ’01.10.2015’, ‘стоимость’: 2000 } ] }
  • 12.
    12 Интерфейс работы сданными interface IObject { object getValue(string name); void setValue(string name, object val); } class Field<T> { public Field(string name) {…} public abstract T this[IObject o] { get; set; } } Генерация строго типизированных оберток для IObject по интерфейсам interface MyObj { int A { get; } string B { get; set; } }
  • 13.
    13 Акторы – альтернативамногопоточности Carl Hewitt, Peter Bishop, Richard Steiger A Universal Modular ACTOR Formalism for Artificial Intelligence 1973
  • 14.
    14 Что такое актор? Актор– вычислительная сущность, которая может за один шаг • Отправить конечное число сообщений другим акторам • Создать конечное число акторов • Выбрать поведение для приема следующего сообщения
  • 15.
    15 Многопоточность vs Акторы Многопоточностьбольше всего похожа на телефонию. Доступ к ресурсу – телефонный звонок. Адресат может быть занят или не брать трубку – живая и мертвая блокировки. Чтобы одновременно принимать много звонков, в телефонии используют офисные АТС – объекты синхронизации. Акторы похожи на почтовую систему. Чтобы выполнить какое-либо действие актор посылает сообщение – письмо адресату, и дальше занимается своими делами. Не нужно никаких блокировок вообще, можно послать много сообщений за 1 раз, но нет гарантий, что каждое сообщение будет доставлено адресату.
  • 16.
    16 Архитектура Каждый актор запущенвнутри некоторого процесса – Node. Каждый актор подключен к одному или нескольким каналам шины сообщений – MessageBus. Чтобы отправить сообщение актору, надо его опубликовать в соответствующем канале.
  • 17.
    17 Разработка одного актора [Actor(Name= “Authorization”, version = “1.2.0.0”)] class AuthorizationActor { [Channel(“Login”)] public void LoginHandler(ILoginMessage) {…} [Channel(“Register”)] public void RegisterHandler(IregisterMessage) {…} } interface ILoginMessage { string AccountName {get;} string PasswordHash {get;} string SessionId {set;} }
  • 18.
    18 Библиотека акторов Актор имеетимя и версию. Чтобы система стала использовать актор, разработчик обязан опубликовать его в библиотеке акторов. Ни один актор не потеряется, а библиотека будет хранить информацию обо всех акторах, которые когда либо были в нашей системе, а также о тех, кто их опубликовал! Исключается человеческий фактор при деплое на сервера, обеспечивается безопасность.
  • 19.
    19 Маршруты сообщений • Акторнуюмодель можно представить в виде графа, где каждая вершина – это актор, а стрелка показывает, что один актор (основание стрелки) посылает сообщение другому актору (конец стрелки) • Маршрут сообщения – это путь в графе, которое проходит сообщение от момента создания до завершения обработки. • Обычно, информация о том, кому посылать сообщение зафиксирована в исходном коде актора. • Это требует модификации актора и, соответственно, обновления сервера, каждый раз, когда нам необходимо внести изменения в соответствующий алгоритм (например, в запрограммированный бизнес-процесс)
  • 20.
    20 Управление маршрутами безпрограммиста • Наше решение предлагает вынести информацию об адресатах сообщений за пределы актора, так чтобы он ничего не знал о следующих акторах маршрута. • В таком случае акторы можно легко компоновать в любых сочетаниях для реализации сложных операций. • Маршруты формируются динамически, так что их можно менять без обновлений и перезагрузки сервера. • Изменение маршрута может проходить без участия программиста. Программисты нужны только для разработки новых акторов.
  • 21.
    21 Библиотека конфигураций • Структуракаждого сервера описывается JSON • Все конфигурации с версиями хранятся в библиотеке конфигураций • Чтобы обновить конфигурацию на сервере, ему посылается сообщение с идентификатором конфигурации • Сервер обращается в библиотеку конфигураций и получает требуемую конфигурацию • При необходимости сервер сам выкачивает из библиотеки акторов требуемые конфигурацией акторы { ‘actors’: [{ ‘name’: ‘emailSender’, ‘smtp’: …, }, { ‘name’: ‘dailyReport’, … } ‘messagePaths’: [{ ‘name’: ‘newAd’, … }], ‘enpoints’: […] }
  • 22.
    22 Преимущества библиотеки конфигураций • Быстроклонировать сервера – достаточно установить нашу библиотеку (скопировать файлы) и послать сообщение с необходимой конфигурацией • Автоматический деплой – надо только написать конфигурационный файл • Можно выставлять время обновления • Автоматический откат – если возникают ошибки при инициализации сервера, то автоматически откатываемся до старой конфигурации • Ни одна конфигурация не теряется • Можно иметь одновременно сервера, которые работают с разными версиями данных, например, если часть клиентов, которые работают с Вами по API еще не перешла на новую версию { ‘actors’: [{ ‘name’: ‘emailSender’, ‘smtp’: …, }, { ‘name’: ‘dailyReport’, … } ‘messagePaths’: [{ ‘name’: ‘newAd’, … }], ‘enpoints’: […] }
  • 23.
    23 Надежность Компонент – этолюбой сервис, который может нарушить контракт при верных входных данных pi – надежность компонента i Тогда надежность цепочки n компонент p1*p2*…*pn Цепочка не может быть надежнее, чем самый ненадежный компонент
  • 24.
    24 Контрольные точки • Припоступлении запроса (сообщение) от пользователя, при прохождении через контрольную точку сообщение сохраняется как есть в базе данных. • Дальше сообщение отправляется по маршруту • Если в результате сбоя в работе какого-либо актора, запрос в данный момент не может быть выполнен, то благодаря тому, что все данные сохранены в контрольной точке, мы можем исправить ошибку и повторить операцию без дополнительных действий со стороны пользователя. Контрольная точка сохраняет в БД входящее сообщение как есть Конечная точка маршрута сообщения
  • 25.
    25 Надежность в цифрах Надежность0,999 (даунтайм 8,76 часов в год) Тогда надежность цепочки из 6 компонент 0,994 Проверить, что такого пользователя нет Создать нового пользователя Получить шаблон письма для уведомления Сформировать письмо Поставить письмо в очередь на отправку Отправить письмо
  • 26.
    26 Как повысить надежность Еслинадежность компонента 0,01? Избыточность! Например, если повторить операцию 453 раза, то вероятность отказа будет 1%
  • 27.
    27 Преимущества контрольных точек •Можно ответить пользователю раньше, чем завершится обработка операции, что уменьшает время отклика (ответ значит не то, что операция завершена, а то, что успешно принята заявка на выполнение операции – в большинстве случаев этого достаточно, как например, в платежном терминале) • Пользователь не видит, что внутри нашей системы могут проблемы – для него система всегда работает правильно – ошибка выражается лишь в увеличении времени обработки операции • Можно использовать несколько контрольных точек в одном маршруте, чтобы уменьшить объем работы в случае сбоя • Не теряется информация от внешних систем, например, платежных, в случае сбоя в нашей системе – данные от внешних систем сохранятся в некоторой контрольной точке Контрольная точка сохраняет в БД входящее сообщение как естьвходящий запрос ответ
  • 28.
    28 Методы обнаружения разладки Используеммат. статистику для обнаружения и исправления ошибок. Акторы- датчики измеряют поведение системы, потом эта передается на вход специальных алгоритмов, позволяющих обнаруживать ошибки на работающей системе без программистов и тестировщиков.
  • 29.
    29 Как узнать, чтоизменения дали положительный эффект Карта количества сообщений в контрольной точке Рост числа сообщений говорит о возникновении систематической ошибки, резкий спад – о том, что ошибка была устранена.
  • 30.
    30 Все ли пользователи одинаковополезны Обмен сообщениями между пользователями Анализ аномальной активности показал, что появился пользователь, который стал активно предлагать другим переходить на ресурс-конкурент.
  • 31.
    31 Если коллеги неидут на сотрудничество Аргумент при общении со сторонними разработчиками Один из клиентов предъявлял претензии, потому что его разработчики (компания-аутсорсер) говорили, что проблема в нас.
  • 32.
    32 Активность пользователей можно создавать Грамотныйтроллинг увеличивает рейтинги Постоянные посетители готовы общаться – им нужно только немного помочь. Стоит ли эффект вложенных средств?
  • 33.
    33 Преимущества решения • Масштабируемыеприложения могут строить разработчики с небольшим опытом работы или вообще без опыта • Нет проблем с миграциями данных • Методы объективного контроля работоспособности всей системы, не зависящие от программистов и тестировщиков • Быстрое клонирование и развертывание серверов по необходимости • Возможность адаптации или правки автоматизируемых бизнес- процессов без участия программистов.
  • 34.
    34 Существующие внедрения –портал бесплатных объявлений и новостей • Команда – 5 студентов без опыта работы и филолог • Среднее время открытия страницы уменьшено с 4,5 с до 400 мс • Количество ошибок по сравнению с предыдущей версией уменьшилось в 1000 раз! • Количество серверов уменьшено с 15 до 3! • Объявление можно подавать простым текстом вместо длинной формы: “Двушка в Советском округе, проспект Мира, 64, в районе ост. Политех, 50/34/8, 3/5п, не требует ремонта, санузел раздельный, хрущевка.”
  • 35.
    35 Существующие внедрения –платформа для контекстной рекламы • Требование – время отклика строго меньше 100 мс • Попытки задействовать ElasticSearch, MongoDb и т.д. дают в некоторых случаях 200 мс и больше • Был написан актор, который хранит все критерии рекламных компаний сразу в памяти. • Получили время отклика 7-46 мс (сам поиск по структуре в памяти < 1 мс) • Для масштабирования система поддерживает работу с несколькими экземплярами серверов
  • 36.
    36 Существующие внедрения – кроссплатформенноеприложение • Приложение считает время по каждой задаче программиста, снимает скриншоты, мониторит активность клавиатуры и мыши • Интерфейс написан на HTML5 и CSS3 • Бизнес-логика написана на нашей библиотеке • Приложение работает без изменений под Mac, Window, Linux (кроме методов снятия скриншота и логирования активности – это малая часть – до 40 ч работы – по сравнению со всем приложением)
  • 37.
    37 Пример: Регистрация пользователя •При выполнении операции могут возникнуть ошибки при: • Записи в БД • Отправки email • Отправки ответа пользователю • Если запись в контрольную точку прошла, то операция может быть полностью выполнена, даже если при первом выполнении возникла ошибка на любом из этапов • ! Единственный компонент, о надежности которого необходимо заботиться – контрольная точка. • ! Компоненты должны быть идемпотентными Запись нового пользователя в БД Отправить email
  • 38.
    38 Пример: Разделяемый объектКорзина • В БД хранится не самое последнее состояние из-за гонок параллельных запросов, которые модифицируют одну и туже корзину • В памяти хранится всегда актуальное состояние из-за того, что один актор в любой момент времени обрабатывает только одно сообщение • Идемпотентность корзины достигается за счет регистрации в корзине тех операций, которые были обработаны • При восстановлении после сбоя, чтобы получить актуальное состояние корзины, необходимо повторить операции, которые не отражены в последнем записанном состоянии корзины Добавить в корзину (в памяти) Сохранить корзину в БД
  • 39.
    39 Спасибо за внимание ЕвгенийТюменцев HWdTech, LLC etyumentcev@hwdtech.ru twitter.com/etyumentcev