Приложения с маленькими задержками на 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