Приложения с маленькими задержками на java. Часть 2.

Часть 1: часть 1 Вопрос 7. На какую задержку нацеливать приложение? Ответ 7. Зависит от сферы использования приложения. К примеру, торговая система для размещения валютных ордеров должна быть нацелена на задержку менее 20 миллисекунд; типичное веб приложение — на задержку в интервале 200-800 миллисекунд; игровое приложение или просто продвинутое веб приложение — на задержку от 500 до 1000 миллисекунд. Вопрос 8. Что можно сделать для уменьшения задержки продвинутого веб сайта? Ответ 8. - Асинхронная обработка запросов благодаря использованию очереди и получению результата позднее. - Уменьшение сложности страницы — разбиение задач c точки зрения улучшения user experience. - Уменьшение количества мусорных данных из-за нарушения принципов ОП благодаря использованию примитивных типов данных и паттерна Приспособленец для повторного использования объектов. - Профилирование приложения инструментами вроде VisualVM для определения бутылочных горлышке в плане использования процессора, памяти, пауз сборщика мусора и т.д. - 13 советов для написания приложений с маленькой задержкой советы Вопрос 9. Что мы понимаем под терминами системы реального времени, задержка и масштабируемость? Ответ 9. Понятие реального времени и низкой задержки совершенно различны, хотя их часто связывают друг с другом. Понятие реального времени больше связано с предсказуемостью, чем со скоростью. Системы с маленькой задержкой должны быть быстрыми – отвечать требованиям SLA (Service Level Acceptances) в микросекундах. Масштабируемость означает возможность системы удовлетворять возросшие запросы посредством добавления процессоров, памяти, серверов. Вопрос 10. Каковы рекомендации по написанию приложений с маленькой задержкой на java? Ответ 10. - Использование многопоточности: executors, future, completable future, fork/join, многопоточные типы данных и т.д. - Понимание модели памяти в java, настроек сборщика мусора. - Использование неблокирующих парадигм и event-based технологий, таких как Apache MINA, Netty, Grizzly, and Akka. - MINA и Netty являются более низкоуровневыми по сравнению с Akka, в ядре они используют NIO (New Java IO). NIO управляется событиями и является неблокирующей парадигмой. - Akka является более высокоуровневым фреймворком для написания event-driven масштабируемых отказоустойчивых приложений. Akka написана на языке Scala, который позволяет использовать классы как в Scal, так и java проектах. Akka использует модель акторов для того, чтоб скрыть потокозависимый код, и предоставляет по-настоящему простой и полезный интерфейс для реализации масштабируемых и отказоустойчивых систем. - Несмотря на наличие такого фреймворка как Akka, вы должны уметь писать многопоточный код на java, т.к. Akka имеет свои подводные камни при использовании, а интервьюеры любят задавать вопросы про потоки, локи, гонки и их отладку. Надо учитывать, что написание многопоточного кода без использования фреймворков может привести к ошибкам и ухудшению читаемости, тестируемости и поддерживаемости. - Если вы работаете с BigData, обратите внимание на Apache Spark, который основан на Scala & Akka Toolkit. Вот пример того, как приложение со Spark master создает и раздает задания на Spark Executor-ы. На картинке показаны два их них, но обычно счет идет за сотню вершин и executor-ов (исполнителей).
SparkContext-Executor
Исполнители — это процессы на нодах, которые отвечают за выполнение индивидуальных тасков в рамках Spark задачи. Исполнители запускаются при старте приложения и обычно работают всё время жизни приложения. Как только они завершили обработку тасков, они посылают результат в Driver Application. Spark Executor-ы обеспечивают in-memory хранение RDD. Вопрос 11. Что такое actor model в Akka (так же известна как reactor design pattern)? Ответ 11. Это паттерн дизайна для написания многопоточного и масштабируемого кода, который выполняется в распределенной системе. Модель управляется событиями (прохождением сообщений к акторам и обратно). Ключевые положения: 1. Вместо непосредственного использования объекта, вы составляете сообщение и передаете его объекту-актору. 2. Каждый поток — это актор со специфической задачей. Движок хранит сообщения в очереди. 3. Когда поток становится доступным, движок, контролирующий актор, доставляет сообщение актору-адресату. 4. Когда актор завершает выполнение задачи, он посылает свое собственное сообщение обратно в объект-отправитель. 5. Вы можете управлять тем, какие сообщения пропускать к каким акторам и при каких условиях. Модуль akka-camel позволяет использовать “Untyped Actors” для получения и отправки сообщений по широкому спектру протоколов: HTTP, SOAP, TCP, FTP, SMTP or JMS а также API языков программирования java и Scala.
You can leave a response, or trackback from your own site.

Leave a Reply