Dragonfly представляет собой замену Redis, предназначенную для обеспечения гораздо лучшей производительности с гораздо меньшим количеством серверов. Один узел может обрабатывать миллионы запросов в секунду и до 1 ТБ данных в памяти. В этой статье мы рассмотрим, как использовать Dragonfly с Laravel, одним из самых широко используемых и хорошо известных веб-фреймворков.
Dragonfly полностью совместим с интерфейсом Redis, что означает, что разработчики Laravel могут интегрировать его в качестве драйвера кэша и очереди, не изменяя ни одной строки кода. Эта бесшовная интеграция может предложить легкий путь обновления с существенными преимуществами.
Так что, будь вы опытный ветеран Laravel или только начинаете, присоединяйтесь к нам, когда мы ступаем в мир Dragonfly и Laravel.
Начало работы
Давайте начнем с настройки нового экземпляра Dragonfly. Посетите нашу документацию здесь, чтобы скачать образ или бинарный файл и быстро запустить экземпляр Dragonfly. Как только экземпляр Dragonfly будет работоспособен и доступен, интеграция его с вашим проектом Laravel будет простой. К счастью, Laravel уже полностью поддерживает Redis, поэтому все его драйверы можно повторно использовать. Чтобы использовать Dragonfly в вашем приложении Laravel, начните с обновления файла .env
с следующими конфигурациями.
Для кэширования и управления сессиями:
CACHE_DRIVER=redis
SESSION_DRIVER=redis
Для интеграции Dragonfly в качестве драйвера очереди также:
QUEUE_CONNECTION=redis
Несмотря на то, что мы используем redis
в качестве значения драйвера, Dragonfly разработан как прямая замена Redis, поэтому дополнительной установки драйвера не требуется. С установленным драйвером следующим шагом является обеспечение возможности коммуникации Laravel с экземпляром Dragonfly. Это включает в себя обновление файла .env
с правильными деталями подключения:
REDIS_HOST
: Хост или IP-адрес сервера Dragonfly.REDIS_PORT
: Порт, на котором работает экземпляр Dragonfly.REDIS_PASSWORD
: Пароль для экземпляра Dragonfly, если он установлен.
Вот пример конфигурации:
REDIS_HOST=127.0.0.1 # Replace with Dragonfly host
REDIS_PORT=6379 # Replace with Dragonfly port
REDIS_PASSWORD=null # Replace with Dragonfly password if applicable
После обновления этих настроек проверьте соединение, выполнив простую операцию, такую как INFO
в Laravel. Если возникнут проблемы с подключением, проверьте значения хоста, порта и пароля. Также убедитесь, что сервер Dragonfly работает и доступен из окружения вашего приложения Laravel.
use Illuminate\Support\Facades\Redis;
// Выполните команду INFO и выведите версию Dragonfly.
Redis::info()["dragonfly_version"];
Бóльшая эффективность как кэш
Кэширование часто используемых значений является одной из основных функций встроенных баз данных, таких как Dragonfly и Redis, благодаря их быстрой скорости отклика. Именно здесь Dragonfly преуспевает, особенно в сценариях, связанных с большим количеством ключей и клиентов, типичных для центрального кэша многоузловых систем или микросервисов.
A standout feature of Dragonfly is the cache mode, designed specifically for scenarios where maintaining a lean memory footprint is as crucial as performance. In this mode, Dragonfly evicts the least recently accessed values when it detects low memory availability, ensuring efficient memory usage without sacrificing speed. You can read more about the eviction algorithm in the Dragonfly Cache Design blog post.
Активация режима кэша проста. Вот флаги, которые вы используете для запуска Dragonfly в этом режиме, с ограничением памяти в 12 ГБ:
./dragonfly --cache_mode --maxmemory=12G
Рассмотрим сценарий, когда вашему приложению необходимо обрабатывать большой объем запросов с обширным набором данных. В таких случаях режим кэширования Dragonfly эффективно управляет использованием памяти, обеспечивая быстрый доступ к данным, что гарантирует, что ваше приложение остается отзывчивым и гибким.
С точки зрения API, должна поддерживаться вся функциональность фасада кэша Laravel. Например, чтобы сохранить заданный ключ и значение с определенным временем истечения, можно использовать следующий фрагмент:
use Illuminate\Support\Facades\Cache;
// Сохранение значения с временем истечения 10 минут.
Cache::put("key", "value", 600);
Использование памяти
Одно из преимуществ использования Dragonfly в качестве кэша — его заметно меньшее использование памяти для большинства случаев применения. Давайте проведем простой эксперимент и заполним как Redis, так и Dragonfly случайными строками, измеряя их общее использование памяти после заполнения данными.
Dataset | Dragonfly | Redis |
---|---|---|
3 Million Values of Length 1000 | 2.75GB | 3.17GB |
15 Million Values of Length 200 | 3.8GB | 4.6GB |
После проведения эксперимента мы заметили, что использование памяти Dragonfly на 20% ниже по сравнению с Redis в аналогичных условиях. Это позволяет хранить значительно больше полезной информации при тех же требованиях к памяти, делая кэш более эффективным и достигая более высокой покрываемости. Более подробную информацию о пропускной способности Dragonfly и использовании памяти можно найти в посте блога о масштабируемости и производительности Redis vs. Dragonfly.
Создание снимков
Помимо меньшего потребления памяти, Dragonfly также демонстрирует стабильность во время процессов создания снимков. Создание снимков, особенно в занятых экземплярах, может быть сложной задачей с точки зрения управления памятью. С Redis, создание снимка на активном экземпляре может привести к увеличению потребления памяти. Это происходит потому, что Redis должен копировать страницы памяти, даже те, которые были лишь частично перезаписаны, что приводит к скачку в потреблении памяти.
В отличие от этого, Dragonfly корректирует порядок создания снимков в зависимости от поступающих запросов, эффективно предотвращая любые неожиданные скачки в потреблении памяти. Это означает, что даже во время интенсивных операций, таких как создание снимков, Dragonfly поддерживает стабильный след в памяти, обеспечивая последовательную производительность без риска внезапных скачков памяти. Более подробную информацию о алгоритме создания снимков Dragonfly можно найти в посте “Сбалансированный против Несбалансированного”.
Ключевая липкость
Dragonfly также представляет новую функцию с помощью своей собственной STICK
команды. Эта команда особенно полезна в экземплярах, работающих в режиме кэша. Она позволяет пометить определенные ключи как не подлежащие вытеснению, независимо от частоты их доступа.
Эта функциональность особенно удобна для хранения редко используемых, но важных данных. Например, вы можете надежно хранить вспомогательную информацию, такую как динамические конфигурационные значения, непосредственно на экземпляре Dragonfly. Это устраняет необходимость в отдельном хранилище данных для малоиспользуемых, но критически важных данных, упрощая процесс управления данными.
// Хранение значения в экземпляре Dragonfly с прилипанием.
Redis::transaction(function (Redis $redis) {
$redis->set('server-dynamic-configuration-key', '...');
$redis->command('STICK', 'server-dynamic-configuration-key');
});
// ...
// Всегда возвращает значение, так как ключ не может быть вытеснен.
$redis->get('server-dynamic-configuration-key');
Улучшенная пропускная способность в управлении очередями
Dragonfly, подобно Redis, хорошо справляется с управлением очередями и задачами. Как вы уже могли догадаться, переход на использование Dragonfly для этой цели происходит без изменений в коде. Рассмотрим следующий пример в Laravel, где диспетчируется задача по обработке подкаста:
use App\Jobs\ProcessPodcast;
$podcast = Podcast::create(/* ... */);
ProcessPodcast::dispatchSync($podcast);
И Dragonfly, и Redis способны легко обрабатывать десятки тысяч задач в секунду.
Для тех, кто стремится к максимальной производительности, важно отметить, что использование одной очереди задач не даст значительного прироста производительности. Чтобы действительно использовать возможности Dragonfly, следует использовать несколько очередей. Этот подход распределяет нагрузку между несколькими потоками Dragonfly, повышая общую пропускную способность.
Однако часто возникает проблема, когда ключи из одной очереди оказываются на разных потоках, что приводит к увеличению задержек. Чтобы противодействовать этому, Dragonfly предлагает использование хештегов в именах очередей. Эти хештеги обеспечивают, что задания в одной очереди (использующей один и тот же хештег) автоматически назначаются на определенные потоки, подобно тому, как это происходит в среде Redis Cluster, тем самым снижая задержку и оптимизируя производительность. Чтобы узнать больше о хештегах, ознакомьтесь с постом в блоге о запуске BullMQ с Dragonfly, в котором подробно объясняются хештеги и их преимущества, в то время как Dragonfly используется в качестве хранилища для систем очередей сообщений.
В качестве быстрого примера, чтобы оптимизировать управление очередями с помощью Dragonfly, начните с запуска Dragonfly с определенными флагами, которые включают блокировку на основе хештегов и эмулированный режим кластера:
./dragonfly --lock_on_hashtags --cluster_mode=emulated
После того, как Dragonfly запущен с этими настройками, введите хештеги в имена ваших очередей в Laravel. Вот пример:
ProcessPodcast::dispatch($podcast)->onQueue('{podcast_queue}');
Использование хештегов в именах очередей гарантирует, что все сообщения, принадлежащие к одной очереди, обрабатываются одним потоком в Dragonfly. Этот подход не только сохраняет связанные сообщения вместе, повышая эффективность, но и позволяет Dragonfly максимизировать пропускную способность, распределяя разные очереди по нескольким потокам.
Этот метод особенно эффективен для систем, которые используют Dragonfly в качестве хранилища очередей сообщений, поскольку он использует многопоточную архитектуру Dragonfly для более эффективного управления большим объемом сообщений.
Заключение
Способность Dragonfly обрабатывать огромные нагрузки с меньшим использованием памяти и его многопоточная архитектура делают его убедительным выбором для современных веб-приложений. На протяжении этой статьи мы рассмотрели, как Dragonfly плавно интегрируется с Laravel, требуя минимальных или вообще никаких изменений в коде, будь то для кэширования, управления сессиями или управления очередями.
Source:
https://dzone.com/articles/using-laravel-with-dragonfly