FastAPI একটি আধুনিক ওয়েব ফ্রেমওয়ার্ক, যা Asynchronous Programming এবং Performance Optimization এ অনেক সুবিধা প্রদান করে। FastAPI এর মাধ্যমে আপনি উচ্চ পারফরম্যান্সের অ্যাপ্লিকেশন তৈরি করতে পারেন, যেখানে অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং-এর সাহায্যে বেশি স্কেলেবিলিটি এবং দ্রুত রেসপন্স পাওয়া যায়।
এই গাইডে, আমরা Asynchronous Programming এবং Performance Optimization এর কিছু গুরুত্বপূর্ণ দিক নিয়ে আলোচনা করব এবং FastAPI এর মাধ্যমে কিভাবে এগুলো কার্যকরভাবে ব্যবহার করা যায় তা দেখব।
১. Asynchronous Programming: FastAPI-তে কীভাবে কাজ করে
FastAPI Asynchronous Programming সমর্থন করে, যার ফলে একাধিক I/O অপারেশন (যেমন ডাটাবেস কল, ফাইল সিস্টেম অপারেশন) একই সময়ে রান করতে পারে। এটি সার্ভারের স্কেলেবিলিটি এবং পারফরম্যান্স বাড়াতে সহায়ক।
Asynchronous Function
FastAPI তে অ্যাসিঙ্ক্রোনাস ফাংশন তৈরি করতে async এবং await কিওয়ার্ড ব্যবহার করা হয়। এটি ডাটা প্রসেস করার সময় নেটওয়ার্ক বা ডাটাবেস কল করার জন্য থ্রেড ব্লক না করে অন্য কাজ করতে সাহায্য করে।
from fastapi import FastAPI
import asyncio
app = FastAPI()
@app.get("/")
async def read_root():
await asyncio.sleep(2) # Simulating I/O operation (e.g. DB or API call)
return {"message": "Hello, FastAPI!"}
এখানে, async def ব্যবহার করে asynchronous function তৈরি করা হয়েছে। await ব্যবহার করে I/O অপারেশনগুলো নিষ্ক্রিয় রাখা হচ্ছে, যাতে সার্ভার অন্যান্য রিকোয়েস্টগুলো প্রসেস করতে পারে।
Asynchronous I/O Operation
যখন অ্যাসিঙ্ক্রোনাস ফাংশন ব্যবহার করা হয়, তখন I/O অপারেশন (যেমন ডাটাবেস, HTTP কল) অপেক্ষা করার সময় CPU ফ্রি থাকে এবং অন্য রিকোয়েস্ট প্রসেস করা যায়। এটি হাইপারফরম্যান্স ওয়েব অ্যাপ্লিকেশন তৈরির জন্য খুবই কার্যকরী।
২. Performance Optimization Techniques in FastAPI
FastAPI ব্যবহার করে পারফরম্যান্স অপটিমাইজ করার জন্য কিছু কৌশল অবলম্বন করা যেতে পারে। এখানে কিছু মূল টিপস দেওয়া হলো:
১. Use Asynchronous Libraries
যখন আপনি ডাটাবেস, ফাইল সিস্টেম, বা নেটওয়ার্কে কোনো I/O অপারেশন করছেন, তখন asynchronous libraries ব্যবহার করা উচিত। এটি সার্ভারের অন্যান্য রিকোয়েস্ট প্রসেসিং থামিয়ে না রেখে, অপ্রয়োজনীয় বিলম্ব এড়াতে সাহায্য করবে।
উদাহরণ: Asynchronous Database Call
from fastapi import FastAPI
import databases
DATABASE_URL = "sqlite:///./test.db"
database = databases.Database(DATABASE_URL)
app = FastAPI()
@app.on_event("startup")
async def startup():
await database.connect()
@app.on_event("shutdown")
async def shutdown():
await database.disconnect()
@app.get("/items/{item_id}")
async def get_item(item_id: int):
query = "SELECT * FROM items WHERE id = :item_id"
item = await database.fetch_one(query, values={"item_id": item_id})
return item
এখানে databases লাইব্রেরি ব্যবহার করা হয়েছে যা অ্যাসিঙ্ক্রোনাস ডাটাবেস কল তৈরি করতে সাহায্য করে।
২. Limit Response Size
বড় আকারের রেসপন্স অ্যাপ্লিকেশনের পারফরম্যান্স হ্রাস করতে পারে। তাই, রেসপন্সের আকার সীমাবদ্ধ রাখুন।
উদাহরণ: Limit Response Size
from fastapi import FastAPI
from typing import List
app = FastAPI()
@app.get("/items/", response_model=List[str])
async def get_items():
# Simulating a large data response
items = ["item1", "item2", "item3", "item4", "item5"]
return items[:3] # Limiting the response to the first 3 items
এখানে, রেসপন্সের আকার 3 আইটেম পর্যন্ত সীমাবদ্ধ করা হয়েছে।
৩. Use Background Tasks
ফাস্টএপিআই তে ব্যাকগ্রাউন্ড টাস্ক ব্যবহার করা যায়। যেমন, দীর্ঘ সময় ধরে চলা কাজগুলো, যেগুলি রিকোয়েস্ট প্রসেসিং থেকে আলাদা হতে পারে, ব্যাকগ্রাউন্ড টাস্ক হিসেবে চালানো যায়।
উদাহরণ: Background Tasks
from fastapi import FastAPI, BackgroundTasks
app = FastAPI()
def write_log(message: str):
with open("log.txt", "a") as log:
log.write(message)
@app.get("/")
async def root(background_tasks: BackgroundTasks):
background_tasks.add_task(write_log, "New request received!\n")
return {"message": "Hello, World!"}
এখানে, write_log ফাংশনটি ব্যাকগ্রাউন্ডে চলে, এবং background_tasks.add_task এর মাধ্যমে এই কাজটি আলাদা থ্রেডে করা হয়।
৪. Use Caching
ক্যাশিং একটি কার্যকর পদ্ধতি যা ডেটা পুনরায় প্রসেসিং থেকে রক্ষা করে এবং API-এর দ্রুত রেসপন্স প্রদান করে। FastAPI তে Redis বা Memcached ব্যবহার করা যেতে পারে।
উদাহরণ: Caching with Redis
import redis
from fastapi import FastAPI
app = FastAPI()
redis_client = redis.Redis(host='localhost', port=6379, db=0)
@app.get("/items/{item_id}")
async def get_item(item_id: int):
cached_item = redis_client.get(item_id)
if cached_item:
return {"item_id": item_id, "cached": True, "item": cached_item.decode()}
# Simulating a DB call and caching it
item = {"name": f"Item {item_id}", "price": 100 + item_id}
redis_client.set(item_id, str(item))
return {"item_id": item_id, "cached": False, "item": item}
এখানে, Redis ক্যাশিং ব্যবহার করে ডাটাবেস কল কমানো হয়েছে।
৫. Optimize Middleware Usage
FastAPI তে বিভিন্ন Middleware ব্যবহার করা হয়। তবে, অতিরিক্ত Middleware ব্যবহারে পারফরম্যান্স ক্ষতিগ্রস্ত হতে পারে। তাই, Middleware শুধুমাত্র প্রয়োজনীয় ক্ষেত্রেই ব্যবহার করা উচিত।
৩. Concurrency and Parallelism in FastAPI
FastAPI অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং সমর্থন করে, যার মাধ্যমে আপনি একাধিক কাজ একসাথে রান করাতে পারেন। FastAPI অ্যাসিঙ্ক্রোনাস I/O সমর্থন করে, যা অ্যাপ্লিকেশনকে concurrent এবং parallel টাস্ক পরিচালনা করার সুবিধা দেয়।
উদাহরণ: Concurrency in FastAPI
from fastapi import FastAPI
import asyncio
app = FastAPI()
async def simulate_io_task(task_id: int):
await asyncio.sleep(2) # Simulating I/O task (e.g., DB call)
return f"Task {task_id} completed"
@app.get("/")
async def perform_tasks():
tasks = [simulate_io_task(i) for i in range(1, 6)]
results = await asyncio.gather(*tasks)
return {"results": results}
এখানে, asyncio.gather ব্যবহার করা হয়েছে যাতে একাধিক I/O টাস্ক একসাথে সম্পন্ন করা যায় এবং অ্যাসিঙ্ক্রোনাসভাবে তাদের ফলাফল সংগ্রহ করা যায়।
FastAPI অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং এবং পারফরম্যান্স অপটিমাইজেশনের জন্য অত্যন্ত কার্যকরী। আপনি Asynchronous Programming ব্যবহার করে ডাটা প্রসেসিং দ্রুত করতে পারেন এবং Performance Optimization এর জন্য বিভিন্ন কৌশল যেমন ক্যাশিং, লিমিটিং রেসপন্স সাইজ, ব্যাকগ্রাউন্ড টাস্ক ইত্যাদি ব্যবহার করতে পারেন। FastAPI তে অ্যাসিঙ্ক্রোনাস ফাংশন, হাই পারফরম্যান্স এবং স্কেলেবিলিটি নিশ্চিত করার জন্য পারফেক্ট সাপোর্ট রয়েছে।
Read more