মাইক্রোসার্ভিসেস আর্কিটেকচার 2026 সালে উল্লেখযোগ্যভাবে পরিপক্ক হয়েছে। কয়েক বছর ধরে “মাইক্রোসার্ভিসেস হেল” এর পরে যেখানে দলগুলি অনেকগুলি খুব ছোট পরিষেবা তৈরি করেছে, শিল্পটি এমন নিদর্শনগুলিতে একত্রিত হয়েছে যা অপারেশনাল সরলতার সাথে মডুলারিটির ভারসাম্য বজায় রাখে। এই নির্দেশিকা কভার করে কখন মাইক্রোসার্ভিস ব্যবহার করতে হবে, কীভাবে সেগুলি ডিজাইন করতে হবে এবং কীভাবে শক্ত অংশগুলি পরিচালনা করতে হবে।
📋 Table of Contents
মনোলিথ বনাম মাইক্রোসার্ভিসেস বনাম মডুলার মনোলিথ
| এপ্রোচ | কখন ব্যবহার করবেন | ট্রেড-অফ |
|---|---|---|
| মনোলিথ | স্টার্টআপ, <10 ইঞ্জিনিয়ার, অজানা ডোমেন | নির্মাণ/ডিবাগ করা সহজ, স্বাধীনভাবে স্কেল করা কঠিন |
| মডুলার মনোলিথ | ক্রমবর্ধমান দল, স্পষ্ট আবদ্ধ প্রসঙ্গ, একক স্থাপনা | উভয় বিশ্বের সেরা — মডুলার কিন্তু সহজ |
| মাইক্রোসার্ভিস | বড় প্রতিষ্ঠান, স্বাধীন দল স্কেলিং, পলিগ্লট প্রযুক্তি | স্বাধীন স্কেলিং/ডিপ্লয়মেন্ট, জটিল ডিস্ট্রিবিউটেড সিস্টেম |
2026 ঐক্যমত্য: মডুলার মনোলিথ দিয়ে শুরু করুন, আপনার কাছে স্পষ্ট কারণ থাকলে (স্কেল, স্বাধীন স্থাপনা, দলের স্বায়ত্তশাসন) পরিষেবাগুলি বের করুন৷
আবদ্ধ প্রসঙ্গ এবং পরিষেবা ডিজাইন
ভাল মাইক্রোসার্ভিসগুলি ডোমেন-চালিত ডিজাইন (DDD) আবদ্ধ প্রসঙ্গগুলির সাথে সারিবদ্ধ করে:
E-commerce domain bounded contexts:
Order Service (owns orders, order items)
- Create order
- Update order status
- Get order history
Product Service (owns products, inventory)
- List products
- Update inventory
- Product search
User Service (owns users, auth)
- Register, login
- Profile management
- Authentication tokens
Payment Service (owns payment processing)
- Process payment
- Handle refunds
- Payment status
Notification Service (owns notifications)
- Email, SMS, push
- Triggered by events from other services
Each service:
- Has its own database (database-per-service pattern)
- Is owned by one team
- Can be deployed independently
- Communicates via API or events (not shared DB)
যোগাযোগ নিদর্শন
সিঙ্ক্রোনাস (REST/gRPC)
# REST API call between services
import httpx
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=1, max=10))
async def get_user(user_id: int) -> dict:
async with httpx.AsyncClient(base_url="http://user-service:8001") as client:
r = await client.get(f"/api/users/{user_id}", timeout=5.0)
r.raise_for_status()
return r.json()
# Use circuit breaker for resilience
from circuitbreaker import circuit
@circuit(failure_threshold=5, recovery_timeout=30)
async def call_payment_service(order_id: int, amount: float):
async with httpx.AsyncClient(timeout=10) as client:
return await client.post("http://payment-service/payments",
json={"order_id": order_id, "amount": amount})
অ্যাসিঙ্ক্রোনাস (কাফকার সাথে ইভেন্ট-চালিত)
from aiokafka import AIOKafkaProducer, AIOKafkaConsumer
import json
# Produce event when order is created
async def publish_order_created(order: dict):
producer = AIOKafkaProducer(bootstrap_servers="kafka:9092")
await producer.start()
try:
event = {
"event_type": "order.created",
"order_id": order["id"],
"user_id": order["user_id"],
"total": order["total"],
"timestamp": datetime.utcnow().isoformat()
}
await producer.send("orders", json.dumps(event).encode())
finally:
await producer.stop()
# Notification service consumes the event
async def consume_order_events():
consumer = AIOKafkaConsumer(
"orders",
bootstrap_servers="kafka:9092",
group_id="notification-service",
auto_offset_reset="earliest"
)
await consumer.start()
async for msg in consumer:
event = json.loads(msg.value)
if event["event_type"] == "order.created":
await send_confirmation_email(event["user_id"], event["order_id"])
API গেটওয়ে প্যাটার্ন
# Kong / nginx / custom gateway routes
# All clients talk to one entry point:
# POST /api/orders -> Order Service :8001
# GET /api/products -> Product Service :8002
# POST /api/auth -> User Service :8003
# Kong route configuration
routes:
- name: orders
paths: ["/api/orders"]
service: order-service
plugins:
- name: jwt # validate JWT
- name: rate-limiting # 100/min per user
- name: request-transformer
- name: products
paths: ["/api/products"]
service: product-service
plugins:
- name: response-ratelimiting
বিতরণ ট্রেসিং
# OpenTelemetry — trace requests across services
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
from opentelemetry.sdk.trace.export import BatchSpanProcessor
# Setup (once at startup)
provider = TracerProvider()
jaeger_exporter = JaegerExporter(agent_host_name="jaeger", agent_port=6831)
provider.add_span_processor(BatchSpanProcessor(jaeger_exporter))
trace.set_tracer_provider(provider)
tracer = trace.get_tracer(__name__)
# Instrument FastAPI
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor
FastAPIInstrumentor.instrument_app(app) # auto-instruments all routes
HTTPXClientInstrumentor().instrument() # auto-instruments httpx calls
# Manual span for business logic
async def process_order(order_id: int):
with tracer.start_as_current_span("process_order") as span:
span.set_attribute("order.id", order_id)
order = await get_order(order_id)
span.set_attribute("order.total", order["total"])
await charge_payment(order)
await send_confirmation(order)
সেবা স্বাস্থ্য এবং স্থিতিস্থাপকতা
from fastapi import FastAPI
from datetime import datetime
app = FastAPI()
@app.get("/health")
async def health():
return {
"status": "healthy",
"timestamp": datetime.utcnow().isoformat(),
"version": "1.2.3",
"dependencies": {
"database": await check_db(),
"redis": await check_redis(),
}
}
@app.get("/ready")
async def readiness():
# Check if service can handle traffic
if not db_pool or not redis_client:
raise HTTPException(503, "Service not ready")
return {"status": "ready"}
# Kubernetes probes:
# livenessProbe: /health (if fails: restart container)
# readinessProbe: /ready (if fails: remove from load balancer)
যখন মাইক্রোসার্ভিস ব্যবহার করবেন না
- ছোট দল (৫ বছরের কম প্রকৌশলী)– অপারেশনাল ওভারহেড বেগকে হত্যা করে
- প্রারম্ভিক পণ্য— ডোমেনের সীমানা এখনও পরিষ্কার নয়
- সহজ CRUD অ্যাপ– কোন স্কেলিং ন্যায্যতা
- নেটওয়ার্ক লেটেন্সি গুরুত্বপূর্ণ– ইন্টার-সার্ভিস কল লেটেন্সি যোগ করে
- কোনো DevOps পরিপক্কতা নেই– প্রথমে CI/CD, মনিটরিং, ট্রেসিং প্রয়োজন
2026 সালে মাইক্রোসার্ভিসগুলি সর্বোত্তম কাজ করে যখন: টিমগুলি স্বাধীনভাবে পরিষেবার মালিক হওয়ার জন্য যথেষ্ট বড়, আবদ্ধ প্রসঙ্গগুলি পরিষ্কার এবং আপনার কাছে বিতরণ করা সিস্টেমগুলি পরিচালনা করার জন্য DevOps পরিকাঠামো রয়েছে৷ একটি সুগঠিত মডুলার মনোলিথ দিয়ে শুরু করুন এবং শুধুমাত্র যখন আপনি স্পষ্ট ব্যথার পয়েন্টে আঘাত করবেন তখনই এক্সট্র্যাক্ট পরিষেবা।
🔗 Share this article
✍️ Leave a Comment