FastAPI অত্যন্ত দ্রুত এবং কার্যকরী ওয়েব অ্যাপ্লিকেশন তৈরি করার জন্য ব্যবহৃত হয়, এবং এটি Real-time Communication এবং Data Streaming এর জন্য আধুনিক প্রযুক্তি সমর্থন করে। এখানে, আমরা জানবো কিভাবে FastAPI তে WebSockets এবং Server-Sent Events (SSE) ব্যবহার করে রিয়েল-টাইম কমিউনিকেশন এবং ডাটা স্ট্রিমিং করা যায়।
Real-time Communication
Real-time communication বা লাইভ ডাটা ট্রান্সফার হল এমন একটি প্রক্রিয়া, যার মাধ্যমে সিস্টেমের মধ্যে ডাটা তাত্ক্ষণিকভাবে প্রেরণ করা হয়। FastAPI তে, দুটি জনপ্রিয় প্রযুক্তি ব্যবহার করে রিয়েল-টাইম কমিউনিকেশন করা যায়:
- WebSockets
- Server-Sent Events (SSE)
WebSockets
WebSocket হল একটি প্রোটোকল যা ক্লায়েন্ট এবং সার্ভারের মধ্যে পূর্ণ-দ্বিমুখী যোগাযোগ স্থাপন করে। এটি HTTP প্রোটোকলের উপর ভিত্তি করে তৈরি, তবে HTTP হ্যান্ডশেক শেষ হওয়ার পর এটি একটি পূর্ণ-দ্বিমুখী (Full-duplex) যোগাযোগ চ্যানেল খুলে দেয়। এর মাধ্যমে সার্ভার এবং ক্লায়েন্টের মধ্যে দ্রুত এবং স্বয়ংক্রিয়ভাবে ডাটা প্রেরণ করা যায়।
WebSocket উদাহরণ FastAPI তে
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
app = FastAPI()
# WebSocket endpoint
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
try:
while True:
# Receive message from client
data = await websocket.receive_text()
print(f"Message received: {data}")
# Send message to client
await websocket.send_text(f"Message received: {data}")
except WebSocketDisconnect:
print("Client disconnected")
ব্যাখ্যা:
@app.websocket("/ws"): এটি একটি WebSocket এন্ডপয়েন্ট তৈরি করছে, যেখানে ক্লায়েন্টরা কানেক্ট করতে পারবে।await websocket.accept(): WebSocket কানেকশনের শুরুতে সার্ভার ক্লায়েন্টের সাথে সংযোগ গ্রহণ করে।await websocket.receive_text(): সার্ভার ক্লায়েন্ট থেকে টেক্সট মেসেজ গ্রহণ করে।await websocket.send_text(): সার্ভার ক্লায়েন্টকে একটি টেক্সট মেসেজ প্রেরণ করে।WebSocketDisconnect: ক্লায়েন্ট যদি সংযোগ বিচ্ছিন্ন করে, তাহলেWebSocketDisconnectএর মাধ্যমে সেশন বন্ধ হয়ে যাবে।
রিকোয়েস্ট উদাহরণ:
WebSocket ক্লায়েন্ট হতে পারে:
const socket = new WebSocket("ws://127.0.0.1:8000/ws");
socket.onopen = function(event) {
console.log("Connection established");
socket.send("Hello Server!");
};
socket.onmessage = function(event) {
console.log("Message from server: " + event.data);
};
এখানে, ক্লায়েন্ট সার্ভারের সাথে কানেক্ট হবে, এবং Hello Server! বার্তা সার্ভারে পাঠাবে। সার্ভারও এর উত্তরে বার্তা ফেরত পাঠাবে।
Server-Sent Events (SSE)
Server-Sent Events (SSE) হল একটি একমুখী (one-way) যোগাযোগ পদ্ধতি, যেখানে শুধুমাত্র সার্ভার থেকে ক্লায়েন্টে ডাটা প্রেরণ করা হয়। এটি সাধারণত লগ, এলার্ট বা লাইভ ডাটা স্ট্রিমিং এর জন্য ব্যবহৃত হয়, যেখানে ক্লায়েন্ট বারবার সার্ভারে রিকোয়েস্ট না করে ধারাবাহিকভাবে ডাটা পেতে পারে।
SSE উদাহরণ FastAPI তে
from fastapi import FastAPI
from fastapi.responses import EventSourceResponse
import time
app = FastAPI()
# SSE endpoint
@app.get("/events/")
async def event_stream():
async def event_publisher():
while True:
time.sleep(1) # Simulate data streaming
yield f"data: The current time is {time.ctime()}\n\n"
return EventSourceResponse(event_publisher())
ব্যাখ্যা:
EventSourceResponse: FastAPI এর মাধ্যমে SSE রেসপন্স তৈরী করতে এটি ব্যবহার করা হয়।event_publisher: এটি একটি অ্যাসিঙ্ক্রোনাস ফাংশন যা ধারাবাহিকভাবে ডাটা প্রেরণ করে। এখানে, প্রতি ১ সেকেন্ড পরtime.ctime()দ্বারা সার্ভার বর্তমান সময় পাঠাচ্ছে।
রিকোয়েস্ট উদাহরণ:
এটি একটি SSE ক্লায়েন্ট হতে পারে:
const eventSource = new EventSource("http://127.0.0.1:8000/events/");
eventSource.onmessage = function(event) {
console.log("New message from server: " + event.data);
};
এখানে, ক্লায়েন্ট সার্ভারের সাথে সংযোগ স্থাপন করবে এবং প্রতি সেকেন্ডে নতুন তথ্য (বর্তমান সময়) পাবে।
WebSockets এবং SSE এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | WebSockets | Server-Sent Events (SSE) |
|---|---|---|
| কমিউনিকেশন | দ্বিমুখী (Full-duplex) | একমুখী (One-way) |
| ক্লায়েন্ট এবং সার্ভার | উভয়ের মধ্যে মেসেজ আদান-প্রদান | শুধুমাত্র সার্ভার থেকে ক্লায়েন্টে |
| ট্রান্সপোর্ট | TCP-based (WS) | HTTP-based (SSE) |
| ব্যবহার | রিয়েল-টাইম চ্যাট, গেম, কোল্যাবোরেশন | লাইভ ডাটা স্ট্রিমিং, এলার্টস |
| পারফরম্যান্স | উচ্চ পারফরম্যান্স, দুই-way কমিউনিকেশন | সহজ এবং ক্লায়েন্ট-ফ্রেন্ডলি |
Data Streaming
FastAPI তে Data Streaming পরিচালনা করতে, আমরা মূলত SSE বা WebSockets ব্যবহার করি, যেগুলো আমাদের স্ট্রিমিং ডাটা রিয়েল-টাইমে ক্লায়েন্টে পাঠাতে সক্ষম। এর মাধ্যমে, বড় ডাটা ফাইল বা টেকনিক্যাল কমিউনিকেশন দ্রুত এবং কার্যকরীভাবে সম্পাদন করা যায়।
Data Streaming উদাহরণ:
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import io
app = FastAPI()
# File streaming
@app.get("/file/")
async def stream_file():
file_content = b"Some large content..." * 1000 # Simulate large file content
return StreamingResponse(io.BytesIO(file_content), media_type="application/octet-stream")
এখানে, StreamingResponse ব্যবহার করে একটি বড় ফাইল বা ডাটা স্ট্রিম ক্লায়েন্টে পাঠানো হচ্ছে। এটি খুবই কার্যকরী যখন আপনার কাছে বড় ফাইল বা ডাটা স্ট্রিমিং থাকে, যেমন ভিডিও স্ট্রিমিং বা বড় ডকুমেন্ট আপলোড/ডাউনলোড।
FastAPI তে Real-time Communication এবং Data Streaming সহজেই পরিচালনা করা যায় WebSockets এবং Server-Sent Events ব্যবহার করে। WebSockets দ্বিমুখী কমিউনিকেশন (full-duplex communication) এবং SSE একমুখী (one-way) স্ট্রিমিং ডাটা সেবা প্রদান করে। FastAPI এই প্রযুক্তিগুলো ব্যবহার করে দ্রুত, স্কেলেবল, এবং অত্যন্ত কার্যকরী রিয়েল-টাইম অ্যাপ্লিকেশন তৈরি করতে সহায়ক।
Read more