Computer >> 컴퓨터 >  >> 프로그래밍 >> Redis

RediSearch 실전 활용 가이드: Azure Cache for Redis로 실시간 트윗 검색·분석 앱 만들기

Redis는 단순한 String부터 강력한 추상화 기능을 제공하는 Redis Streams에 이르기까지 다양한 데이터 구조를 갖추고 있습니다. 네이티브 데이터 타입만으로도 많은 작업을 처리할 수 있지만, 일부 사용 사례에서는 추가적인 우회 방법이 필요할 수 있습니다. 대표적인 예가 바로 보조 인덱스(Secondary Index)입니다. 키 기반의 단순 조회를 넘어 더 풍부한 쿼리 기능을 구현하려면 보조 인덱스가 필요합니다. Sorted Set이나 List 등으로 이를 구현할 수도 있지만, 그만큼의 트레이드오프를 감수해야 합니다.

바로 여기서 RediSearch가 등장합니다. Redis 모듈 형태로 제공되는 RediSearch는 최상급 보조 인덱싱 엔진을 통해 유연한 검색 기능을 제공합니다. 전문(Full-text) 검색, 자동 완성, 지리적 인덱싱 등 강력한 기능들을 갖추고 있죠.

이 글에서는 RediSearch Go 클라이언트로 빌드한 Go 서비스와 함께 Azure Cache for Redis에서 RediSearch를 활용하는 실전 예제를 소개합니다. 실시간으로 트윗을 수집하고, RediSearch를 통해 유연하게 쿼리할 수 있는 애플리케이션 세트를 직접 구성해 볼 것입니다.

구체적으로 다음 내용을 배우게 됩니다.

  • RediSearch 인덱스 다루는 방법
  • TEXT, NUMERIC, TAG 등 다양한 RediSearch 데이터 타입 활용법
  • RediSearch의 기능을 보여주는 애플리케이션 구축 방법
  • 몇 개의 명령어만으로 서비스 컴포넌트를 Azure에 배포하는 방법
  • RediSearch 쿼리를 통한 트윗 데이터 분석

애플리케이션 개요

앞서 언급했듯이, 예제 서비스는 실시간으로 트윗을 수집하고 RediSearch를 통해 쿼리할 수 있게 해줍니다.

RediSearch 실전 활용 가이드: Azure Cache for Redis로 실시간 트윗 검색·분석 앱 만들기

이 서비스는 두 가지 컴포넌트로 구성됩니다.

  1. Consumer/Indexer: Twitter Streaming API에서 데이터를 읽어 인덱스를 생성하고, 트윗이 도착할 때마다 해당 데이터(Redis HASH 형태)를 지속적으로 추가합니다.
  2. 검색 서비스: RediSearch 쿼리 문법을 사용해 트윗을 검색할 수 있는 REST API입니다.

지금부터 솔루션을 실제로 구동하는 방법을 살펴보겠습니다. 각 컴포넌트의 동작 원리가 궁금하다면 아래의 코드 살펴보기 섹션과 GitHub 저장소(redisearch-tweet-analysis)를 참고하세요.

사전 준비 사항

  1. 먼저 Microsoft Azure 계정이 필요합니다. 여기서 무료로 생성할 수 있습니다.
  2. 위에서 언급한 서비스 컴포넌트들은 Docker와 Azure의 통합 기능을 통해 네이티브 Docker CLI 명령어로 Azure Container Instances에 배포됩니다.
  3. Windows나 macOS라면 Docker Desktop 2.3.0.5 이상 버전이, Linux라면 Docker ACI Integration CLI가 필요합니다. Twitter Streaming API를 사용하려면 Twitter 개발자 계정도 준비해야 합니다. 계정이 없다면 관련 안내 문서를 참고해 생성하세요.

RediSearch 실습 시작하기

먼저 퀵 스타트 튜토리얼을 참고해 Azure에 Redis Enterprise 계층 캐시를 설정합니다. 설정이 완료되면 Redis 호스트 이름과 액세스 키를 미리 확인해 두세요.

RediSearch 실전 활용 가이드: Azure Cache for Redis로 실시간 트윗 검색·분석 앱 만들기

서비스의 두 컴포넌트(트윗 인덱싱 서비스와 검색 API 서비스)는 모두 Docker 컨테이너로 제공됩니다. 직접 Docker 이미지를 빌드하고 싶다면 GitHub 저장소에 포함된 각각의 Dockerfile을 사용하면 됩니다.

이제 이 컨테이너들을 Azure Container Instances에 배포하는 과정을 살펴보겠습니다. Azure Container Instances를 사용하면 관리형 서버리스 환경에서 온디맨드 방식으로 Docker 컨테이너를 실행할 수 있습니다.

Azure에 배포하기

docker-compose.yml 파일에는 개별 컴포넌트(tweets-searchtweets-indexer)가 정의되어 있습니다. 파일에서 Azure Redis 인스턴스 정보와 Twitter 개발자 계정 자격 증명 값을 자신의 값으로 교체하기만 하면 됩니다.

Azure 컨텍스트를 생성합니다.

GitHub 저장소를 클론합니다.

두 서비스 컴포넌트를 하나의 컨테이너 그룹으로 배포합니다.

(참고: ACI 컨텍스트에서 사용 가능한 Docker Compose 명령은 docker compose로 시작합니다. 하이픈이 있는 docker-compose와는 다르니 주의하세요.)

아래와 비슷한 출력 결과를 확인할 수 있습니다.

서비스가 시작될 때까지 기다립니다. Azure Portal에서도 상태를 확인할 수 있습니다. 두 서비스가 모두 정상적으로 구동되면 각각의 로그를 확인해 보세요.

문제없이 진행되었다면 트윗 컨슈머 서비스가 이미 동작을 시작했을 것입니다. 이 서비스는 트윗 스트림을 읽어 Redis에 저장합니다.

결과 확인하기!

이제 트윗 데이터를 쿼리할 차례입니다. Azure Container Instances의 REST API는 IP 주소와 FQDN(정규화된 도메인 이름)을 통해 접근할 수 있습니다(자세한 내용은 Container Access 문서 참고). IP 주소를 찾으려면 docker ps 명령을 실행하고 출력 결과의 PORTS 섹션을 확인하면 됩니다.

이제 다양한 쿼리를 실행해 볼 수 있습니다. 시작하기 전에 검색 쿼리에서 사용할 수 있는 인덱싱된 속성들을 간단히 살펴보겠습니다.

(아래 예제에서는 curl을 사용하지만, VS Code의 "REST Client" 확장을 사용하는 것을 강력히 추천합니다.)

검색 서비스 API의 베이스 URL을 설정합니다.

간단하게 모든 문서를 조회해 봅니다(* 사용).

아래와 비슷한 출력 결과를 볼 수 있습니다.

Page-SizeSearch-Hits 헤더에 주목하세요. 이것들은 애플리케이션이 전달하는 커스텀 헤더로, 페이지네이션과 결과 제한 기능을 시연하기 위한 것입니다. "모든 문서 가져오기" 쿼리에 대한 응답으로 Redis에서 12개의 결과를 찾았지만, JSON 본문에는 10개 항목만 반환되었습니다. 이는 RediSearch Go API의 기본 동작 때문이며, 다음과 같은 쿼리 파라미터로 변경할 수 있습니다.

예를 들어 iPhone에서 전송된 트윗만 검색할 수도 있습니다.

쿼리 결과에서 모든 속성이 필요하지 않은 경우도 있습니다. 예를 들어 사용자(Twitter 화면 이름)와 트윗 본문만 가져오려면 다음과 같이 요청합니다.

사용자 이름 기준 쿼리는 어떨까요? (예: jo로 시작하는 이름)

여러 속성을 조합한 쿼리도 가능합니다.

특정 해시태그가 포함된 트윗을 찾고 싶다면 어떻게 할까요? 여러 해시태그(|로 구분)를 조합해서 검색할 수도 있습니다.

biden 해시태그가 달린 트윗이 최근 얼마나 생성되었는지 알고 싶다면? 범위(range) 쿼리를 사용하면 됩니다.

운 좋게 트윗에 좌표 정보가 포함되어 있다면, 이를 추출한 후 coordinates 속성으로 쿼리해 볼 수 있습니다.

이 외에도 다양한 실험이 가능합니다. RediSearch 문서의 관련 섹션이 큰 도움이 될 것입니다.

중요: 실습을 마친 후에는 Azure Container Instances에서 서비스와 컨테이너를 반드시 중지하세요.

Azure Portal에서 생성했던 Azure Redis 인스턴스도 삭제하는 것을 잊지 마세요.

코드 살펴보기

이 섹션에서는 각 컴포넌트의 코드를 개략적으로 살펴봅니다. GitHub 저장소의 소스 코드를 탐색하는 데 도움이 될 것입니다.

트윗 Consumer/Indexer

Twitter 연동에는 go-twitter 라이브러리가 사용되었습니다.

Twitter Streaming API에 인증하는 부분입니다.

별도의 고루틴(goroutine)에서 트윗 스트림을 수신 대기합니다.

index.AddData(tweetToMap(tweet)) 부분에 주목하세요. 여기서 인덱싱 컴포넌트가 호출됩니다. 이 컴포넌트는 Azure Cache for Redis에 연결합니다.

그런 다음 인덱스를 삭제(기존 문서 포함)한 후 다시 생성합니다.

인덱스와 관련 문서를 삭제하는 이유는 깨끗한 상태에서 시작할 수 있게 하여 실험과 데모를 용이하게 하기 위함입니다. 필요하다면 이 부분을 주석 처리해도 됩니다.

각 트윗의 정보는 HSET 연산을 통해 HASH(이름: tweet:<tweet ID>)에 저장됩니다.

트윗 검색 서비스

검색 서비스는 RediSearch를 쿼리할 수 있는 REST API를 노출합니다. 모든 옵션(쿼리 등)은 쿼리 파라미터 형태로 전달됩니다. 예를 들어 https://localhost:8080/search?q=@source:iphone과 같습니다. 필요한 쿼리 파라미터를 추출하는 코드는 다음과 같습니다.

q 파라미터는 필수입니다. 그 외에도 다음 파라미터를 사용할 수 있습니다.

  • fields: 결과에 반환할 속성을 지정합니다.
  • offset_limit: 검색 시작 위치(offset)와 결과에 포함할 문서 수(limit)를 지정합니다. 기본값은 offset 0, limit 10입니다(RediSearch Go 클라이언트 기준).

예를 들면 다음과 같습니다.

마지막으로 결과를 순회하며 JSON(문서 배열) 형태로 반환합니다.

이것으로 코드 살펴보기를 마치겠습니다!

Azure Cache for Redis의 Redis Enterprise 계층

Redis Enterprise는 Azure에서 네이티브 서비스로 제공되며, Microsoft와 Redis가 공동 운영 및 지원하는 Azure Cache for Redis의 두 가지 새로운 계층(Enterprise, Enterprise Flash)으로 출시되었습니다. 이 서비스를 통해 개발자는 RediSearch 같은 모듈을 포함한 풍부한 Redis Enterprise 기능을 활용할 수 있습니다. 자세한 내용은 다음 리소스를 참고하세요.

  • Azure Cache for Redis Enterprise 계층 정식 출시(GA) 발표
  • 클라우드에서 Redis Enterprise 성장을 위한 Microsoft와의 파트너십 확대
  • Microsoft와 Redis의 협력으로 개발자에게 새로운 Azure Cache for Redis 기능 제공
  • Azure Cache for Redis의 Redis Enterprise 기능

결론

이 엔드투엔드 애플리케이션은 인덱스를 다루는 방법, 실시간 데이터를 수집해 RediSearch 엔진으로 인덱싱되는 문서(트윗 정보)를 생성하는 방법, 그리고 다재다능한 쿼리 문법으로 트윗에서 인사이트를 추출하는 방법을 보여줍니다.

Redis 문서 사이트에서 특정 주제를 검색할 때 내부적으로 어떤 일이 일어나는지 궁금하신가요? Redis 공식 사이트가 RediSearch로 전문 검색을 구현한 방법을 다룬 블로그 포스트를 확인해 보세요. 또는 서버리스 애플리케이션에서 RediSearch를 활용하는 방법에 관심이 있을 수도 있습니다.

아직 입문 단계라면 RediSearch Quick Start 페이지를 방문해 보세요.

Azure Cache for Redis의 엔터프라이즈 기능에 대해 더 알고 싶다면 다음 리소스를 확인하세요.

  • 다중 영역(Multi Zone) 중복 구성 및 설정 방법
  • 네트워크 격리를 위한 Private Link 지원
  • 적합한 캐싱 계층 선택 가이드
  • Enterprise 계층의 고가용성(HA)