На прошлой неделе компания LMAX где я работаю, получил премию Java Премия "Выбор герцога" 2011 г.
для платформы Disruptor. Ранее об этой технологии написал Мартин Фаулер , известный многим читателям своими публикациями по объектному программированию.
В этой статье я хотел бы кратко рассказать об этой технологии, а также о конкретной проблеме, которую эта технология решает в LMAX. LMAX предоставляет торговую платформу CFD и Forex с очень низкой задержкой и высокой пропускной способностью.
Для достижения скорости выполнения более 10 тысяч операций в секунду компания LMAX разработала паттерн Disruptor. Это совершенно новый и весьма нетрадиционный подход к решению задач параллельного программирования.
Disruptor — это многопоточная платформа параллельной обработки транзакций с высокой пропускной способностью и очень низкой задержкой.
Disruptor LMAX заменяет java.util.concurrent.ArrayBlockingQueue и превосходит его по производительности до 80 раз.
Проблема многопоточного программирования
Тестирование производительности показало, что использование очередей для передачи данных между частями системы приводит к задержкам.Блокировку потоков и семафоры сложно понять и протестировать, и зачастую на их отладку уходит больше времени, чем на решение реальной проблемы.
Также тестирование многопоточного программирования показало, что использование нескольких потоков зачастую не только не приводит к высокой производительности, но и снижает ее.
Таблица иллюстрирует стоимость увеличения 64-битного счетчика в 500 миллионов раз с использованием различных методов на процессоре Nehalem 2,4 ГГц (адаптировано из блог коллеги ).
Метод | Время (мс) |
Одна нить | 300 |
Один поток с барьером памяти | 4,700 |
Один поток с CAS | 5,700 |
Два потока с CAS | 30,000 |
Одна нить с замком | 10,000 |
Две темы с блокировкой | 224,000 |
LMAX-подход
Давайте воспользуемся простым примером для иллюстрации.Представьте, что вы заказываете упаковку шоколадных конфет и платите за них кредитной картой.
Простая розничная система возьмет информацию о вашем заказе, воспользуется службой проверки кредитной карты для проверки номера вашей карты, а затем подтвердит ваш заказ, и все это за одну транзакцию.
Поток, обрабатывающий ваш заказ, будет заблокирован в ожидании проверки кредитной карты, но эта блокировка не будет очень долгой для пользователя, и сервер всегда сможет запустить другой поток на процессоре.
В архитектуре LMAX эта операция будет разделена на две части.
Первая операция — сбор информации о заказе, которая завершится выходом события (запросом на проверку кредитной карты) для компании-эмитента кредитной карты.
Затем процессор бизнес-логики продолжит обработку событий для других клиентов до тех пор, пока не получит событие проверки кредитной карты во входной поток событий.
После обработки этого события заказ будет подтвержден.
Disruptor — это очень высокоскоростной способ обмена сообщениями между потоками с низкой задержкой.
Это похоже на очередь за стероидами (много стероидов!) и является одним из главных нововведений биржи LMAX. Disruptor включает в себя производителя, потребителя и циклический буфер.
Каждый производитель и потребитель знает порядковый номер — ячейку в буфере, которую он в данный момент обрабатывает. Каждый производитель и потребитель записывает свой номер в счетчик и может считывать показания других счетчиков.
Таким образом, потребитель может прочитать счетчик производителя, чтобы убедиться, что ячейка, в которую он хочет записать, доступна.
Потребитель также может проверить, что он обрабатывает сообщение, только после того, как другой потребитель завершит обработку.
Преимущество Disruptor в том, что потребители могут быстро наверстать упущенное, если они отстают. Если распознаватель сообщений (демаршаллер) столкнулся с проблемой в ячейке 15 и осознал это, когда получатель находился в ячейке 31, он мог прочитать данные из ячеек 16–30 за один раз и быстро наверстать упущенное.
Возможность чтения больших блоков помогает отстающим потребителям быстро наверстать упущенное, тем самым сокращая задержку.
Процессор бизнес-логики управляет всей бизнес-логикой с помощью однопоточной программы Java, которая реагирует на вызовы методов и создает выходные события.
Он работает полностью в оперативной памяти, без базы данных или другого постоянного хранилища.
Хотя бизнес-логика выполняется в одном потоке, перед вызовом бизнес-объекта необходимо выполнить ряд задач.
Входящее сообщение из сети необходимо демаршаллировать в удобный для бизнес-логики формат, сохранить на надежном носителе, чтобы иметь возможность восстановить данные в случае аварии.
Эти проблемы решаются с помощью прерывателей входа и выхода.
В отличие от процессора бизнес-логики, это параллельные компоненты, поскольку они включают операции ввода-вывода, которые медленны и независимы.
Поскольку поток входных событий хранится в надежном хранилище (это одна из задач прерывателя ввода), всегда можно восстановить текущее состояние процессора бизнес-логики путем повторного воспроизведения входных событий — так же, как и в системе контроля версий.
системе, проведя последовательность изменений, можно получить окончательную версию документа.
Выводы и ресурсы
Disruptor не является универсальным решением для каждой разработки, но при правильном использовании может показать заметный прирост скорости работы программных систем.Зачастую финансовые компании не рассказывают о своих технологиях.
LMAX не только открыто рассказывает о своих разработках (см.
блоги ), но также выпустил код Нарушитель в открытом исходном коде .
Смотрите также - Официальный сайт LMAX И Партнерский сайт LMAX на русском языке .
P.S. Добавлю, что этот фреймворк лежит в основе торговой платформы LMAX, запущенной год назад и успешно обрабатывающей тысячи транзакций в секунду.
Теги: #Параллельное программирование #шаблоны #java #награды #скорость #Высокая производительность #высокопроизводительные вычисления #Высокая производительность
-
Как Снизить Стоимость Веб-Хостинга Mac
19 Oct, 24 -
7 Сервисов Для Мониторинга Сайтов
19 Oct, 24 -
Развод На Грани Ограбления
19 Oct, 24 -
Ubs И Uaportal Сменили Владельца
19 Oct, 24