Upstash Redis 및 Fly.io를 사용하여 Edge에서 리더보드 구축
역동적이고 매력적인 웹 애플리케이션에서 리더보드는 경쟁과 사용자 참여를 촉진하는 강력한 도구입니다. 이 튜토리얼에서는 Upstash Redis를 사용하여 실시간 리더보드를 구축하는 여정을 시작하겠습니다. 백엔드 스토리지로 사용하고 Fly.io를 사용하여 엣지에 배포합니다. . 이 다이나믹한 듀오는 서버리스 Redis 서비스의 효율성과 Fly.io의 글로벌 배포 기능을 결합하여 전 세계 사용자에게 짧은 지연 시간 액세스를 보장합니다.
Upstash Redis 정보
Upstash는 클라우드 서비스입니다 단순성, 확장성 및 사용 편의성에 중점을 둔 완전 관리형 Redis 서비스를 제공합니다. 다용성과 고성능 인메모리 데이터 저장소 기능으로 잘 알려진 Redis는 Upstash와 함께 사용하면 더욱 매력적입니다. Upstash를 사용하면 개발자는 인프라 관리와 관련된 운영상의 복잡성 없이 다양한 사용 사례에 맞게 Redis를 원활하게 배포하고 확장할 수 있습니다.
Upstash Redis의 주요 기능은 다음과 같습니다:
-
배포 용이성: Upstash는 배포 프로세스를 크게 단순화하므로 인프라와 관련된 운영 복잡성을 줄이려는 개발자에게 탁월한 선택입니다.
-
고성능: Redis는 매우 빠른 데이터 검색으로 유명하므로 이 튜토리얼에서 살펴보겠지만 작업 대기열, 메시지 전달 및 실시간 순위표를 처리하는 데 적합합니다. Upstash를 사용하면 클라우드 인프라를 활용하여 원활한 확장이 가능하므로 애플리케이션이 다양한 워크로드를 효율적으로 처리할 수 있습니다.
-
확장성: Redis는 확장성이 뛰어나며 Upstash를 사용하면 수요에 따라 자동으로 확장할 수 있습니다. 이를 통해 애플리케이션은 항상 다양한 수준의 로드를 처리할 수 있도록 준비되어 있어 동적이고 확장 가능한 애플리케이션에 이상적인 선택이 됩니다.
-
데이터 저장소 통합: Redis는 메시지 브로커와 결과 저장소 역할을 모두 수행하여 관리해야 하는 구성 요소 수를 줄여 아키텍처를 간소화합니다.
Upstash Redis를 실시간 순위표 애플리케이션에 통합함으로써 Fly.io의 글로벌 배포 기능을 보완하는 완전 관리형 Redis 서비스의 기능을 활용하여 강력하고 반응성이 뛰어난 웹 애플리케이션 아키텍처를 구현합니다. 구현에 대해 자세히 알아보고 Fly.io를 갖춘 Upstash Redis가 어떻게 프로젝트를 새로운 차원으로 끌어올릴 수 있는지 살펴보겠습니다.
전제조건
여정을 시작하기 전에 다음 전제 조건이 충족되었는지 확인하세요:
-
Fly.io 계정.
-
Flask 및 Python에 대한 기본 지식
Fly.io 계정 및 Redis 데이터베이스 설정
Fly.io에서 계정을 생성하여 시작하세요. 그런 다음 Fly CLI를 설치하세요:
# Linux
curl -L https://fly.io/install.sh | sh
# Other type of installation: https://fly.io/docs/hands-on/install-flyctl/ 설치 후 터미널에서 Fly로 로그인하세요:
fly auth login 방금 생성한 계정으로 로그인을 승인하라는 메시지가 표시되는 브라우저가 열립니다. 좋습니다. 이제 터미널에서 Fly와 상호 작용할 수 있습니다.
이제 Fly를 설정했으므로 Redis를 만들어 보겠습니다. 리더보드를 구축하는 데 사용할 데이터베이스:
이제 단일 명령으로 Fly.io를 통해 생성한 Upstash Redis 데이터베이스가 생겼습니다. 이제 출력이나 터미널의 명령을 사용하여 REDIS_URL을 볼 수 있습니다.
flyctl redis status upstash-fly-leaderboard
# Or open the upstash dashboard
fly redis dashboard <your_org_name | personal> private_url을 가져옵니다. Flask_APP에 필요하므로 저장하세요.
Flask 애플리케이션 개발
리더보드를 만들기 위해 Flask를 사용할 것입니다. Flask는 웹 애플리케이션 구축을 위한 최소한의 Python 프레임워크입니다. 그럼 종속성 설치부터 시작해 보겠습니다.
# flask - for as a web application framework
# redis - A wrapper to connect and interact with Redis
# gunicorn - wsgi server for running Python web applications
$ pip install flask redis gunicorn
# export the dependencies to requirements.txt
$ pip freeze > requirements.txt 이제 Flask 앱의 기반을 마련해 보겠습니다. 먼저 app.py 모듈을 만들고 Flask 애플리케이션을 시작하고 Upstash Redis에 연결하기 위한 최소 코드를 작성해 보겠습니다.
import os
from flask import Flask, render_template, request, redirect, url_for
import redis
app = Flask(__name__)
# Read the connection string from the environment variable
UPSTASH_FLY_REDIS_CONNECTION_STRING = os.getenv('REDIS_URL')
LEADERBOARD_KEY = 'leaderboard'
# Initiate a connection to Upstash Redis Instance using the connection string
redis_client = redis.from_url(UPSTASH_FLY_REDIS_CONNECTION_STRING)
그래서 우리는:
-
Flask 앱 시작
-
환경 변수에서 REDIS_URL 읽기
-
Fly.io에서 생성한 Upstash Redis 데이터베이스와 상호작용하기 위해 redis_client를 초기화했습니다.
이제 리더보드에 플레이어를 추가하고 리더보드에서 해당 점수를 가진 플레이어를 검색하는 함수를 정의해 보겠습니다.
def add_score(player_id, score):
# Add or update the score for the player in the leaderboard
redis_client.zadd(LEADERBOARD_KEY, {player_id: score})
def get_leaderboard():
leaderboard = redis_client.zrevrange(LEADERBOARD_KEY, 0, 9, withscores=True)
formatted_leaderboard = [{'player_id': player_id.decode('utf-8'), 'score': int(score)} for player_id, score in
leaderboard]
return formatted_leaderboard
add_score 함수 player_id를 얻습니다. 및 점수 리더보드에 추가합니다. 자드 점수가 있는 하나 이상의 구성원을 정렬된 세트에 추가하는 데 사용되는 Redis의 명령입니다.
두 번째 함수 get_leaderboard() Redis 정렬 세트(리더보드)에서 점수가 포함된 상위 10개 항목을 검색하고 플레이어 ID와 해당 점수가 포함된 형식화된 목록으로 반환합니다.
자, 이제 Upstash Redis 데이터베이스와 상호 작용할 세 개의 엔드포인트를 추가해 보겠습니다.
-
[GET] / — 리더보드 검색
-
POST /submit_score — 리더보드에 점수 제출
-
GET /clear_table — 리더보드를 정리합니다
@app.route('/')
def leaderboard():
# Retrieve the top 10 players from the leaderboard and redirect to the leaderboard page with the data
leaderboard = get_leaderboard()
return render_template('leaderboard.html', leaderboard=leaderboard)
@app.route('/submit_score', methods=['POST'])
def submit_score():
player_id = request.form['player_id']
score = int(request.form['score'])
# Call the function to add or update the score for the player in the leaderboard
add_score(player_id, score)
return redirect(url_for('leaderboard'))
@app.route('/clear_table', methods=['GET'])
def clear_table():
# Delete all the data from the leaderboard
redis_client.delete(LEADERBOARD_KEY)
return redirect(url_for('leaderboard')) 보시다시피 프런트엔드 페이지인 Leaderboard.html을 렌더링하여 실시간으로 더욱 대화형으로 만들고 있습니다. 프로젝트 루트에서 템플릿 폴더를 만들고 내부에 다음 코드를 사용하여 Leaderboard.html 파일을 만듭니다.
완벽합니다. 이제 터미널에서 로컬로 테스트하려면 환경 변수를 로드하세요.
# Linux
export REDIS_URL='YOUR_UPSTASH_FLY_REDIS_CONNECTION_STRING'
# Windows
set REDIS_URL='YOUR_UPSTASH_FLY_REDIS_CONNECTION_STRING'
# After that run:
$ flask run 애플리케이션에는 리더보드와 리더보드에 기록을 추가할 수 있는 방법이 준비되어 있어야 합니다.
결과를 추가하면 결과가 업데이트되어 저장되고 실시간으로 정렬되는 것을 쉽게 확인할 수 있습니다. 이것이 바로 우리가 원했던 것입니다! 🎉
Fly.io에 배포
이제 Fly.io에 배포하여 Flask 앱을 새로운 차원으로 끌어올리겠습니다. 코드베이스의 루트에서 다음을 실행하세요:
flyctl launch
Scanning source code
Detected a Python app
Using the following build configuration:
Builder: paketobuildpacks/builder:base
Creating app in /home/valon/code/upstash-fly-leaderboard
We're about to launch your Python app on Fly.io. Here's what you're getting:
Organization: <MyOrg> (fly launch defaults to the personal org)
Name: upstash-leaderboard (derived from your directory name)
Region: Amsterdam, Netherlands (this is the fastest region for you)
App Machines: shared-cpu-1x, 1GB RAM (most apps need about 1GB of RAM)
Postgres: <none> (not requested)
Redis: <none> (not requested)
? Do you want to tweak these settings before proceeding? (y/N) : N 그러면 코드베이스가 감지되고 애플리케이션 이름, 코드 등에 따라 일부 기본 구성이 적용됩니다. 기본 설정을 사용하므로 N을 계속 진행하겠습니다. .
이제 fly.toml이 생성됩니다. 및 프로파일 :
app = "upstash-fly-leaderboard"
primary_region = "otp" #
[build]
builder = "paketobuildpacks/builder:base"
[env]
PORT = "8080"
[http_service]
internal_port = 8080 # Port where the app runs
force_https = true
auto_stop_machines = true
auto_start_machines = true
min_machines_running = 0
processes = ["app"]
[[vm]]
cpu_kind = "shared"
cpus = 1
memory_mb = 1024 otp로 변경한 지역을 제외하고는 모든 것을 기본값으로 두었습니다. 이제 Procfile을 업데이트해 보겠습니다. , 실행 명령이 정의되어 있고 gunicorn을 사용하여 실행되도록 합니다. 8080에서 포트.
web: gunicorn -b 0.0.0.0:8080 app:app 앱 모듈 이름이고 다른 앱 는 Flask 앱을 정의한 모듈에 정의된 변수입니다. 거의 완료되었지만 코드에 REDIS_URL을 추가한 것을 기억하세요. 환경 변수로 사용하고 Fly CLI를 사용하여 생성한 Upstash Redis에 로컬로 값을 설정합니다. , 이를 fly.io에서 비밀로 설정해 보겠습니다.
fly secrets set --app upstash-fly-leaderboard REDIS_URL=<> 모두 준비되었습니다. fly.io에 앱을 배포해 보겠습니다. 지금:
fly deploy --ha=false 출력에는 새로 배포된 애플리케이션을 방문할 수 있는 URL이 제공되어야 합니다.
Watch your deployment at https://fly.io/apps/<app_name>/monitoring
-------
Updating existing machines in '<app_name>' with rolling strategy
-------
✔ Machine <machine_id> [app] update succeeded
-------
Visit your newly deployed app at https://<app_name>.fly.dev/ 결론
이 튜토리얼에서는 Upstash Redis의 원활한 통합을 확인했습니다. 및 Fly.io 실시간 리더보드를 생성합니다. 서버리스 Redis 서비스의 효율성과 Fly.io의 글로벌 배포 기능을 결합하여 전 세계 사용자가 지연 시간이 짧은 액세스를 경험할 수 있도록 했습니다.
사용자 인증, 추가 통계 또는 애플리케이션 요구 사항에 맞는 기타 기능을 추가하여 리더보드 애플리케이션을 더욱 강화하세요. Upstash Redis의 강력한 기능과 Fly.io의 전 세계적인 도달 범위를 통해 매력적이고 반응성이 뛰어난 웹 애플리케이션의 미래가 여기에 있습니다.
GitHub 저장소에서 지침과 함께 기사의 전체 소스 코드를 찾을 수 있습니다.
https://github.com/vjanz/upstash-fly-redis-leaderboard
궁금한 점이 있으면 언제든지 문의해 주세요. 또한 LinkedIn, GitHub에서 저와 소통하실 수 있습니다
참고자료
업스태시
https://redis.io
https://fly.io/