Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Redis

Tạo Bảng xếp hạng cạnh thời gian thực với Upstash Redis &Fly.io

Xây dựng Bảng xếp hạng tại Edge bằng Upstash Redis và Fly.io

Trong các ứng dụng web năng động và hấp dẫn, bảng xếp hạng là công cụ mạnh mẽ để thúc đẩy sự cạnh tranh và sự tham gia của người dùng. Trong hướng dẫn này, chúng ta sẽ bắt đầu hành trình xây dựng bảng xếp hạng theo thời gian thực bằng cách sử dụng Upstash Redis làm bộ lưu trữ phụ trợ và triển khai nó ở biên với Fly.io . Bộ đôi năng động này kết hợp tính hiệu quả của dịch vụ Redis không máy chủ với khả năng phân phối toàn cầu của Fly.io, đảm bảo quyền truy cập có độ trễ thấp cho người dùng trên toàn thế giới.

Giới thiệu về Upstash Redis

Upstash là dịch vụ đám mây cung cấp dịch vụ Redis được quản lý hoàn toàn, tập trung vào tính đơn giản, khả năng mở rộng và dễ sử dụng. Redis, được biết đến với tính linh hoạt và khả năng lưu trữ dữ liệu trong bộ nhớ hiệu suất cao, thậm chí còn trở nên hấp dẫn hơn khi kết hợp với Upstash. Với Upstash, các nhà phát triển có thể triển khai và mở rộng quy mô Redis một cách liền mạch cho nhiều trường hợp sử dụng khác nhau mà không gặp phải sự phức tạp trong vận hành liên quan đến quản lý cơ sở hạ tầng.

Các tính năng chính của Upstash Redis bao gồm:

  • Dễ triển khai: Upstash đơn giản hóa đáng kể quy trình triển khai, khiến nó trở thành lựa chọn tuyệt vời cho các nhà phát triển muốn giảm bớt sự phức tạp trong vận hành liên quan đến cơ sở hạ tầng.

  • Hiệu suất cao: Redis nổi tiếng với khả năng truy xuất dữ liệu nhanh như chớp, khiến nó phù hợp để xử lý hàng đợi tác vụ, truyền tin nhắn và bảng xếp hạng thời gian thực như chúng ta sẽ khám phá trong hướng dẫn này. Với Upstash, bạn có thể dựa vào cơ sở hạ tầng đám mây để mở rộng quy mô liền mạch, đảm bảo ứng dụng của bạn có thể xử lý các khối lượng công việc khác nhau một cách hiệu quả.

  • Khả năng mở rộng: Redis có khả năng mở rộng cao và với Upstash, nó có thể tự động mở rộng quy mô dựa trên nhu cầu. Điều này đảm bảo rằng ứng dụng của bạn luôn được trang bị để xử lý các mức tải khác nhau, khiến ứng dụng trở thành lựa chọn lý tưởng cho các ứng dụng linh hoạt và có thể mở rộng.

  • Tích hợp kho dữ liệu: Redis vừa đóng vai trò là nhà môi giới tin nhắn vừa là nơi lưu trữ kết quả, hợp lý hóa kiến trúc bằng cách giảm số lượng thành phần bạn cần quản lý.

Bằng cách kết hợp Upstash Redis vào ứng dụng bảng xếp hạng thời gian thực của mình, chúng tôi khai thác sức mạnh của dịch vụ Redis được quản lý hoàn toàn để bổ sung cho khả năng phân phối toàn cầu của Fly.io, tạo ra kiến trúc ứng dụng web mạnh mẽ và phản hồi nhanh. Hãy cùng đi sâu vào quá trình triển khai và giới thiệu cách Upstash Redis với Fly.io có thể nâng dự án của bạn lên tầm cao mới.

Điều kiện tiên quyết

Trước khi chúng ta bắt đầu hành trình, hãy đảm bảo bạn có những điều kiện tiên quyết sau:

  • Một Fly.io tài khoản.

  • Kiến thức cơ bản về Flask và Python.

Thiết lập tài khoản Fly.io &Cơ sở dữ liệu Redis

Bắt đầu bằng cách tạo tài khoản trong Fly.io rồi cài đặt Fly CLI:

 # Linux
 curl -L https://fly.io/install.sh | sh
 
 # Other type of installation: https://fly.io/docs/hands-on/install-flyctl/

Sau khi cài đặt, từ thiết bị đầu cuối của bạn, đăng nhập bằng Fly:

fly auth login

Thao tác này sẽ mở trình duyệt trong đó yêu cầu bạn cho phép đăng nhập bằng tài khoản bạn vừa tạo. Tuyệt vời, bây giờ bạn sẽ có thể tương tác với Fly từ thiết bị đầu cuối của mình.

Bây giờ chúng ta đã thiết lập xong Fly, hãy tạo một Redis cơ sở dữ liệu mà chúng tôi sẽ sử dụng để xây dựng bảng xếp hạng của mình:

Bây giờ chúng tôi có cơ sở dữ liệu Upstash Redis mà chúng tôi đã tạo thông qua Fly.io chỉ bằng một lệnh duy nhất. Bây giờ bạn có thể xem REDIS_URL từ đầu ra hoặc bằng lệnh trong thiết bị đầu cuối:

 flyctl redis status upstash-fly-leaderboard
 # Or open the upstash dashboard
 fly redis dashboard <your_org_name | personal>

Lấy private_url và lưu trữ khi chúng ta cần trong Flask_APP.

Phát triển ứng dụng Flask

Để tạo bảng xếp hạng, chúng tôi sẽ sử dụng Flask. Flask là một framework Python tối thiểu để xây dựng các ứng dụng web. Vì vậy, hãy bắt đầu bằng cách cài đặt các phần phụ thuộc.

 # 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

Bây giờ, hãy đặt nền móng cho ứng dụng Flask của chúng ta. Bắt đầu bằng cách tạo mô-đun app.py và viết mã tối thiểu để khởi chạy ứng dụng Flask và kết nối với 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)
 

Vì vậy chúng tôi:

  • Đã khởi chạy ứng dụng Flask

  • Đọc REDIS_URL từ biến môi trường

  • Đã khởi tạo redis_client để tương tác với Cơ sở dữ liệu Upstash Redis mà chúng tôi đã tạo trong Fly.io

Bây giờ, hãy xác định các chức năng để thêm người chơi vào bảng xếp hạng và truy xuất những người chơi có điểm tương ứng từ bảng xếp hạng:

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
 

Hàm add_score nhận được player_id và một điểm và thêm nó vào bảng xếp hạng. zadd là một lệnh trong Redis dùng để thêm một hoặc nhiều thành viên có điểm vào một tập hợp đã được sắp xếp.

Hàm thứ hai get_leaderboard() truy xuất 10 mục hàng đầu có điểm số từ bộ được sắp xếp Redis (bảng xếp hạng) và trả về chúng trong danh sách được định dạng chứa ID người chơi và điểm tương ứng của họ.

Được rồi, bây giờ hãy thêm ba điểm cuối để tương tác với cơ sở dữ liệu Upstash Redis của chúng tôi.

  • [GET] / — truy xuất bảng xếp hạng

  • POST /submit_score — Gửi điểm số lên bảng xếp hạng

  • GET /clear_table — Xóa bảng xếp hạng

@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'))

Như có thể thấy, chúng tôi cũng đang hiển thị một trang ngoại vi Leaderboard.html để làm cho trang này tương tác hơn và theo thời gian thực. Ở thư mục gốc của dự án, hãy tạo một thư mục templates và bên trong tạo một tệp Leaderboard.html với mã sau.

Hoàn hảo, bây giờ hãy kiểm tra điều này cục bộ trong thiết bị đầu cuối của bạn, hãy tải biến môi trường:

 # 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

Ứng dụng của bạn phải có sẵn bảng xếp hạng và cách để bạn thêm bản ghi vào bảng xếp hạng.

Tạo Bảng xếp hạng cạnh thời gian thực với Upstash Redis &Fly.io

Khi thêm kết quả, bạn có thể dễ dàng thấy rằng kết quả sẽ được lưu trữ cập nhật và sắp xếp theo thời gian thực, đó chính xác là những gì chúng tôi muốn làm! 🎉

Triển khai lên Fly.io

Bây giờ, hãy nâng ứng dụng Flask của chúng tôi lên tầm cao mới bằng cách triển khai ứng dụng này lên Fly.io. Từ thư mục gốc của cơ sở mã của bạn, hãy thực thi:

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

Điều này sẽ phát hiện cơ sở mã của bạn và áp dụng một số cấu hình mặc định dựa trên tên ứng dụng, mã, v.v. Tôi sẽ sử dụng cài đặt mặc định nên tôi sẽ tiếp tục với N .

Bây giờ điều này sẽ tạo ra một fly.toml và một Procfile :

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

Tôi để mọi thứ như mặc định, ngoại trừ vùng mà tôi đổi thành otp. Bây giờ hãy cập nhật Procfile , trong đó lệnh thực thi được xác định và làm cho nó chạy với gunicorn trong 8080 cổng.

web: gunicorn -b 0.0.0.0:8080 app:app

Nơi ứng dụng là tên mô-đun và ứng dụng khác là biến được xác định trong mô-đun nơi chúng tôi xác định ứng dụng Flask. Chúng ta gần như đã hoàn tất nhưng hãy nhớ trong mã chúng ta đã thêm REDIS_URL làm biến môi trường và chúng tôi đặt giá trị cục bộ cho Upstash Redis mà chúng tôi đã tạo bằng Fly CLI , hãy đặt điều này thành bí mật trong fly.io.

 fly secrets set --app upstash-fly-leaderboard REDIS_URL=<>

Tất cả chúng ta đã sẵn sàng, hãy triển khai ứng dụng lên fly.io bây giờ:

 fly deploy --ha=false

đầu ra sẽ cung cấp cho chúng tôi URL để truy cập ứng dụng mới được triển khai của chúng tôi.

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/

Kết luận

Trong hướng dẫn này, chúng ta đã chứng kiến sự tích hợp liền mạch của Upstash RedisFly.io để tạo bảng xếp hạng theo thời gian thực. Bằng cách kết hợp hiệu quả của dịch vụ Redis không máy chủ với khả năng phân phối toàn cầu của Fly.io, chúng tôi đã đảm bảo rằng người dùng trên toàn cầu có được trải nghiệm truy cập có độ trễ thấp.

Vui lòng cải thiện ứng dụng bảng xếp hạng của bạn hơn nữa bằng cách thêm xác thực người dùng, số liệu thống kê bổ sung hoặc bất kỳ tính năng nào khác phù hợp với nhu cầu ứng dụng của bạn. Tương lai của các ứng dụng web hấp dẫn và phản hồi nhanh là ở đây, được thúc đẩy bởi sức mạnh của Upstash Redis và phạm vi tiếp cận toàn cầu của Fly.io.

Bạn có thể tìm thấy mã nguồn đầy đủ của bài viết trên kho GitHub kèm theo hướng dẫn.

https://github.com/vjanz/upstash-fly-redis-leaderboard

Nếu bạn có bất kỳ câu hỏi nào, vui lòng liên hệ với tôi. Ngoài ra, bạn có thể kết nối với tôi trên LinkedIn, GitHub

Tài liệu tham khảo

Upstash
https://redis.io
https://fly.io/