라라벨과 함께 사용하는 드래곤플라이

드래곤플라이는 훨씬 적은 서버로 훨씬 뛰어난 성능을 제공하도록 설계된 리디스 대체 솔루션입니다. 단일 노드가 초당 수백만 건의 쿼리를 처리하고 최대 1TB의 메모리 내 데이터를 저장할 수 있습니다. 이 글에서는 가장 널리 사용되고 잘 알려진 웹 프레임워크 중 하나인 라라벨과 함께 드래곤플라이를 사용하는 방법을 살펴보겠습니다.

드래곤플라이는 리디스 인터페이스와 완전한 호환성을 유지하므로 라라벨 개발자들은 캐시와 큐 드라이버로 단 한 줄의 코드 변경 없이 통합할 수 있습니다. 이러한 매끄러운 통합은 상당한 이점을 가진 쉬운 업그레이드 경로를 제공할 수 있습니다.

따라서 당신이 숙련된 라라벨 전문가이거나 처음 시작하는 것이든, 드래곤플라이와 라라벨의 세계로 함께 들어가 보세요.

시작하기

새 드래곤플라이 인스턴스를 설정하는 것부터 시작합시다. 문서를 방문하여 여기 이미지나 바이너리를 다운로드하고 곧바로 드래곤플라이 인스턴스를 실행할 수 있습니다. 드래곤플라이 인스턴스가 작동하고 접근 가능한 상태가 되면 라라벨 프로젝트와 통합하는 것은 매우 간단합니다. 다행히도 라라벨은 이미 리디스를 완전히 지원하므로 모든 드라이버를 재사용할 수 있습니다. 라라벨 애플리케이션에서 드래곤플라이를 사용하려면 .env 파일을 다음 설정으로 업데이트하세요.

캐싱 및 세션 관리를 위해:

CACHE_DRIVER=redis
SESSION_DRIVER=redis

큐 드라이버로 드래곤플라이를 통합하려면:

QUEUE_CONNECTION=redis

우리가 redis를 드라이버 값으로 사용하고 있지만, Dragonfly는 Redis를 직접적인 대체재로 설계되어 있으므로 추가적인 드라이버 설치가 필요하지 않습니다. 드라이버를 설정한 후, 다음 단계는 Laravel이 Dragonfly 인스턴스와 통신할 수 있도록 하는 것입니다. 이는 올바른 연결 세부 정보로 .env 파일을 다시 업데이트하는 것을 포함합니다:

  • REDIS_HOST: Dragonfly 서버의 호스트명 또는 IP 주소입니다.
  • 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

이러한 설정을 업데이트한 후, Laravel에서 INFO와 같은 간단한 작업을 실행하여 연결을 확인하십시오. 연결 문제가 발생하면 호스트, 포트 및 비밀번호 값을 다시 한 번 확인하십시오. 또한 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를 실행하기 위해 사용할 플래그들로, 12GB의 메모리 한도가 있습니다:

./dragonfly --cache_mode --maxmemory=12G

응용 프로그램이 광대역 데이터셋으로 많은 양의 요청을 처리해야 하는 시나리오를 고려해 보십시오. 이러한 경우 드래곤플라이 캐시 모드는 데이터에 빠른 액세스를 제공하면서 메모리 사용량을 효율적으로 관리하여 응용 프로그램이 응답성과 민첩성을 유지할 수 있습니다.

API 측면에서 Laravel Cache 파사드의 모든 기능이 지원되어야 합니다. 예를 들어, 특정 만료 시간으로 주어진 키와 값을 저장하려면 다음 스니펫을 사용할 수 있습니다.

use Illuminate\Support\Facades\Cache;

// 10분 만료 시간으로 값 저장.
Cache::put("key", "value", 600);

메모리 사용량

드래곤플라이를 캐시로 사용하는 이점 중 하나는 대부분의 사용 사례에 대해 측정 가능한 낮은 메모리 사용량입니다. 간단한 실험을 수행하여 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

실험을 수행한 결과 유사한 조건에서 Redis에 비해 Dragonfly의 메모리 사용량이 최대 20% 저하되었습니다. 이를 통해 동일한 메모리 요구 사항으로 훨씬 더 많은 유용한 데이터를 저장할 수 있으므로 캐시가 더 효율적이고 더 높은 범위를 달성할 수 있습니다. 드래곤플라이 처리량 벤치마크 및 메모리 사용에 대해 Redis vs. Dragonfly Scalability and Performance 블로그 게시물에서 자세히 알아볼 수 있습니다.

스냅샷

메모리 사용량을 낮춘 것 이상으로, Dragonfly는 스냅샷 프로세스 중에도 안정성을 보여줍니다. 특히 바쁜 인스턴스에서 스냅샷팅은 메모리 관리 측면에서 도전이 될 수 있습니다. Redis를 사용하면 매우 활발한 인스턴스에서 스냅샷을 캡처하는 것이 메모리 사용량을 증가시킬 수 있습니다. 이는 Redis가 메모리 페이지를 복사해야 하기 때문에 일부만 덮어쓴 페이지도 포함되어 메모리 사용량이 급증하게 됩니다.

반면에 Dragonfly는 들어오는 요청에 따라 스냅샷팅의 순서를 조정하여 메모리 사용량의 예기치 않은 급증을 효과적으로 방지합니다. 이는 스냅샷팅과 같은 집중적인 작업 중에도 Dragonfly가 안정적인 메모리 크기를 유지하고 갑작스런 메모리 급증 없이 일관된 성능을 보장한다는 것을 의미합니다. Dragonfly 스냅샷팅 알고리즘에 대해 자세히 알아보려면 Balanced vs. Unbalanced 블로그 게시물을 참조하십시오.

키 고정성

Dragonfly는 사용자 정의 STICK 명령어로 새로운 기능을 도입합니다. 이 명령어는 캐시 모드로 실행되는 인스턴스에 특히 유용합니다. 이 명령어를 사용하면 액세스 빈도에 관계없이 특정 키를 비휘발성으로 표시할 수 있습니다.

이 기능은 자주 접근하지 않지만 중요한 데이터를 저장하는 데 특힥 유용합니다. 예를 들어, 동적 구성 값과 같은 보조 정보를 신뢰할 수 있게 드래곤플라이 인스턴스에 직접 보관할 수 있습니다. 이렇게 하면 자주 사용되지 않지만 중요한 데이터를 위한 별도의 데이터 저장소가 필요 없어져 데이터 관리 프로세스를 간소화합니다.

// 드래곤플라이 인스턴스에 값을 저장하고 중복을 방지합니다.
Redis::transaction(function (Redis $redis) {
    $redis->set('server-dynamic-configuration-key', '...');
    $redis->command('STICK', 'server-dynamic-configuration-key');
});

// ...

// 키가 매핑되지 않아 항상 값을 반환합니다.
$redis->get('server-dynamic-configuration-key');

큐 관리의 처리량 개선

드래곤플라이는 레디스와 마찬가지로 큐와 작업 관리에 능숙합니다. 이미 짐작하셨을 것이지만, 이러한 목적으로 드래곤플라이를 사용하기 위한 전환은 코드 수정 없이 매끄럽습니다. 라라벨에서 팟캐스트 처리 작업이 송신되는 다음 예를 고려하십시오.

use App\Jobs\ProcessPodcast;

$podcast = Podcast::create(/* ... */);
ProcessPodcast::dispatchSync($podcast);

드래곤플라이와 레디스 모두 초당 수만 개의 작업을 처리할 수 있습니다.

성능을 극대화하려는 사람들에게 중요한 점은 단일 작업 큐를 사용하면 큰 성능 향상을 얻지 못한다는 것입니다. 드래곤플라이의 능력을 제대로 활용하려면 여러 큐를 사용해야 합니다. 이 방식은 여러 드래곤플라이 스레드에 부하를 분산하여 전반적인 처리량을 향상시킵니다.

그러나 동일한 큐에서 키가 서로 다른 스레드에 속하게 되면 지연 시간이 증가하는 일반적인 문제가 발생합니다. 이를 해결하기 위해 Dragonfly는 큐 이름에 해시태그를 사용할 수 있게 제공합니다. 이러한 해시태그는 동일한 해시태그를 사용하는 동일한 큐의 작업이 특정 스레드에 자동으로 할당되도록 보장하며, Redis Cluster 환경에서와 마찬가지로 지연 시간을 줄이고 성능을 최적화합니다. 해시태그에 대해 자세히 알아보려면 Dragonfly와 함께 BullMQ 실행하기 블로그 게시물을 확인하세요. 여기에는 해시태그와 그 이점에 대한 자세한 설명이 있고, 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