สร้างกระดานผู้นำที่ Edge โดยใช้ Upstash Redis และ Fly.io
ในเว็บแอปพลิเคชันแบบไดนามิกและมีส่วนร่วม ลีดเดอร์บอร์ดเป็นเครื่องมือที่มีประสิทธิภาพในการส่งเสริมการแข่งขันและการมีส่วนร่วมของผู้ใช้ ในบทช่วยสอนนี้ เราจะเริ่มต้นการเดินทางเพื่อสร้างกระดานผู้นำแบบเรียลไทม์โดยใช้ Upstash Redis เป็นที่เก็บข้อมูลแบ็กเอนด์และปรับใช้ที่ Edge ด้วย Fly.io . คู่หูแบบไดนามิกนี้ผสมผสานประสิทธิภาพของบริการ Redis แบบไร้เซิร์ฟเวอร์เข้ากับความสามารถในการจัดจำหน่ายทั่วโลกของ Fly.io เพื่อให้มั่นใจว่าผู้ใช้ทั่วโลกจะสามารถเข้าถึงข้อมูลที่มีความหน่วงต่ำ
เกี่ยวกับ Upstash Redis
Upstash เป็นบริการคลาวด์ ที่ให้บริการ Redis ที่มีการจัดการเต็มรูปแบบโดยเน้นไปที่ความเรียบง่าย ความสามารถในการปรับขนาด และความสะดวกในการใช้งาน Redis ซึ่งเป็นที่รู้จักในด้านความสามารถรอบด้านและความสามารถในการจัดเก็บข้อมูลในหน่วยความจำประสิทธิภาพสูง จะยิ่งน่าสนใจยิ่งขึ้นเมื่อจับคู่กับ Upstash ด้วย Upstash นักพัฒนาสามารถติดตั้งใช้งานและปรับขนาด Redis ได้อย่างราบรื่นสำหรับกรณีการใช้งานต่างๆ โดยไม่มีความซับซ้อนในการดำเนินงานที่เกี่ยวข้องกับการจัดการโครงสร้างพื้นฐาน
คุณสมบัติที่สำคัญของ Upstash Redis ได้แก่:
-
ความง่ายในการใช้งาน: Upstash ช่วยให้กระบวนการปรับใช้ง่ายขึ้นอย่างมาก ทำให้เป็นตัวเลือกที่ยอดเยี่ยมสำหรับนักพัฒนาที่ต้องการลดความซับซ้อนในการดำเนินงานที่เกี่ยวข้องกับโครงสร้างพื้นฐาน
-
ประสิทธิภาพสูง: Redis ขึ้นชื่อในเรื่องการดึงข้อมูลที่รวดเร็วปานสายฟ้า ทำให้เหมาะสำหรับการจัดการคิวงาน การส่งข้อความ และลีดเดอร์บอร์ดแบบเรียลไทม์ตามที่เราจะสำรวจในบทช่วยสอนนี้ ด้วย Upstash คุณสามารถไว้วางใจโครงสร้างพื้นฐานระบบคลาวด์เพื่อการปรับขนาดที่ราบรื่น ทำให้มั่นใจได้ว่าแอปพลิเคชันของคุณจะสามารถจัดการปริมาณงานที่แตกต่างกันได้อย่างมีประสิทธิภาพ
-
ความสามารถในการขยายขนาด: Redis สามารถปรับขนาดได้สูงและด้วย Upstash ทำให้สามารถปรับขนาดได้โดยอัตโนมัติตามความต้องการ สิ่งนี้ทำให้มั่นใจได้ว่าแอปพลิเคชันของคุณพร้อมเสมอเพื่อรองรับโหลดในระดับต่างๆ ทำให้เป็นตัวเลือกที่เหมาะสำหรับแอปพลิเคชันแบบไดนามิกและปรับขนาดได้
-
บูรณาการที่เก็บข้อมูล: Redis ทำหน้าที่เป็นทั้งนายหน้าข้อความและที่เก็บผลลัพธ์ ปรับปรุงสถาปัตยกรรมให้มีประสิทธิภาพโดยการลดจำนวนองค์ประกอบที่คุณต้องจัดการ
ด้วยการรวม Upstash Redis เข้ากับแอปพลิเคชันกระดานผู้นำแบบเรียลไทม์ของเรา เราได้ควบคุมพลังของบริการ Redis ที่มีการจัดการอย่างเต็มรูปแบบ ซึ่งเสริมความสามารถในการจัดจำหน่ายทั่วโลกของ Fly.io ส่งผลให้เกิดสถาปัตยกรรมแอปพลิเคชันเว็บที่แข็งแกร่งและตอบสนองได้ดี มาเจาะลึกถึงการใช้งานและแสดงให้เห็นว่า Upstash Redis กับ Fly.io สามารถยกระดับโครงการของคุณไปสู่อีกระดับได้อย่างไร
ข้อกำหนดเบื้องต้น
ก่อนที่เราจะเริ่มการเดินทาง ตรวจสอบให้แน่ใจว่าคุณมีข้อกำหนดเบื้องต้นดังต่อไปนี้:
-
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 กันดีกว่า ฐานข้อมูลที่เราจะใช้เพื่อสร้างกระดานผู้นำของเรา:
ตอนนี้เรามีฐานข้อมูล Upstash Redis ที่เราสร้างผ่าน Fly.io ด้วยคำสั่งเดียว ตอนนี้คุณสามารถดู 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 จากตัวแปรสภาพแวดล้อม
-
เริ่มต้น redis_client เพื่อโต้ตอบกับฐานข้อมูล Upstash Redis ที่เราสร้างใน Fly.io
ตอนนี้เรามากำหนดฟังก์ชันเพื่อเพิ่มผู้เล่นลงในกระดานผู้นำและดึงข้อมูลผู้เล่นด้วยคะแนนตามลำดับจากกระดานผู้นำ:
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() ดึงข้อมูล 10 อันดับแรกที่มีคะแนนจากชุดที่จัดเรียง Redis (ลีดเดอร์บอร์ด) และส่งคืนในรายการที่จัดรูปแบบซึ่งมี 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')) ดังที่เราเห็น เรายังแสดงผล front-end page 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
ตอนนี้มายกระดับแอป Flask ของเราไปอีกขั้นด้วยการปรับใช้กับ Fly.io จากรากของโค้ดเบสของคุณ ให้ดำเนินการ:
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 และ 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 ฉันปล่อยให้ทุกอย่างเป็นค่าเริ่มต้น ยกเว้นภูมิภาคที่ฉันเปลี่ยนเป็น otp ตอนนี้มาอัปเดต Procfile กันดีกว่า โดยที่คำสั่งการดำเนินการถูกกำหนดไว้ และให้รันด้วย gunicorn ใน 8080 พอร์ต
web: gunicorn -b 0.0.0.0:8080 app:app แอป อยู่ที่ไหน คือชื่อโมดูลและแอปอื่นๆ เป็นตัวแปรที่กำหนดไว้ในโมดูลที่เรากำหนดแอป Flask ส่วนใหญ่เราทำเสร็จแล้ว แต่จำไว้ว่าในโค้ดที่เราเพิ่ม REDIS_URL เป็นตัวแปรสภาพแวดล้อม และเราตั้งค่าในเครื่องเป็น Upstash Redis ที่เราสร้างขึ้นโดยใช้ Fly CLI มาตั้งค่านี้เป็นความลับใน 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/