61
Производительность Промышленное программирование

Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Embed Size (px)

Citation preview

Page 1: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

ПроизводительностьПромышленное программирование

Page 2: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Границы возможностей ЭВМ

Page 3: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Ресурсы машиныПроцессорная мощностьОперативная памятьДисковый ввод/выводСетевой ввод/вывод

Page 4: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

На что расходуются ресурсыПолучение запросов по сети, отдача

ответов - сетьПоддержание соединений и управление

ими - процессор, памятьОбработка запроса и формирование ответа

(т.е. логика) - процессор, памятьОтдача статического контента - диск

Page 5: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

На что расходуются ресурсыЧтение и запись в БД и ФС - дискКеши БД и ФС - памятьСложные запросы к БД (filter, aggregate,

join) - диск, память, процессорЗапросы к другим процессам - процессорЗапросы к другим машинам - сетьТелеметрия - диск, сеть

Page 6: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Чем меряют производительностьНагрузка (load) - число запросов в секунду

(Requests per second, RPS)Пропускная способность (throughput) -

максимальное значение нагрузки, которое выдерживает сервис, RPS

Задержка (latency) - время выполнения одного запроса, мс.

latency = f(load)

Page 7: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Из чего складывается задержкаПередача по сети в обе стороны (RTT)Установление TCP соединения (SYN+ACK)Получение и разбор запросаОбращение к базам данныхОбращение к другим сервисамВычисления, построение ответаОбработка (рендеринг) ответа на клиенте

Page 8: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Приемлемая задержкаRTT внутри ДЦ <1мсRTT из Москвы до Нью-Йорка - 120 мсRTT из Москвы до южного Китая - 250 мсGet в Redis - 0,3 мсPrepared query by PK в MySQL - 5 мсОтвет от Web-сервера - 50-200 мсРендеринг на клиенте - 50-100 мсНезаметное для человека время - 400 мс

Page 9: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

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

Page 10: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Последствия нехватки ресурсов

Page 11: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Если не хватает процессораЗа момент времени обрабатывается

запросов меньше, чем принимаетсяЗапросы встают в очередьОчередь не уменьшаетсяЗапросы не успевают выполнитьсяОчередь сжирает всю памятьКлиент фиксирует таймауты

Page 12: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Если не хватает объема памятиВыполнение запроса может спонтанно

прерваться в любое времяМожет спонтанно прерваться сервисный

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

остановлен расходующий память процессКлиент фиксирует всевозможные ошибки

Page 13: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Если не хватает скорости сетиНекоторые запросы фрагментируются,

засоряют очередь и отбрасываютсяНекоторые ответы теряютсяНарушается связь с другими узламиОтвалившиеся соединения образуют

очереди и расходуют память и процессорКлиент фиксирует таймаутыКлиент фиксирует ошибки протоколов

Page 14: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Если не хватает скорости дисковДисковые операции долго висят в

ожидании, блокируют друг друга или теребят контроллер диска

Существенно увеличивается время обработки запросов

За момент времени обрабатывается запросов меньше, чем принимается…

См. нехватку процессора

Page 15: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Если не хватает объема дисковПрекращается сбор телеметрии (логи,

мониторинг) - оператор системы слепнетСпонтанно прекращается запись на диск,

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

систем, пишущих на дискКлиент фиксирует ошибки сервисаСистема может жить в Read-Only

Page 16: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Чего еще может не хвататьФайловых и сокетных дескрипторовДескрипторов потоков и процессовСкорости северного моста (можно считать,

что процессора)Скорости южного моста - связки между

процессором и I/OМощности отдельных устройств - сетевой

карты, дисковых контроллеров и т.п.

Page 17: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Увеличение доступных ресурсов

Page 18: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Оптимизация расхода ресурсовРефакторинг кодовой базыАсимптотческая оптимизация алгоритмовДедупликация данных, устранение

избыточности, рефакторинг моделейУпорядочивание запросов к дискуКеширование расчетов и данных с дискаПереход на NIO, бинарные протоколы,

внедрение сжатия

Page 19: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Разделение ролейВынос баз данных на отдельные машиныРазнесение автономных модулей на

разные машиныСоздание дополнительных проксирующих

прослоек на других машинах+ Вышли за пределы одной машины- Повысили расходы на коммуникацию

Page 20: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Вертикальное масштабированиеЗаменить в сервере процессорыВоткнуть туда больше памятиВставить быстрый RAID-контроллерЗаменить диски на SSDОбновить сетевой адаптерПереехать на новый сервер…Весело. Но дорого.

Page 21: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Горизонтальное масштабированиеРаспараллелить выполнение программыУбрать критические секцииОблегчить работу с общими ресурсамиОбеспечить запуск на нескольких машинахРавномерно распределить нагрузкуМинимизировать связь между машинамиПолучать прирост пропускной способности

при росте числа машин

Page 22: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Эластичное масштабированиеЛинейная пропорция между пропускной

способностью и объемом ресурсовВозможность подключения и отключения

машин к кластеру без его остановкиОтсутствие единой точки отказа

Page 23: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Распределенные системыПромышленное программирование

Page 24: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Архитектура распределенных систем

Page 25: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Клиент-сервер

Page 26: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Клиент-серверМонопольный контроль над БДПросто программироватьОтрисовка данных на клиенте (опц)Кросс-платформенность с помощью

портирования клиентовЕдиная точка отказаНельзя горизонтально масштабировать

Page 27: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Толстый VS Тонкий клиентыТонкий клиент только посылает запросы и

отображает ответыТолстый клиент проводит некоторые расчеты

без запросов к серверуТонкий клиент проще в реализацииТолстый клиент сложнее, но быстрееНа толстом клиенте данные могут устаретьТолстый клиент плохо портируется

Page 28: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Web-приложения

Page 29: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Web-приложенияСтандартный протокол - HTTPСтандартный клиент - браузерСтандартные client-side средстваТяжелый, избыточный трафик*Слабая client-side производительностьПочти кросс-платформенноПроблемы с портируемостью графики

Page 30: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Backend - Frontend - Client

Page 31: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Backend - Frontend - ClientРазделение server-side на слоиМасштабирование каждого слоя отдельноВозможность дробить систему на частиОчень большой трафик внутри кластераЗначительно сложнее разработкаУзкая специализация разработчиков

Page 32: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Service-Oriented Architecture (SOA)

Page 33: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Service-Oriented Architecture (SOA)Физическое выделение отдельных

компонентов на отдельную машинуУменьшение связности между

компонентами - упрощение разработкиВозможность регулировать работу каждого

сервиса отдельноЗначительное усложнение адресации

внутри кластера

Page 34: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Role-based адресацияЗакрепление за машиной роли - запуск на

ней определенных сервисовВсегда ясно, где подняты инстансы сервисаЛегкая стартовая конфигурация со сложным

“горячим” изменениемВозможно оптимально подобрать железо под

нужды конкретного сервиса

Page 35: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Cloud-based адресацияВыделение пула машин, на которых могут

быть запущены разные сервисыГибкое переключение и оперативное

реагирование на нагрузку и сбоиПриходится абстрагироваться от железаНеобходима отдельная инфраструктура

для учета и управления кластером

Page 36: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Межпроцессное взаимодействие

Page 37: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Способы передачи данныхПередача файловОбщая база данныхРазделяемая памятьПотоки и каналы данныхОбщение через брокер

Page 38: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Организация потоков данныхTransport-level потоки:

UNIX SocketTCP SocketUDP Stream

Protocol-level потоки:BinaryPlain text

Page 39: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Прикладные протоколыTelnet - clear plain text over TCPHTTP - convention over plain text over TCPCORBA - binary, configurableSOAP, REST, XML-RPC - over HTTPApache Avro, Apache Thrift - binary over TCP…

Page 40: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

HTTPHyperText Transfer Protocol, 1992Plain Text, line-basedРазличные типы запросов - GET, POST,

PUT, HEAD, …Коды ответа - 200 ОК, 404 Not Found, … Заголовки - Content-Type:text/html, … Blobs via Base64

Page 41: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

RESTRepresentational State Transfer, 2000Over HTTPClient-ServerStateless (no sessions)CacheableUniform interfaceLayered

Page 42: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

REST: трактовка HTTP запросовGET /collection - получить всю коллекциюPUT /collection - заменить всю коллекциюPOST /collection - добавить элемент в коллекциюDELETE /collection - очистить коллекциюGET /collection/item - получить элемент по IDPUT /collection/item - заменить элемент по IDDELETE /collection/item - удалить элемент

Page 43: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Промышленное программирование

Пользовательские интерфейсы

Page 44: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Web-интерфейсыЗдесь должны быть слайды про

реализацию Web UI средствами Java, Thymeleaf и Spring Web MVC

Но нет

Page 45: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Промышленное программирование

Угрозы безопасности

Page 46: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Ахтунг!Эта лекция не дает исчерпывающего

списка возможных угрозЛекция призвана только лишь обратить

внимание на проблему, но не дает сколь-нибудь приемлемого решения

Tl;dr: кругом враги, приложения полны дыр, уделяйте внимание безопасности

Page 47: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

ТерминологияУгроза УязвимостьАтака

Подробнее: Т.Иващенко, Яндекс ШРИ

Page 48: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Виды угрозОтказ в обслуживании (DoS)Перехват данных пользователяПодмена действий пользователяУтечка данных приложенияМодификация данных приложенияПерехват управленияПроникновение в незащищенную зону…

Page 49: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Отказ в обслуживании (DoS)Генерация множества одновременных

запросов к приложениюЭксплуатация чувствительных к нагрузке

участков кода и методов APIИсчерпание аппаратных ресурсовДеградация сервиса вплоть до отказа

Page 50: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Перехват данных пользователяСредства прослушки:

Незащищенные публичные сетиСнифферы трафикаПрокси (HTTP Proxy, NAT, анонимайзеры, …)

Спуфинг (подмена) ARP, IP, DNS, … Атаки Man-In-The-MiddleФишингСоциальная инженерия

Page 51: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Подмена действий пользователяКража учетной записиКража сессии (авторизационной куки)Атаки MITM с модификацией запросовCross-Site Request Forgery (CSRF)Cross-Site Scripting (XSS)

Page 52: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Утечка и модификация данныхИнъекции SQL, JS, Shell, XPath, …Неустойчивые к перебору идентификаторы

(пользователей, сессий, ресурсов, …) Служебные страницы без авторизацииУязвимости в серверном ПО

Page 53: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Перехват управленияБезумные служебные страницыИнъекции исполняемого кодаShell-инъекцииУязвимости в бинарном коде ПОНедостаточно защищенные средства

удаленного администрирования

Page 54: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Уровни угрозыВнешняя угроза

ИнъекцииВнутренняя угроза

Перехват управления системным пользователемПерехват управления суперпользователемПолучение доступа к базам данных (R, W)Компрометация системы внутридоменной

аутентификации

Page 55: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Промышленное программирование

Защита приложения

Page 56: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Защита транспортного уровняSSL/TLS: HTTPS

DSA для аутентификацииRSA+DH для обмена шифрамиAES/3DES/… для обмена трафиком

Защищает от:прослушки трафикаподмены ARP, IP, DNSатак MITM

Page 57: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Аутентификация и авторизацияАутентификация - определение личности:

Учетные записиПользовательские сессииПодписывание (digesting) запросов

Авторизация - проверка уровня доступа:Роли пользователейГруппы и разрешения (Groups & Permissions)Раздельный доступ к ресурсам

Page 58: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Защита аутентификацииШифрование учетных данных по пути от

клиента к серверу (сеансовым ключом)Хеширование идентификатора сессииСоленое хеширование паролей в БДМногофакторная аутентификация

Осложняет кражу учетной записи или сессии

Page 59: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Валидация запросовЗащита от инъекций - экранирование,

prepared-запросы, отказ от exec()Совершение действий только на POSTCSRF-токены для веб-формRequest Digesting для REST API

Page 60: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Защита ресурсовОбязательная авторизация всех запросовМаскировка идентификаторов ресурсовВынос служебных ресурсов в интранетСокрытие средств удаленного

администрирования в интранете

Page 61: Industrial Programming Java - Lection Pack 02 - Distributed applications - Lavrentyev Fedor

Защита от (D)DoS и роботовПоиск подозрительной активности

(некорректные, неестественные запросы)Выявление типового поведения (краулеры,

накрутчики)Ограничение подозрительных подсетей

(интенсивный однотипный трафик)Сетевое оборудование с возможностью

анализа и ограничения трафика