FastAPI হল একটি অত্যন্ত দ্রুত এবং কার্যকরী ওয়েব ফ্রেমওয়ার্ক যা asynchronous প্রোগ্রামিং সমর্থন করে। এর সাহায্যে আপনি একাধিক concurrent requests (একযোগে অনুরোধ) হ্যান্ডল করতে পারেন, যার ফলে পারফরম্যান্স উন্নত হয় এবং সার্ভারের প্রতি লোড কমে। এখানে আলোচনা করা হবে কিভাবে concurrent requests হ্যান্ডল করা যায় এবং FastAPI-তে performance optimization করা যায়।
Concurrent Requests in FastAPI
FastAPI তে concurrent requests হ্যান্ডল করতে asynchronous ফাংশন ব্যবহৃত হয়। সাধারণত, async এবং await কীওয়ার্ড ব্যবহার করে asynchronous programming করা হয়, যা একাধিক রিকোয়েস্ট একই সময়ে প্রসেস করতে সক্ষম হয়।
Asynchronous Programming
FastAPI তে, যদি আপনি কোন ফাংশনকে asynchronous হিসাবে ডিফাইন করেন, তা non-blocking ভাবে কাজ করবে, অর্থাৎ, একটি রিকোয়েস্ট সম্পন্ন না হওয়া পর্যন্ত অন্য রিকোয়েস্ট অপেক্ষা করবে না। এর ফলে, সার্ভার একাধিক রিকোয়েস্টকে параллেল ভাবে প্রসেস করতে সক্ষম হয়।
উদাহরণ: Concurrent Requests (Asynchronous Function)
from fastapi import FastAPI
import asyncio
app = FastAPI()
# একটি asynchronous function
async def fake_data_processing():
await asyncio.sleep(2) # 2 সেকেন্ড সময় নিবে
return "Data Processed"
@app.get("/process/")
async def process_data():
result = await fake_data_processing() # Fake Data Processing
return {"message": result}
এখানে, fake_data_processing() ফাংশনটি 2 সেকেন্ডের জন্য sleep করবে, তবে এটি non-blocking হিসেবে কাজ করবে, এবং অন্য রিকোয়েস্ট একই সময়ে প্রসেস করা সম্ভব হবে।
Concurrent Requests Example
এখন যদি আপনি এই এন্ডপয়েন্টটি একাধিকবার কল করেন, FastAPI একযোগে সমস্ত রিকোয়েস্ট হ্যান্ডল করবে এবং সেগুলি একে অপরের জন্য ব্লক হবে না।
- GET
/process/রিকোয়েস্টের জন্য প্রথম কল। - একই সময়ে GET
/process/রিকোয়েস্টের জন্য দ্বিতীয় কল।
এভাবে asynchronous ফাংশন ব্যবহার করে একাধিক রিকোয়েস্ট হ্যান্ডল করতে পারবেন এবং এটি সার্ভারের পারফরম্যান্স বাড়াবে।
Performance Optimization in FastAPI
FastAPI ডিফল্টভাবে অনেক উন্নত পারফরম্যান্স প্রদান করে, তবে কিছু কৌশল রয়েছে যেগুলির মাধ্যমে আরও পারফরম্যান্স উন্নত করা যেতে পারে।
1. Asynchronous I/O Operations
FastAPI তে asynchronous I/O অপারেশন ব্যবহার করলে আপনার অ্যাপ্লিকেশন দ্রুত এবং বেশি রিকোয়েস্ট হ্যান্ডল করতে সক্ষম হবে। I/O অপারেশন যেমন ডাটাবেস অ্যাক্সেস, ফাইল সিস্টেম অপারেশন এবং API কল সাধারণত সিঙ্ক্রোনাস হলেও, আপনি এগুলি asynchronousভাবে করার মাধ্যমে পারফরম্যান্স বৃদ্ধি করতে পারেন।
উদাহরণ: Asynchronous Database Query
from fastapi import FastAPI
import asyncio
app = FastAPI()
# asynchronous database query simulation
async def get_data_from_db():
await asyncio.sleep(1) # simulating async database query
return {"data": "Fake Data from DB"}
@app.get("/fetch_data/")
async def fetch_data():
data = await get_data_from_db() # Asynchronous DB Query
return data
এখানে asyncio.sleep(1) দিয়ে আমরা ফেক ডাটাবেস কুয়েরি সিমুলেট করছি, তবে মূল উদ্দেশ্য হল যে, এটি asynchronous ভাবে কাজ করছে, এবং অন্যান্য রিকোয়েস্ট একই সময়ে প্রসেস করা হচ্ছে।
2. Connection Pooling
ডাটাবেস সংযোগের ক্ষেত্রে, connection pooling ব্যবহার করলে ডাটাবেসের সাথে সংযোগ স্থাপন ও বিচ্ছিন্ন করার সময় কমিয়ে আনা যায়। Python-এ asyncpg, databases বা SQLAlchemy এর মতো লাইব্রেরি ব্যবহার করে আপনি কনকশন পুলিং কনফিগার করতে পারেন।
উদাহরণ: SQLAlchemy এবং Connection Pooling
from fastapi import FastAPI
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
DATABASE_URL = "sqlite+aiosqlite:///./test.db" # SQLite connection with async support
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False}, pool_size=20)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
app = FastAPI()
@app.get("/items/")
async def get_items():
db = SessionLocal()
# Querying the database asynchronously
db.close()
return {"message": "Fetched Items"}
এখানে SQLAlchemy লাইব্রেরি ব্যবহার করে কনকশন পুলিং করা হয়েছে, যার ফলে ডাটাবেস কুয়েরি করার সময় পারফরম্যান্স বাড়ানো সম্ভব।
3. Caching
FastAPI অ্যাপ্লিকেশনের পারফরম্যান্স বাড়ানোর জন্য caching ব্যবহার করা খুবই কার্যকরী। ডাটা পুনরায় ব্যবহার করার জন্য Redis বা Memcached এর মতো caching সিস্টেম ব্যবহার করতে পারেন।
উদাহরণ: Redis Caching
import redis
from fastapi import FastAPI
app = FastAPI()
# Redis connection setup
r = redis.Redis(host='localhost', port=6379, db=0)
@app.get("/cache/")
async def get_cache():
cache_data = r.get('cached_data') # Check cache for data
if cache_data:
return {"message": "Data from Cache", "data": cache_data.decode('utf-8')}
else:
# Simulating a DB fetch and caching it
r.set('cached_data', 'Fetched from DB')
return {"message": "Data from DB"}
Redis ব্যবহার করে আমরা ডাটার জন্য কাঁচে তৈরি করেছি, যাতে ডাটাবেস কুয়েরি পুনরায় না করতে হয় এবং পারফরম্যান্স উন্নত হয়।
4. Uvicorn Configuration for Production
প্রোডাকশন পরিবেশে FastAPI অ্যাপ্লিকেশন চালানোর সময় Uvicorn-এর কনফিগারেশন খুবই গুরুত্বপূর্ণ। workers সংখ্যা এবং --reload অপশনটি পরিচালনা করা উচিৎ যাতে অ্যাপ্লিকেশন দ্রুত কাজ করে।
উদাহরণ: Uvicorn কনফিগারেশন
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4
এখানে --workers ফ্ল্যাগের মাধ্যমে Uvicorn সার্ভারে একাধিক প্রসেস ব্যবহার করা হয়েছে, যা multithreading সুবিধা প্রদান করে এবং অধিক সংখ্যক রিকোয়েস্টকে একযোগে প্রসেস করতে সক্ষম হয়।
5. Compression (GZIP)
GZIP বা অন্যান্য কম্প্রেশন সিস্টেম ব্যবহার করে আপনি রেসপন্স সাইজ কমাতে পারেন, যা রেসপন্স টাইম কমায় এবং ব্যান্ডউইথ সাশ্রয় করে।
উদাহরণ: Compression (GZIP)
from fastapi import FastAPI
from fastapi.responses import JSONResponse
import json
app = FastAPI()
@app.get("/compressed/")
def get_compressed_data():
data = {"message": "This is a large response payload"}
return JSONResponse(content=json.dumps(data), headers={"Content-Encoding": "gzip"})
এখানে, Content-Encoding: gzip হেডারটি যোগ করা হয়েছে, যা রেসপন্স কম্প্রেস করবে এবং দ্রুত ডেলিভারি নিশ্চিত করবে।
FastAPI তে concurrent requests হ্যান্ডল করতে asynchronous programming এর মাধ্যমে একযোগে বহু রিকোয়েস্ট প্রসেস করা যায়। এর সাথে performance optimization এর জন্য বিভিন্ন কৌশল যেমন asynchronous I/O, connection pooling, caching, এবং GZIP compression ব্যবহার করা যেতে পারে। এই পদ্ধতিগুলির মাধ্যমে আপনি আপনার FastAPI অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি করতে পারেন, যাতে এটি অধিক স্কেলেবিলিটি এবং দ্রুত রেসপন্স প্রদান করে।
Read more