JS Fest 2019. Игорь Березин и Николай Крещенко. Эволюция архитектуры многогра...JSFestUA
За 3 года существования, “Koyfin” претерпел множество изменений.
Проект прошел путь от MVP до сложной системы сбора и обработки большого количества финансовых данных с десятками микросервисов и тоннами логики. Как жить, когда проект содержит огромное количество репозиториев, микросервисы отправляют и читают из шины тысячи разношерстных сообщений в минуту и кажется, что от попыток за всем уследить скоро взорвется голова? Как поддерживать консистентность, скорость, отказоустойчивость и при этом сохранять гибкость?
Мы рассмотрим с Вами основные проблемы, с которыми мы столкнулись, и поделимся результатами творческих мук в поиске их решения. Расскажем об инструментах и техниках, которые помогают нам каждый день
JS Fest 2019. Игорь Березин и Николай Крещенко. Эволюция архитектуры многогра...JSFestUA
За 3 года существования, “Koyfin” претерпел множество изменений.
Проект прошел путь от MVP до сложной системы сбора и обработки большого количества финансовых данных с десятками микросервисов и тоннами логики. Как жить, когда проект содержит огромное количество репозиториев, микросервисы отправляют и читают из шины тысячи разношерстных сообщений в минуту и кажется, что от попыток за всем уследить скоро взорвется голова? Как поддерживать консистентность, скорость, отказоустойчивость и при этом сохранять гибкость?
Мы рассмотрим с Вами основные проблемы, с которыми мы столкнулись, и поделимся результатами творческих мук в поиске их решения. Расскажем об инструментах и техниках, которые помогают нам каждый день
Дима Гадомский (Юскутум) “Можно ли позаимствовать дизайн и функционал так, чт...Provectus
The document discusses intellectual property rights, copyright, and design copying. It covers several court cases related to alleged copying between companies. It then discusses the different types of intellectual property rights like copyright, patents, trademarks, and trade secrets. The document also outlines the terms and conditions for the Apple iPhone Developer Program License Agreement, including provisions around ensuring applications do not violate third party intellectual property rights.
Василевский Илья (Fun-box): "автоматизация браузера при помощи PhantomJS"Provectus
The document discusses PhantomJS, an open-source headless WebKit browser that allows for automating web page interaction and rendering using JavaScript. It can be used to capture screenshots, render PDFs, and test pages without needing a browser UI. The document provides examples of using PhantomJS to log messages, capture screenshots, and extract data from web pages. It also discusses how PhantomJS integrates with frameworks like Capybara to enable automated testing of web applications.
Сергей Моренец: "Gradle. Write once, build everywhere"Provectus
This document provides an overview of the Gradle build tool. It discusses Gradle's advantages over other build tools like Apache Ant, Apache Maven, and Apache Ivy. Key features of Gradle highlighted include its use of the Groovy language for build scripts, flexible and customizable builds, support for multi-project builds, caching, and integration with other tools. The document also provides examples of using Gradle for tasks like custom tasks, testing, plugins, and deployments.
Effective communication is essential for getting work done, building respect among colleagues, and creating a positive work environment. The document provides tips for crafting clear email communications, including using descriptive subject lines, limiting each email to a single topic, specifying the desired response, and responding to emails in a timely manner. Good communication skills can positively influence work performance and career advancement.
Apache Solr/Lucene Internals by Anatoliy SokolenkoProvectus
This document provides an overview of Apache Lucene and Solr. It discusses Lucene's data model, index structure, basic indexing and search flows. It also summarizes how Solr builds on Lucene to provide enterprise-level search capabilities with features like sharding, replication, and faceting. The document also covers text analysis in Lucene, spell checking, and references for further reading.
How and why to monitor web applications performance.
How to build it yourself with Ruby and Prometheus.
Introducing a set of gems to avoid reinventing the wheel.
Link to the talk video (in Russian): https://youtu.be/uYKZ86l3Tv0
Evolution of web-project requires scalable architecture and scalable development process. In my presentation (in Russian): different techniques, how to achieve this if talking about Perl-based web project.
Максим Барышников, Что такое типовые проблемы нагруженных проектов и как их р...Tanya Denisyuk
Расскажу, какие подходы и инструменты практически применяются в Wargaming при обработке данных в гигантской, без преувеличений, системе. Частичный список затрагиваемых вопросов
NoSQL versus/with RDBMS или каждый инструмент на своем месте
Синхронные и асинхронные подходы к построению систем: почему асинхронные системы не могут быть быстрее синхронных, но асинхронность, тем не менее, очень полезна
API и интерфейсы — важная составляющая хорошо спроектированной системы
Performance vs Scalability
Мониторинг и профилирование
Дима Гадомский (Юскутум) “Можно ли позаимствовать дизайн и функционал так, чт...Provectus
The document discusses intellectual property rights, copyright, and design copying. It covers several court cases related to alleged copying between companies. It then discusses the different types of intellectual property rights like copyright, patents, trademarks, and trade secrets. The document also outlines the terms and conditions for the Apple iPhone Developer Program License Agreement, including provisions around ensuring applications do not violate third party intellectual property rights.
Василевский Илья (Fun-box): "автоматизация браузера при помощи PhantomJS"Provectus
The document discusses PhantomJS, an open-source headless WebKit browser that allows for automating web page interaction and rendering using JavaScript. It can be used to capture screenshots, render PDFs, and test pages without needing a browser UI. The document provides examples of using PhantomJS to log messages, capture screenshots, and extract data from web pages. It also discusses how PhantomJS integrates with frameworks like Capybara to enable automated testing of web applications.
Сергей Моренец: "Gradle. Write once, build everywhere"Provectus
This document provides an overview of the Gradle build tool. It discusses Gradle's advantages over other build tools like Apache Ant, Apache Maven, and Apache Ivy. Key features of Gradle highlighted include its use of the Groovy language for build scripts, flexible and customizable builds, support for multi-project builds, caching, and integration with other tools. The document also provides examples of using Gradle for tasks like custom tasks, testing, plugins, and deployments.
Effective communication is essential for getting work done, building respect among colleagues, and creating a positive work environment. The document provides tips for crafting clear email communications, including using descriptive subject lines, limiting each email to a single topic, specifying the desired response, and responding to emails in a timely manner. Good communication skills can positively influence work performance and career advancement.
Apache Solr/Lucene Internals by Anatoliy SokolenkoProvectus
This document provides an overview of Apache Lucene and Solr. It discusses Lucene's data model, index structure, basic indexing and search flows. It also summarizes how Solr builds on Lucene to provide enterprise-level search capabilities with features like sharding, replication, and faceting. The document also covers text analysis in Lucene, spell checking, and references for further reading.
How and why to monitor web applications performance.
How to build it yourself with Ruby and Prometheus.
Introducing a set of gems to avoid reinventing the wheel.
Link to the talk video (in Russian): https://youtu.be/uYKZ86l3Tv0
Evolution of web-project requires scalable architecture and scalable development process. In my presentation (in Russian): different techniques, how to achieve this if talking about Perl-based web project.
Максим Барышников, Что такое типовые проблемы нагруженных проектов и как их р...Tanya Denisyuk
Расскажу, какие подходы и инструменты практически применяются в Wargaming при обработке данных в гигантской, без преувеличений, системе. Частичный список затрагиваемых вопросов
NoSQL versus/with RDBMS или каждый инструмент на своем месте
Синхронные и асинхронные подходы к построению систем: почему асинхронные системы не могут быть быстрее синхронных, но асинхронность, тем не менее, очень полезна
API и интерфейсы — важная составляющая хорошо спроектированной системы
Performance vs Scalability
Мониторинг и профилирование
Модным ныне словом «виртуализация» сейчас называют различные обёртки аппаратной виртуализации, однако этот термин намного старше и более всеохватывающий. На уровне ознакомления с технологией мы поговорим о виртуализации ресурсов в кластере и на примере pacemaker.
Мы рассмотрим область применения, архитектуру и основные особенности такой известной операционной системы как Android. Также расскажем о процессе создания мобильного приложения TulaDev, о проблемах с которыми мы столкнулись и о способах их решения. Вы можете найти приложение для Android <a>на Google Play</a>
Секрет производства: программный продукт, за который не будет стыдноCUSTIS
Открытый семинар для студентов в компании CUSTIS (15 октября 2015 года).
Лектор: Виктор Крапивин, архитектор.
Аннотация: В программном проекте разработчику постоянно приходится работать с унаследованным кодом созданных ранее программ, которые предстоит доделать, исправить или сделать источником примеров в дальнейшей практике. В процессе изучения такого исходного кода программисты часто возмущаются, порой не без оснований заявляя: «Ну кто же так пишет?!». Многочисленные непонятные решения, срочные заплаты для исправления критических ошибок, «костыли» — во всем этом непросто разобраться даже при наличии документации, а ведь иногда она уже не актуальна или ее нет совсем.
Создавая программный продукт, который может «дожить» до промышленной эксплуатации, необходимо помнить, что рано или поздно он попадет в руки программистов, не имеющих отношения к его первоначальной разработке. В ходе этого семинара мы на примерах из мира Java продемонстрируем, как создать этот продукт таким образом, чтобы «потомки» остались довольны.
Видеозапись семинара: https://vimeo.com/142895727.
Федор Поляков (Looksery) “Face Tracking на мобильных устройствах в режиме реа...Provectus
The document describes an algorithm for real-time face tracking. It discusses optimizing the algorithm from 3 FPS to 30 FPS by rewriting bottleneck code in assembler, replacing float operations with integer operations, and adding multithreading. It also notes some issues with iOS 8 that slowed performance from 30 FPS to 15 FPS and possible reasons. Contact information is provided at the end.
2. Большой проект
30 человек
4 года
330 000 строк кода
20 репозиториев
сложная предметная область
технические решения на границе экосистемы
Ruby
рядом аналитический стек на
Hadoop/Java/Python
2 / 20
3. Сложность предметной области
Управление спросом (Demand Response)
▶ N раз в год c XX:XX до YY:YY часов цены внезапно
повышаются
▶ события сгруппированы в программы
▶ уведомление людей
▶ уведомление устройств
Тарифный план
▶ энергия: 0 — 100 кВч, 100 — 400 кВч,…
▶ время: 8:00 — 12:00, 12:00 — 16:00,…
▶ мощность: 10 кВ, 20кВ,…
▶ пиковые часы: 12:00 — 14:00 послезавтра
▶ время действия: июнь — август
Развитие стандартов: 2.0 и 1.0 — это две
большие разницы
3 / 20
4. Rails — говно
Покрывает 95% случаев
Культура необразованных упорков
Мантры как мины
MVC не масштабируется
«Всё уже написано до нас»
4 / 20
5. Виджет — проблема
Автономный встраиваемый кусок
функциональности
Имеет независимый от «большой» страницы
поток управления
Плохо ложится на ReST и рельсовый MVC
Пример: создание и редактирование события
управления спросом
5 / 20
6. Виджет — решение
Apotomo: https://github.com/apotonick/apotomo
class ParentController ActionController::Base
has_widget do |root|
root widget(:event)
end
# ...
end
class EventWidget Apotomo::Widget
def new(args = {}); render; end
def edit(args = {}); render; end
def create(event); end # event — внутреннее для
Apotomo событие
end
# Внутри шаблона
= render_widget :event, :new
6 / 20
7. Event sourcing внутри приложения
Легкое горизонтальное масштабирование
Несколько действий на один сигнал
7 / 20
8. Базовое идеологическое про события
Что-то произошло ) что-то надо делать
Началось ) что-то надо делать
Закончилось ) что-то надо делать
На одно событие может быть 100500 действий
8 / 20
9. Event sourcing vs Resque
За Resque:
тот же «запустил и забыл»
та же легковесность запуска
то же масштабирование — воркеры можно
разнести по разным машинам
Против Resque:
один сигнал — одно действие
9 / 20
10. Общая шина сообщений
Можно использовать лучшее из обоих подходов:
очередь сообщений — для сообщений,
Resque — для действий.
10 / 20
11. Сообщения vs HTTP API
К рассмотрению:
Тяни или толкай
Объём даннных
Очевидно:
малый объём оповещения — сообщения
большой объём данных — стягиваем через HTTP
API
11 / 20
13. Observers
Против:
не входят в Rails 4
непрозрачны, слишком много магии
За:
SRP: шлём сообщения
Против:
есть выход и получше
13 / 20
14. Request/Operation
Уточнённый кусок DDD: Boundary и Service
https://github.com/apotonick/trailblazer:
Contract/Operation
Request — контракт:
▶ первичная валидация, что параметры ок
▶ удобство доступа к объектам предметной
области
▶ иммутабельный FormObject или ParameterObject
class EventsController::Create::Request
attr_reader :start_time
def initialize(params)
@device_uid = params[:device_uid]
@start_time = params[:start_time]
end
def device
@device ||= Device.find_by_uid(@device_uid)
end
end
14 / 20
15. Request/Operation
Operation — кусок бизнес-логики AKA Service
(DDD) AKA Command (CQRS).
В простейшем случае отвечает только на
идемпотентный вызов #success?
Есть проблема с пространством имён —
некрасиво
class EventsController
def create
operation = Create::Operation.new(Create::Request.
new(params))
if operation.success?
# ...
else
# ...
end
end
end
15 / 20
16. Ограниченные контексты и разные
языки
Главная система со своим сложившимся
лексиконом
Smart Energy Profile 2
OpenADR 2.0b
Разные языки — разные серверы
Антикоррупционный слой через HTTP API
▶ Хозяин и раб
▶ Адаптер на стороне хозяина: переименование и
комбинация
▶ Декоратор на стороне раба: сложно
▶ Срезаем углы: ActiveAdmin как JSON API
▶ Углы могут кусать: id vs uid
16 / 20
17. Разделение на гемы
Горизонтальное — по слоям — ок
Вертикальное — самоубийство
Связанные жизненные циклы — зло
Корпоративное пространство имён — ок, если
готовить правильно
Помни о близнецовой связи (connascence)
17 / 20
18. Кодерские мелочи
Декораторы убивают хелперы, и это хорошо
FormObjects вместо accepts_nested_attributes_for
Иммутабельность FTW
Щепотка ФП: #flat_map, #inject, #take
Если появляется QueryObject, что-то сдохло в
консерватории
Yardoc
18 / 20
19. Бог не фраер
Ибо очи Его над путями человека, и Он видит все
шаги его
Абстракции
Границы
Асинхронность
SOLID
Документация
Рациональность
19 / 20