Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Что такое квадриллион? Это единица с 15-ю нулями, численность популяции муравьев на планете или 100 световых лет в километрах. А еще это объем торгов в рублях на Московской бирже за 2021 год.
Чтобы достичь такого результата, компания должна быть очень технологичной, очень надежной и очень быстрой. Поэтому более 50% штата Биржи – айтишники, работающие с передовым набором технологий, уровень надежности наших ИТ-систем стабильно составляет 99,99%, а еще мы постоянно разгоняем наши системы и процессы. Об одном из примеров такого ускорения рассказывает Григорий Доможиров, разработчик сервиса Data Grid.
– В компании есть куча систем-источников данных с одной стороны и систем-потребителей этих данных с другой. Я разрабатываю сервис, в котором эти данные сохраняются, предоставляя потребителям универсальный интерфейс доступа. Входящих данных генерируется много и происходит это быстро, а мы сохраняем их на скорости свыше 500 тысяч записей в секунду на пике.
Каким должно быть хранилище, чтобы выдерживать такие скорости? Во-первых In-memory, чтобы не тормозить о диск, во-вторых, – распределённым, чтобы распараллеливать запись. Такой класс решений называется In-Memory Data Grid, и яркий его представитель — Apache Ignite. Но просто установить его мало – чтобы добиться от него максимальной производительности, нужно правильно его «приготовить». И сейчас я расскажу, как.
Содержание
- Задача
- Выбор API
- Put
- Data Streamer
- PutAll
- Влияние параметров потока, кеша и кластера
- SQL
- Запись с серверного узла
- Размер POJO
- Размер batch’а
- Количество бэкапов
- Размер кластера
- Binary Object
- Дополнительные советы
- Распараллельте запись и подготовку данных
- Используйте CacheEntryProcessor
- Итоговая памятка
Задача
Будем складывать в key-value кеш входящий поток записей. Казалось бы, типичная задача и базовая операция, однако есть как минимум три способа это сделать, и рекомендуемый — не всегда самый быстрый. Неважно, откуда поступают данные (у нас это Apache Kafka), важно, что мы хотим обрабатывать максимально большой поток — то есть, добиться максимального количества записей в секунду при ограниченной задержке. Будет обзор API, подводные камни, бенчмарки влияния множества параметров, а также практические рекомендации на основе опыта разработки и года эксплуатации в проде.
Выбор API
Формализуем задачу. Пусть данные на входе представлены объектом некоторого класса с рядом полей, для определенности таким: «Value Object» или «POJO».
public class Data {
private byte[] payload;
private int int1 = 0;
private int int2 = 0;
private int int3 = 0;
private int int4 = 0;
private int int5 = 0;
private int int6 = 0;
private int int7 = 0;
private int int8 = 0;
private int int9 = 0;
...
}
Тип, имена и значения полей не так важны. Важно, что они примитивного типа, в реалистичном количестве, а объем в байтах можно варьировать. Будем реализовывать такой интерфейс:
write(List<Entry<Integer, Data>> data, IgniteCache<Integer, Data> cache);
и добиваться максимальной скорости выполнения. кеш будет in-memory (не персистентный), атомарный (не транзакционный) и партиционированный. Запускать всё будем на GridGain Community Edition 8.8.3 – это доработанный аналог Apache Ignite 2.8.3, заявляемый как production-ready. В версии Community Edition также бесплатный.
Put
Первая попытка в лоб: есть же
IgniteCache.put(...)
! Заполняли бы мы, например, HashMap — так бы и делали. Создадим кеш по умолчанию:ignite.createCache("benchmark");
и переложим в него данные:
data.forEach(entry -> cache.put(entry.getKey(), entry.getValue()));
Каждый объект наполним 200 байтами данных и запустим бенчмарк на кластере из 5 машин (Intel® Xeon® E5-2640 v3 @ 2,60 ГГц с виртуализацией, сеть 1000 Мбит/сек.). Высокопроизводительная распределённая система выдаст… 2555 записей/сек.
Поделиться ссылкой:
Интересные статьи
Интересные статьи
Почему Apache Kafka стала стандартом и основой архитектуры микросервисов. Как Kafka не только заменяет другое промежуточное ПО, но и позволяет создавать сами микросервисы с помощью DDD и нативных API ...
Apache Kafka — это платформа потоковой обработки событий, которую используют 30% компаний из Fortune 500. У Kafka много функций, благодаря которым платформа задает стандарт обработки со...
Uncanny Valley — участники конкурса песен, написанных при помощи искусственного интеллекта
Чтобы искусственный интеллект оказался полезен, он должен быть прост в управлении. Конкурс,...
В этой статье мы рассмотрим, как система управления 1С-Битрикс справляется с большими нагрузками. Данный вопрос особенно актуален сегодня, когда электронная торговля начинает конкурировать по обороту ...
Систематическое тестирование программного обеспечения, особенно в сообществе Python, часто либо полностью игнорируются или выполняются специальным образом. Многие программисты на Python совершенно не ...