সেশন ১৩

API Gateway - সব request এর একটাই দরজা

এই সেশনের লক্ষ্য: Client কেন ২০টা service কে সরাসরি call করবে না, সেটা বোঝা। API gateway কীভাবে একটাই দরজা হয়ে routing, JWT check, TLS termination, rate limiting, request aggregation আর response caching সামলায়, সেটা শেখা। BFF কখন দরকার, load balancer এর সাথে gateway এর পার্থক্য কী, আর gateway নিজেই যেন SPOF না হয়, সেটাও দেখা।

০০ যে প্রশ্নগুলোর উত্তর খুঁজবো

সেশন ১১ তে আমরা একটা বড় system কে অনেকগুলো ছোট service এ ভাগ করেছি। সেশন ১২ তে দেখেছি, service গুলো নিজেদের মধ্যে কীভাবে কথা বলে। কিন্তু একটা প্রশ্ন এখনো বাকি। বাইরের দুনিয়া, মানে customer এর mobile অ্যাপ আর browser, এই এতগুলো service এর সাথে কীভাবে কথা বলবে?

এই সেশনে আমরা একজন mobile developer এর পাশে বসবো। তার অ্যাপের login এ প্রায় ৯ সেকেন্ড লাগে। শেষে আপনি বুঝবেন, সব request এর জন্য একটাই দরজা বসালে কেন অ্যাপ দ্রুত হয়, আর system নিরাপদও হয়।

  • ১ Mobile অ্যাপ সরাসরি ২০টা microservice কে call করলে সমস্যা কোথায়?
  • ২ সব request এর জন্য একটাই দরজা বসালে কেমন হয়? (API gateway, reverse proxy, routing)
  • ৩ Token check প্রতিটা service এ না করে gateway তে একবার করলে কী লাভ? (JWT)
  • ৪ HTTPS এর encryption কোথায় খোলা উচিত? (TLS termination)
  • ৫ Gateway আর কোন কাজগুলো সবার হয়ে করতে পারে? (rate limiting, response caching)
  • ৬ ৭টা call কে কি একটা call বানানো যায়? (request aggregation)
  • ৭ Mobile আর web এর দরকার আলাদা হলে কী করবো? (BFF)
  • ৮ API gateway আর load balancer কি একই জিনিস?
  • ৯ সব traffic gateway দিয়েই যায়। তাহলে gateway down হলে কী হবে? (SPOF, redundancy)

০১ Mobile অ্যাপ সরাসরি ২০টা microservice কে call করলে সমস্যা কোথায়?

রবিবার সকাল। মিতু অফিসে ঢুকে চায়ের কাপটা নামিয়ে রাখতেই Play Store এর একটা review চোখে পড়লো। রংপুরের এক দোকানদার এক তারা দিয়ে লিখেছেন: “Login করতে দশ সেকেন্ড লাগে। Customer দাঁড়িয়ে থাকে, আমি টাকা পাঠাতে পারি না।” মিতু একটা ব্যাংকের mobile অ্যাপের developer। মন খারাপ করে সে নিজের phone টা 3G তে নামিয়ে login করলো। Spinner ঘুরলো প্রায় ৯ সেকেন্ড।

Network log খুলে মিতু অবাক হলো। Login screen শেষ করতে অ্যাপটা ৭টা আলাদা server এ ৭টা call পাঠাচ্ছে। Login, profile, account balance, card, শেষ ৫টা লেনদেন, notification এর সংখ্যা আর offer। প্রতিটা call যায় আলাদা একটা service এ, আলাদা ঠিকানায়।

মিতুর অ্যাপ Login screen 3G, RTT ~300ms ৭টা আলাদা host ৭ বার TLS handshake ৭ রকম token check auth-service token বানায় profile-service signature + মেয়াদ check account-service signature + মেয়াদ check card-service শুধু signature, মেয়াদ দেখে না txn-service পুরোনো library, আলাদা rule notify-service decode করে, check করে না offer-service মেয়াদ check ভুলে গেছে
Gateway ছাড়া মিতুর অ্যাপকে ৭টা service এর ঠিকানা আলাদা করে জানতে হয়। প্রতিটা host এর সাথে নতুন করে connection বানাতে হয়। আর token check হয় ৭ জায়গায়, ৭ রকম ভাবে। রঙিন লেখার তিনটা service এ check দুর্বল, আর একটা দুর্বল দরজাই পুরো system কে খোলা রাখে।

সমস্যা ১: ধীর network এ প্রতিটা call দামি

3G তে phone থেকে server এ গিয়ে ফিরে আসতে (এক round trip, সংক্ষেপে RTT) প্রায় ৩০০ms লাগে। নতুন একটা server এর সাথে প্রথমবার কথা বলতে শুধু হাত মেলাতেই কয়েকটা round trip চলে যায়। হিসাবটা দেখুন:

# 3G তে একটা round trip (RTT): প্রায় 300 ms

# নতুন একটা host এ প্রথম call
DNS lookup (ঠিকানা খোঁজা): 1 RTT
TCP handshake: 1 RTT
TLS handshake (TLS 1.2): 2 RTT
আসল request + response: 1 RTT
মোট: 5 RTT × 300 ms ≈ 1.5 s

# মিতুর login screen
একটার পর একটা: login, profile, accounts, txn
    4 × 1.5 s ≈ 6.0 s
একসাথে: cards, notify, offers
    ≈ 1.5 s
180 KB JSON নামানো, 3G তে ~125 KB/s
    ≈ 1.4 s
সব মিলিয়ে ≈ 9 s

এখানে handshake মানে আসল কথা শুরুর আগে দুই পক্ষের পরিচয় আর নিয়ম ঠিক করে নেওয়া। TLS হলো সেই ব্যবস্থা, যেটা HTTPS কে encrypted রাখে (সেশনের ০৪ নম্বর অংশে বিস্তারিত)। ৭টা আলাদা host মানে এই handshake ৭ বার। আর কিছু call আগের call এর উত্তরের জন্য অপেক্ষা করে, তাই সেগুলো একটার পর একটা চলে। ৯ সেকেন্ড এভাবেই হয়।

সমস্যা ২: ৭ জায়গায় ৭ রকম token check

একই সপ্তাহে মিতুর inbox এ security audit team এর একটা email এলো। তিন মাস আগে logout করা একজন customer এর পুরোনো token দিয়ে এখনো offer আর notification দেখা যাচ্ছে। কারণ খুঁজতে গিয়ে দেখা গেলো, প্রতিটা service নিজের মতো করে token check করে। কেউ মেয়াদ দেখে, কেউ দেখে না। একটা service তো token খুলে পড়ে, কিন্তু আসল কিনা যাচাইই করে না।

ব্যাংকের দশটা দরজার নয়টায় শক্ত তালা থাকলেও লাভ নেই। চোর খোলা দরজাটাই খুঁজে নেয়।

সমস্যা ৩: অ্যাপ পেছনের সব ঠিকানা জানে

অ্যাপের code এ ৭টা service এর ঠিকানা লেখা আছে। Backend team account-service কে দুই ভাগ করলে অ্যাপও বদলাতে হবে। কিন্তু নতুন version Play Store এ দিলেও সবাই সাথে সাথে update করে না। মাসখানেক পরেও প্রায় ৩০% customer পুরোনো version চালায়। ফলে পুরোনো ঠিকানাগুলো বছরের পর বছর চালু রাখতে হয়।

সমস্যা ৪: সব service internet এ খোলা

অ্যাপ সরাসরি call করে মানে প্রতিটা service কে internet থেকে পৌঁছানো যায়। ২০টা service মানে পাহারা দেওয়ার মতো ২০টা দরজা। প্রতিটার আলাদা certificate, আলাদা firewall rule, আলাদা নজরদারি লাগে।

আসল সমস্যা

সমস্যাটা কোনো একটা service এর নয়। সমস্যা হলো, client কে পেছনের পুরো ভেতরের নকশা জানতে হচ্ছে। আর যে কাজগুলো সবার জন্য একই (token check, encryption, পাহারা), সেগুলো প্রতিটা service আলাদা করে, আলাদা ভাবে করছে।

০২ সব request এর জন্য একটাই দরজা বসালে কেমন হয়?

ব্যাংকের শাখার reception desk

যেকোনো ব্যাংকের শাখায় ঢুকলে কী দেখেন, একবার মনে করুন। ঢোকার দরজা একটাই। দরজায় একজন guard থাকেন। ভেতরে একটা reception desk। আপনি desk এ বলেন, “টাকা জমা দেবো।” উনি দেখিয়ে দেন, “৩ নম্বর counter এ যান।” আপনি নিজে ভল্টে বা manager এর ঘরে ঢুকতে পারেন না। ভেতরের কোন টেবিলে কে বসে, সেটা জানারও দরকার হয় না।

Software এ এই reception desk এর নাম API gateway। এটা একটা server, যেটা সব service এর সামনে দাঁড়িয়ে থাকে। Client এর সব request প্রথমে এখানে আসে। Gateway ঠিক করে, request টা পেছনের কোন service এ যাবে।

CLIENT GATEWAY SERVICES Mobile অ্যাপ মিতুর অ্যাপ Web browser internet banking API Gateway path দেখে ঠিক service এ পাঠায় /auth/* auth-service /profile/* profile-service /accounts/* account-service /cards/* card-service /txn/* txn-service Service গুলো private network এ থাকে; বাইরে থেকে সরাসরি পৌঁছানো যায় না
এখন client শুধু একটা ঠিকানা চেনে: gateway। Gateway request এর path দেখে ঠিক করে কোন service এ পাঠাবে: /accounts/* গেলে account-service এ, /cards/* গেলে card-service এ। পেছনে service ভাগ হলো, নাম বদলালো, নাকি নতুন service এলো, অ্যাপ সেটা জানতেই পারে না।

Reverse proxy: gateway আসলে কোন জাতের server

Reverse proxy হলো এমন একটা server, যেটা অন্য server গুলোর সামনে দাঁড়ায়। Client ভাবে সে reverse proxy এর সাথেই কথা বলছে। আসলে proxy request টা পেছনের আসল server এ পাঠায়, আর উত্তরটা ফেরত এনে দেয়। Client পেছনের server গুলোকে কখনো দেখে না।

সেশন ০২ এর load balancer ও এক ধরনের reverse proxy। API gateway ও তাই। পার্থক্য হলো, gateway API বোঝে। সে request এর path, header আর token পড়ে সিদ্ধান্ত নেয়। এই পার্থক্য নিয়ে ০৮ নম্বর অংশে আরো কথা হবে।

Routing: কোন request কোথায় যাবে

Gateway এর সবচেয়ে মৌলিক কাজ হলো routing। মানে request এর path দেখে ঠিক service টা বেছে নেওয়া। এর জন্য gateway এর একটা route table থাকে:

# gateway এর route table (সরল উদাহরণ)
routes:
  - match: /auth/*
    upstream: http://auth-service:8080
    auth: none              # login এর আগে token থাকে না
  - match: /accounts/*
    upstream: http://account-service:8080
    auth: jwt
    timeout: 800ms
  - match: /cards/*
    upstream: http://card-service:8080
    auth: jwt
    timeout: 800ms
  # ... বাকি service গুলোর জন্য একই রকম entry

এখন মিতুর অ্যাপ শুধু একটা ঠিকানা চেনে। Backend team পরের মাসে account-service কে দুই ভাগ করলে শুধু gateway এর route table বদলাবে। অ্যাপের একটা লাইনও বদলাতে হবে না, পুরোনো version এর customer রাও কিছু টের পাবেন না।

Gateway কীভাবে জানে account-service এখন কোন machine এ চলছে? সেটা service discovery এর কাজ, সেশন ১৪ তে দেখবো। বাস্তবে gateway হিসেবে Kong, Envoy, NGINX, AWS API Gateway বা Spring Cloud Gateway এর মতো তৈরি software ব্যবহার করা হয়। কেউ শূন্য থেকে নিজে বানায় না।

০৩ Token check প্রতিটা service এ না করে gateway তে একবার করলে কী লাভ?

আগে দুটো শব্দ আলাদা করে নিই, কারণ interview তে এরা প্রায়ই গুলিয়ে যায়।

JWT: সিল দেওয়া একটা digital ID card

মিতু login করলে auth-service তাকে একটা token দেয়। পরের প্রতিটা request এর সাথে অ্যাপ এই token টা পাঠায়। ব্যাংকের অ্যাপে এই token সাধারণত একটা JWT (JSON Web Token)।

JWT কে অফিসের ID card এর মতো ভাবুন। Card এ আপনার নাম আর ID লেখা থাকে। সাথে HR এর একটা সিল থাকে, যেটা নকল করা যায় না। Guard আপনাকে চেনেন না, কিন্তু সিলটা চেনেন। সিল ঠিক থাকলে তিনি card এর লেখা বিশ্বাস করেন। কাউকে ফোন করে জিজ্ঞেস করতে হয় না।

# JWT = header.payload.signature  (তিনটা অংশ, মাঝে ডট)
eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJ1XzQ4MjEzIn0.<signature>

# header (decode করলে)
{ "alg": "RS256" }

# payload (decode করলে): যে কেউ পড়তে পারে, তাই গোপন কিছু রাখা যাবে না
{
  "sub":  "u_48213",        # কোন customer
  "role": "customer",
  "iss":  "auth-service",   # কে বানিয়েছে
  "iat":  1762500000,       # কখন বানানো
  "exp":  1762500300        # কখন মেয়াদ শেষ (৫ মিনিট পরে)
}

# signature
auth-service এর private key দিয়ে header আর payload কে sign করা।
Gateway শুধু public key দিয়ে মিলিয়ে দেখে। Public key দিয়ে নতুন token বানানো যায় না।

একটা JWT এর তিনটা অংশ থাকে, মাঝে ডট দিয়ে আলাদা করা:

একটা জরুরি সতর্কতা। Payload encrypted নয়, শুধু একটা encoding (base64) করা। যে কেউ এটা খুলে পড়তে পারে। তাই JWT এর ভেতরে কখনো PIN, password বা account এর গোপন তথ্য রাখবেন না।

Edge এ একবার check, মানে gateway তে

এখন token check হয় শুধু gateway তে, একটাই code দিয়ে:

১. অ্যাপ request পাঠায় Authorization: Bearer <JWT> ২. Gateway JWT check করে signature, exp, iss: একবার, এক জায়গায় ঠিক আছে ভুল বা মেয়াদ শেষ ৩ক. Service এ পাঠায় সাথে header: X-User-Id: u_48213 ৩খ. 401 Unauthorized service পর্যন্ত যায়ই না ৪. account-service token parse করে না, X-User-Id পড়ে
Token check এখন একটাই জায়গায় হয়। ভুল, জাল বা মেয়াদ পেরোনো token gateway থেকেই 401 নিয়ে ফেরত যায়; ভেতরের কোনো service সেটা দেখেই না। ঠিক token হলে gateway customer এর ID একটা header এ বসিয়ে service এ পাঠায়।

এখানে “edge” মানে system এর বাইরের সীমানা, যেখানে internet শেষ হয়ে আমাদের network শুরু। সেশন ০৬ এর CDN edge এর সাথে মিলটা খেয়াল করুন: দুটোই বাইরের দুনিয়ার সবচেয়ে কাছের জায়গা।

এর লাভগুলো দেখুন। Audit team যে ভুলটা পেয়েছিলো, সেটা আর হওয়ার উপায় নেই, কারণ মেয়াদ check এখন একটাই জায়গায় লেখা। ভুল token ভেতরে ঢোকেই না, তাই service গুলোর CPU সেটার পেছনে নষ্ট হয় না। আর নতুন service বানানোর সময় কাউকে token এর code নতুন করে লিখতে হয় না।

JWT এর একটা দুর্বলতা: মেয়াদের আগে বাতিল করা কঠিন

Gateway কাউকে জিজ্ঞেস না করেই JWT বিশ্বাস করে। এটাই এর গতি, আবার এটাই দুর্বলতা। Customer logout করলেও token এর মেয়াদ শেষ না হওয়া পর্যন্ত সেটা কাজ করে। তাই ব্যাংকের মতো জায়গায় দুটো কাজ করা হয়:

কার কী দায়িত্ব

Gateway করে authentication: “এই token আসল, আর এটা customer u_48213 এর।” Service করে authorization: “u_48213 কি সত্যিই এই account এর মালিক?” প্রথম কাজটা সবার জন্য একই, তাই gateway তে যায়। দ্বিতীয়টা প্রতিটা service এর নিজের নিয়মের উপর নির্ভর করে, তাই service এই থাকে।

০৪ HTTPS এর encryption কোথায় খোলা উচিত?

মিতুর অ্যাপ থেকে ব্যাংক পর্যন্ত data যায় public Wi-Fi, মোবাইল operator আর আরো অনেকের network পার হয়ে। পথে কেউ যেন password বা balance পড়তে না পারে, সেজন্য সব কিছু encrypted থাকে। এই encryption এর ব্যবস্থার নাম TLS (Transport Layer Security)। HTTPS এর “S” টা এটাই।

Encrypted data কোথাও না কোথাও খুলতে হয়, নইলে server request টা পড়বে কীভাবে? যে জায়গায় encryption খোলা হয়, তাকে বলে TLS termination। Gateway থাকলে সাধারণত সেখানেই এটা করা হয়:

INTERNET GATEWAY PRIVATE NETWORK মিতুর অ্যাপ public Wi-Fi বা 3G HTTPS (encrypted) পথে কেউ পড়তে পারে না handshake একবারই API Gateway এখানে decrypt হয়, certificate এখানেই ভেতরে: সাধারণ HTTP, বা ব্যাংকের মতো জায়গায় আবার encrypt (mTLS) account-service crypto এর কাজ নেই card-service certificate লাগে না txn-service শুধু নিজের কাজ
Internet এর অংশটা (highlighted) সবসময় HTTPS। Encryption খোলা হয় gateway এ, তাই certificate থাকে এক জায়গায়, আর gateway request এর path ও token পড়তে পারে। ভেতরের service গুলোকে আর TLS handshake নিয়ে ভাবতে হয় না।

Gateway এ TLS termination করার চারটা কারণ:

  1. Gateway কে request পড়তেই হয়: path না পড়লে routing হয় না, token না পড়লে JWT check হয় না। Encrypted request এর ভেতরে সে কিছুই দেখতে পায় না।
  2. Certificate থাকে এক জায়গায়: TLS এর জন্য একটা certificate লাগে, যেটার মেয়াদ নির্দিষ্ট সময় পর শেষ হয়। ২০টা service এ ২০টা certificate মানে ২০টা মেয়াদের তারিখ মনে রাখা। একটা ভুলে গেলে রাতের বেলা হঠাৎ card section বন্ধ। এখন renew করতে হয় একটাই।
  3. Service গুলোর CPU বাঁচে: encryption খোলার কাজে CPU লাগে। এই কাজ এখন gateway একাই করে।
  4. Connection একবারই: অ্যাপ gateway এর সাথে একবার handshake করে connection টা খোলা রাখে। পরের সব request সেই connection দিয়েই যায়। আর gateway এ নতুন TLS 1.3 চালু করলে handshake ২ round trip থেকে নেমে ১ round trip হয়, 3G তে যেটা আরো ৩০০ms বাঁচায়।

Gateway এর পেছনে, private network এর ভেতরে, কী হয়? সাধারণ কোম্পানিতে সেখানে plain HTTP চলে, কারণ বাইরের কেউ সেই network এ ঢুকতে পারে না। কিন্তু ব্যাংকের নিয়ম সাধারণত আরো কড়া। সেখানে ভেতরেও আবার encrypt করা হয়, আর দুই পক্ষই নিজের certificate দেখায়। একে বলে mTLS (mutual TLS)। সেশন ১২ এর service mesh এই কাজটা প্রতিটা service এর পাশে বসে নিজে থেকেই করে দেয়।

০৫ Gateway আর কোন কাজগুলো সবার হয়ে করতে পারে?

একটা নিয়ম মনে রাখুন। যে কাজ প্রতিটা service কে একই ভাবে করতে হয়, সেটা gateway তে যাওয়ার প্রার্থী। এমন কাজকে বলে cross-cutting concern। এখানে আরো দুটো দেখি।

Rate limiting: একজনকে কতবার আসতে দেবো

এক রাতে মিতুর team দেখলো, একটা bot একটা phone number দিয়ে মিনিটে ১,০০০ বার login এর চেষ্টা করছে। সে PIN আন্দাজ করার চেষ্টা করছে। Rate limiting মানে একজন client নির্দিষ্ট সময়ে কতগুলো request পাঠাতে পারবে, তার একটা সীমা বেঁধে দেওয়া।

Gateway তে একটা নিয়ম বসানো হলো: একটা phone number দিয়ে মিনিটে ৫ বারের বেশি login চেষ্টা চলবে না। ৬ষ্ঠ চেষ্টায় gateway নিজেই 429 Too Many Requests ফেরত দেয় (সেশন ০৮ এ এই code দেখেছেন)। Bot এর ৯৯৫টা request auth-service পর্যন্ত পৌঁছায়ই না।

Gateway এ এটা করার সুবিধা হলো, সব request এখান দিয়েই যায়। তাই গোনাটা সহজ, আর প্রতিটা service কে আলাদা করে গুনতে হয় না। গোনার নানা পদ্ধতি আছে (token bucket, sliding window ইত্যাদি)। সেগুলো ছবিসহ সেশন ২১ এ দেখবো।

Response caching: একই উত্তর বারবার না বানানো

মিতুর অ্যাপের home screen এ আজকের ডলার রেট দেখায়। সকাল ৯টা থেকে ১০টার মধ্যে প্রায় ৫০,০০০ customer অ্যাপ খোলেন। মানে fx-service এক ঘণ্টায় ৫০,০০০ বার একই প্রশ্নের একই উত্তর দেয়। অথচ রেট বদলায় দিনে বড়জোর কয়েকবার।

Gateway উত্তরটা ৬০ সেকেন্ডের জন্য নিজের কাছে রেখে দিতে পারে। এই ৬০ সেকেন্ডই হলো TTL (সেশন ০৪ এ দেখেছেন)। তখন ঘণ্টায় fx-service এর কাছে যায় মাত্র ৬০টা request, বাকি সব উত্তর gateway থেকেই যায়।

কী cache করবেন না

ডলার রেট, শাখার তালিকা, ATM এর ঠিকানা সবার জন্য একই। এগুলো gateway তে cache করা নিরাপদ। কিন্তু balance বা লেনদেনের তালিকা প্রত্যেকের আলাদা। এগুলো ভুল করে cache হলে এক customer আরেকজনের balance দেখতে পারেন। তাই ব্যক্তিগত data gateway এর shared cache এ কখনো রাখবেন না।

একটা request এর পুরো যাত্রা

এতক্ষণ যা দেখলাম, সব এক ছবিতে রাখলে gateway এর ভেতরে একটা request এর পথ এমন দেখায়:

TLS termination HTTPS খুলে request পড়ে ১ token ভুল JWT check signature আর মেয়াদ দেখে ২ 401 ফেরত সীমা পার Rate limit এই user সীমা পার হলো কি? ৩ 429 ফেরত পাওয়া গেছে Response cache আগের উত্তর রাখা আছে কি? ৪ cache থেকে Route / aggregate এক বা একাধিক service এ পাঠায় ৫ Response ফেরত পথে log আর metric লেখে ৬
একটা request gateway এর ভেতরে এই ছয়টা ধাপ পার হয়। JWT বা rate limit এ আটকে গেলে request ভেতরে ঢোকেই না। Cache এ উত্তর পেলে কোনো service কে ডাকারও দরকার হয় না। এই কাজগুলো এখন আর প্রতিটা service কে আলাদা করে করতে হয় না।

০৬ ৭টা call কে কি একটা call বানানো যায়?

Gateway বসানোর পর মিতুর অ্যাপে এখন handshake হয় একবারই। কিন্তু অ্যাপ তো এখনো ৭টা request পাঠায়, আর প্রতিটা ধীর 3G পথ পার হয়। মিতু ভাবলো, home screen এর জন্য যা যা লাগে, gateway কি নিজেই সেগুলো জোগাড় করে একবারে দিতে পারে না?

পারে। এই কৌশলের নাম request aggregation। Client একটা request পাঠায়। Gateway ভেতরে কয়েকটা service কে call করে, উত্তরগুলো জোড়া লাগায়, আর একটা উত্তর ফেরত দেয়।

3G GATEWAY DATA CENTER মিতুর অ্যাপ Home screen খুলছে ১টা request GET /mobile/home ১টা response 15 KB, একবারই ~300ms API Gateway ৬টা call একসাথে, তারপর জোড়া লাগায় profile 40 ms accounts 80 ms cards 60 ms txn 120 ms notify 20 ms offers 50 ms মোট অপেক্ষা ≈ সবচেয়ে ধীর call (120 ms), সবগুলোর যোগফল (370 ms) নয়
ধীর 3G পথটা এখন মাত্র একবার পার হতে হয়। ৬টা call হয় data center এর ভেতরে, যেখানে দুই machine এর মধ্যে round trip ১ millisecond এর মতো। Gateway call গুলো একসাথে পাঠায়, তাই সবচেয়ে ধীর service (txn, 120 ms) যতক্ষণ নেয়, মোট অপেক্ষাও প্রায় ততক্ষণ।

এই কৌশল কাজ করে, কারণ দুই জায়গার network এর গতি একেবারে আলাদা। 3G তে একটা round trip ৩০০ms। Data center এর ভেতরে দুই machine এর মধ্যে round trip ১ms এর মতো। মানে ধীর পথটা যত কম পার হওয়া যায়, তত লাভ।

আরেকটা সুবিধা আছে। আগে account-service কে call করতে অ্যাপকে profile এর উত্তর থেকে customer ID নিতে হতো। এখন customer ID তো JWT এর ভেতরেই আছে। তাই gateway কারো জন্য অপেক্ষা না করে ৬টা call একসাথে পাঠাতে পারে।

Gateway এর আগেAggregation এর পরে
3G পার হওয়া request৭টা২টা (login আর home)
TLS handshake৭ বার১ বার
ফোনে আসা data১৮০ KB১৫ KB
Login থেকে home screenপ্রায় ৯ সেকেন্ডপ্রায় ২ সেকেন্ড

একটা service ধীর বা down হলে

ধরুন offer-service সেদিন down। আগে অ্যাপের পুরো home screen error দেখাতো। এখন gateway প্রতিটা ভেতরের call এ একটা timeout রাখে, ধরুন ৩০০ms (timeout কেন প্রতিটা call এ দরকার, সেশন ১২ তে দেখেছেন)। Offer এর উত্তর সময়মতো না এলে gateway বাকি ৫টা উত্তর দিয়েই screen পাঠিয়ে দেয়। Offer এর জায়গাটা শুধু ফাঁকা থাকে। Balance আর লেনদেন ঠিকই দেখা যায়।

এভাবে কম জরুরি অংশ বাদ দিয়ে বাকিটা দেখানোকে বলে graceful degradation। Service বারবার fail করলে তাকে কিছুক্ষণ call করাই বন্ধ রাখার কৌশল (circuit breaker) সেশন ২১ এ আসবে।

০৭ Mobile আর web এর দরকার আলাদা হলে কী করবো?

Aggregation এর সাফল্য দেখে web banking team ও gateway তে নিজেদের home endpoint চাইলো। কিন্তু তাদের দরকার একেবারে অন্য রকম। বড় screen এ তারা দেখায় শেষ ৫০টা লেনদেন, খরচের chart আর পুরো statement। মিতুর অ্যাপে দরকার শুধু শেষ ৫টা লেনদেন আর ছোট একটা balance card।

একটাই endpoint দিয়ে দুজনকে খুশি করতে গেলে code এ if (mobile) এর ছড়াছড়ি হয়। আর দুই team একই file নিয়ে প্রতি সপ্তাহে টানাটানি করে। মিতুর একটা ছোট বদলের জন্য web team এর review লাগে, web team এর deploy এ মিতুর অ্যাপ ভেঙে যায়।

সমাধান হলো BFF (Backend for Frontend)। প্রতিটা ধরনের client এর জন্য একটা করে নিজস্ব ছোট backend। Mobile এর জন্য একটা, web এর জন্য আরেকটা। যে team client বানায়, সেই team ই তার BFF এর মালিক।

CLIENT GATEWAY BFF SERVICES Mobile অ্যাপ ছোট screen, ধীর 3G Web banking বড় screen, broadband API Gateway TLS, JWT, rate limit: সবার জন্য একই /mobile/* /web/* Mobile BFF ৫টা txn, ছোট JSON: 15 KB মালিক: mobile team Web BFF ৫০টা txn + chart: 220 KB মালিক: web team profile accounts txn offers
Gateway এর সাধারণ কাজগুলো (TLS, JWT, rate limit) সবার জন্য একটাই থাকে। তার নিচে প্রতিটা ধরনের client এর জন্য একটা করে নিজস্ব backend: BFF। দুটো BFF একই service গুলো ডাকে (web এর পথ dashed), কিন্তু নিজের client এর মাপে উত্তর সাজায়। মিতুর team নিজেই Mobile BFF বদলাতে পারে, web team কে জিজ্ঞেস না করেই।

খেয়াল করুন, BFF আসলে aggregation ই করে। পার্থক্য হলো, প্রতিটা BFF শুধু একটা client এর কথা ভাবে। Mobile BFF জানে 3G ধীর, তাই সে ছোট উত্তর পাঠায়: ১৫ KB। Web BFF জানে broadband আছে, তাই সে chart এর data সহ ২২০ KB পাঠায়। সাধারণ কাজগুলো (TLS, JWT, rate limit) তখনো সবার জন্য একটাই gateway তে থাকে।

BFF এর downside ও আছে। দুটো BFF এ কিছু code দুইবার লেখা হয়। আর প্রতিটা screen এর জন্য একটা করে BFF বানালে সেটা আবার বিশৃঙ্খলা তৈরি করে। নিয়মটা হলো: একটা BFF প্রতিটা সত্যিকারের আলাদা অভিজ্ঞতার জন্য (mobile, web, হয়তো smartwatch), প্রতিটা screen এর জন্য নয়।

০৮ API gateway আর load balancer কি একই জিনিস?

না। দুটোই reverse proxy, আর দুটোই সামনে দাঁড়িয়ে request ভাগ করে দেয়। কিন্তু দুজন request এর ভেতরটা কতটা বোঝে, সেখানেই পার্থক্য।

Load balancerAPI gateway
মূল কাজএকই service এর কয়েকটা copy এর মধ্যে load ভাগ করাকোন request কোন service এ যাবে, তা ঠিক করা
কী দেখে সিদ্ধান্ত নেয়কোন server ফাঁকা, কোনটা সুস্থpath, header, token, client এর ধরন
User কে চেনে?নাহ্যাঁ, JWT থেকে
এর বাইরে কী করেhealth check, heartbeatJWT check, rate limit, aggregation, cache
কোথায় দেখেছেনসেশন ০২এই সেশন

সেশন ০২ এর load balancer কে পোস্ট অফিসের বাছাইকারীর মতো ভাবুন। সে দেখে কোন কর্মী ফাঁকা, আর চিঠিটা তার হাতে দেয়। চিঠির ভেতরে কী লেখা, সেটা পড়ে না। Gateway হলো ব্যাংকের reception desk। সে আপনার কাগজ পড়ে, ID দেখে, তারপর ঠিক counter এ পাঠায়।

বাস্তবে দুটো একসাথে থাকে। Gateway এর সামনে একটা load balancer থাকে, যেটা কয়েকটা gateway copy এর মধ্যে traffic ভাগ করে। আর gateway এর পেছনে প্রতিটা service এর কয়েকটা copy এর মধ্যেও load ভাগ হয়। পরের অংশের ছবিতে এটা দেখবো।

০৯ সব traffic gateway দিয়েই যায়। তাহলে gateway down হলে কী হবে?

ঠিক এই প্রশ্নটাই মিতুর team lead প্রথম meeting এ করেছিলেন। উত্তরটা অস্বস্তিকর। একটা মাত্র gateway থাকলে সেটা down হলে ব্যাংকের পুরো অ্যাপ বন্ধ। পেছনের ২০টা service সুস্থ থাকলেও কেউ তাদের কাছে পৌঁছাতে পারবে না। মানে gateway হয়ে যায় SPOF (single point of failure), যেটা সেশন ০১ এ দেখেছেন।

ভালো খবর হলো, সমাধানটা আপনার চেনা:

CLIENT LOAD BALANCER GATEWAY SERVICES customer customer customer LB-1 Active LB-2 Passive heartbeat Stateless Gateway 1 Zone A Gateway 2 down, বাদ গেছে Gateway 3 Zone C Services profile, accounts, cards, txn, notify, offers ...
সব traffic gateway দিয়ে যায়, তাই একটা মাত্র gateway থাকলে সেটাই SPOF। সমাধান সেশন ০২ এর পুরোনো কৌশল: কয়েকটা stateless copy, আলাদা zone এ, সামনে load balancer। Gateway 2 down হলে load balancer তাকে বাদ দেয় (dashed), আর বাকি দুটো সব request সামলায়।

Gateway কে হালকা রাখুন

সবচেয়ে বড় প্রলোভন হলো gateway তে business logic ঢোকানো। “Transfer এর সীমা ৫০,০০০ টাকা, এটা gateway তেই check করে ফেলি।” এভাবে একটা একটা করে নিয়ম ঢুকলে কিছুদিন পর সব team একই gateway তে code লেখে, একই দিনে deploy এর জন্য লাইনে দাঁড়ায়। সেশন ১১ তে যে monolith ভেঙে বেরিয়ে এসেছিলেন, সেটাই gateway এর ভেতরে নতুন করে জন্ম নেয়।

Gateway তে রাখুন শুধু সেই কাজ, যা সবার জন্য একই: routing, TLS, JWT check, rate limit, cache। ব্যাংকের নিয়ম থাকুক service এর ভেতরে।

API gateway আপনাকে কী দেয়

  • একটাই ঠিকানা: client শুধু gateway কে চেনে। পেছনের service বদলালেও অ্যাপ update করতে হয় না।
  • এক জায়গায় পাহারা: JWT check, TLS আর rate limit একবার লেখা হয়, সব service এর জন্য।
  • কম round trip: request aggregation এ ৭টা call একটা হয়ে যায়; ধীর network এ এটাই সবচেয়ে বড় লাভ।
  • ছোট attack surface: internet থেকে শুধু gateway দেখা যায়, service গুলো private network এ থাকে।

Downside গুলো

  • বাড়তি একটা hop: প্রতিটা request এ কয়েক millisecond যোগ হয়।
  • SPOF এর ঝুঁকি: gateway down মানে পুরো অ্যাপ বন্ধ, তাই একাধিক copy চালাতেই হয়।
  • একটা ভুল config সবাইকে ভোগায়: একটা ভুল route rule এক মুহূর্তে সব service এর পথ বন্ধ করে দিতে পারে।
  • মোটা হয়ে যাওয়ার লোভ: business logic ঢুকতে থাকলে gateway একটা নতুন monolith হয়ে যায়।

তিন মাস পর মিতু আবার 3G তে login করে দেখলো। Home screen এলো প্রায় ২ সেকেন্ডে। রংপুরের সেই দোকানদার review টা বদলে চার তারা দিয়েছেন। আর audit team এর ticket বন্ধ হয়েছে একটা লাইনের উত্তরে: “Token check এখন একটাই জায়গায় হয়।“

১০ মগজে প্রেশার দিন

আগে নিজে ভাবুন। তারপর দেখুন: সবাই যেভাবে ভাবে, সেটা কোথায় অসম্পূর্ণ, আর আসল কথাটা কোথায়।

প্রশ্ন ১: Gateway তো JWT check করেই দিচ্ছে। তাহলে account-service এ আর কোনো check এর দরকার নেই, তাই না?
উত্তর দেখুন আগে নিজে ভাবুন

সবাই যেভাবে ভাবে

“ঠিক। Token যাচাই হয়ে গেছে, customer কে সেটা জানা গেছে। Service শুধু X-User-Id header পড়ে কাজ করবে। এজন্যই তো gateway বসানো।”

অর্ধেকটা ঠিক। কিন্তু বাকি অর্ধেকটা বাদ পড়লে ব্যাংকের টাকা ঝুঁকিতে পড়ে।

যে জায়গাটা যোগ করা দরকার

Gateway শুধু বলে, “এই request টা u_48213 পাঠিয়েছে।” কিন্তু u_48213 যদি /accounts/77031/balance চায়, আর account 77031 অন্য কারো হয়? Gateway সেটা জানে না, কারণ কোন account কার, সেটা account-service এর database এ থাকে। তাই মালিকানার check (authorization) service কেই করতে হয়। না করলে একজন customer শুধু URL এর সংখ্যা বদলে অন্যের balance দেখে ফেলবেন। এই ভুলটা বাস্তবে এত বেশি হয় যে এর একটা নামও আছে: IDOR (Insecure Direct Object Reference)।

আরেকটা কথা। Service গুলো X-User-Id কে বিশ্বাস করে, কারণ শুধু gateway তাদের কাছে পৌঁছাতে পারে। তাই network এমনভাবে বানাতে হয়, যাতে বাইরের কেউ gateway কে পাশ কাটিয়ে সরাসরি service এ ঢুকতে না পারে।

সঠিক ভাষায়

Gateway করে authentication (আপনি কে)। Service করে authorization (এই জিনিসটা কি আপনার)। ভুল token এর উত্তর 401 Unauthorized, আর ঠিক token কিন্তু অনুমতি নেই, তার উত্তর 403 Forbidden।

প্রশ্ন ২: Interview তে প্রশ্ন এলো: আমাদের তো load balancer আছেই, আলাদা API gateway কেন লাগবে?
উত্তর দেখুন আগে নিজে ভাবুন

সবাই যেভাবে ভাবে

“Gateway ও load balance করে, সাথে আরো কিছু feature দেয়। তাই gateway হলো একটা উন্নত load balancer।”

কথাটা পুরো ভুল নয়, কিন্তু interviewer এখানে আরো গভীর উত্তর আশা করেন।

যে জায়গাটা যোগ করা দরকার

দুজনের কাজের স্তর আলাদা। Load balancer একই service এর কয়েকটা একরকম copy এর মধ্যে traffic ভাগ করে। সে user চেনে না, API বোঝে না। Gateway অনেকগুলো আলাদা service এর সামনে বসে। সে path, token আর client এর ধরন বুঝে request কে ঠিক জায়গায় পাঠায়, আর সবার হয়ে পাহারা দেয়।

সবচেয়ে ভালো উত্তর হলো একটা ছবি আঁকা: load balancer, তার পেছনে কয়েকটা gateway, তার পেছনে service গুলো। তারপর বলা, “এরা একে অপরের বদলে নয়, একসাথে কাজ করে। Load balancer gateway কে SPOF হওয়া থেকে বাঁচায়।”

মনে রাখার সহজ উপায়

Load balancer প্রশ্ন করে: “কোন copy ফাঁকা?” Gateway প্রশ্ন করে: “এটা কে, কী চায়, আর কোথায় যাবে?”

প্রশ্ন ৩: সব request তো gateway দিয়েই যায়। তাহলে transfer এর সীমা, offer এর নিয়ম, এসব business rule ও gateway তে রাখলে service গুলো হালকা হয়ে যায় না?
উত্তর দেখুন আগে নিজে ভাবুন

সবাই যেভাবে ভাবে

“হ্যাঁ। এক জায়গায় সব নিয়ম থাকলে খুঁজে পাওয়া সহজ। আর service গুলোকে কম কাজ করতে হয়।”

শুনতে গোছানো লাগে। কিন্তু ছয় মাস পরের ছবিটা ভাবুন।

যে জায়গাটা যোগ করা দরকার

Gateway সব team এর shared জিনিস। Business rule ঢুকলে transfer team, card team, offer team সবাইকে একই gateway তে code লিখতে হয়। একটা team এর ভুল deploy সব team এর traffic বন্ধ করে দেয়। নিয়ম বদলাতে gateway team এর অনুমতি লাগে। মানে সেশন ১১ তে যে সমস্যা থেকে বাঁচতে microservice এ গিয়েছিলেন, সেটা gateway এর ভেতরে ফিরে আসে।

তাছাড়া gateway যত ভারী হয়, প্রতিটা request এর জন্য তত বেশি সময় নেয়। আর gateway down হলে সব বন্ধ, তাই এটা যত সহজ থাকে, তত কম ভাঙে।

মূল নিয়ম

Gateway তে যায় শুধু সেই কাজ, যা সব service এর জন্য একই: routing, TLS, JWT check, rate limit, cache। যে নিয়ম একটা service এর নিজের ব্যবসার, সেটা সেই service এর ভেতরেই থাকে।

১১ যে টার্মগুলো শিখলাম

টার্মমানে
API gatewayসব service এর সামনে বসা একটাই দরজা। Client এর সব request এখানে আসে, আর এখান থেকে ঠিক service এ যায়।
Reverse proxyযে server অন্য server গুলোর সামনে দাঁড়ায়, request নিয়ে পেছনে পাঠায়, আর উত্তর ফেরত আনে। Client পেছনের server দেখে না।
RoutingRequest এর path বা header দেখে ঠিক করা, সেটা কোন service এ যাবে।
RTT (round trip time)একটা message গিয়ে উত্তর ফিরে আসতে যে সময় লাগে। 3G তে প্রায় ৩০০ms।
Authenticationআপনি কে, সেটা যাচাই করা।
Authorizationআপনি এই কাজটা করার অনুমতি পান কিনা, সেটা যাচাই করা।
JWT (JSON Web Token)Sign করা একটা token, যার ভেতরে customer এর পরিচয় আর মেয়াদ লেখা থাকে। Signature মিলিয়ে কাউকে জিজ্ঞেস না করেই যাচাই করা যায়।
Refresh tokenলম্বা মেয়াদের একটা token, যেটা দিয়ে ছোট মেয়াদের JWT শেষ হলে নতুন JWT নেওয়া হয়।
TLSযে ব্যবস্থা পথে data encrypted রাখে। HTTPS এর “S”।
TLS terminationযে জায়গায় encrypted request খোলা হয়। সাধারণত gateway তে।
mTLS (mutual TLS)দুই পক্ষই নিজের certificate দেখিয়ে encrypted connection বানায়। ভেতরের service দের মধ্যে ব্যবহার হয়।
Cross-cutting concernযে কাজ প্রতিটা service কে একই ভাবে করতে হয়, যেমন token check বা rate limit।
Rate limitingএকজন client নির্দিষ্ট সময়ে কতগুলো request পাঠাতে পারবে, তার সীমা। সীমা পার হলে 429 ফেরত যায়।
Response cachingসবার জন্য একই এমন উত্তর কিছু সময়ের জন্য gateway তে রেখে দেওয়া।
Request aggregationClient এর একটা request এর জন্য gateway ভেতরে কয়েকটা service কে call করে, আর উত্তরগুলো জোড়া লাগিয়ে একটা উত্তর দেয়।
Graceful degradationএকটা অংশ fail করলে পুরোটা বন্ধ না করে বাকি অংশ দিয়ে কাজ চালিয়ে যাওয়া।
BFF (Backend for Frontend)প্রতিটা ধরনের client (mobile, web) এর জন্য আলাদা একটা ছোট backend, যেটা সেই client এর মাপে উত্তর সাজায়।
IDORID বদলে অন্যের data দেখে ফেলার ভুল, যেটা service এ authorization check না থাকলে হয়।

১২ শর্ট সামারি

  1. Client সরাসরি অনেক service কে call করলে ধীর network এ প্রতিটা call এর handshake আর round trip যোগ হতে থাকে, প্রতিটা service নিজের মতো পাহারা দেয়, আর client কে পেছনের পুরো নকশা জানতে হয়। API gateway সব request এর জন্য একটাই দরজা হয়ে এই সমস্যাগুলো এক জায়গায় সামলায়।
  2. Gateway path দেখে routing করে, TLS termination করে, JWT একবার যাচাই করে, rate limit বসায়, আর সবার জন্য একই উত্তর cache করে। তবে authorization, মানে “এই জিনিস কি আপনার”, সেটা service কেই করতে হয়।
  3. Request aggregation এ client একটা request পাঠায়, আর gateway ভেতরের দ্রুত network এ কয়েকটা service কে একসাথে call করে। Mobile আর web এর দরকার আলাদা হলে প্রতিটার জন্য একটা BFF বানানো হয়।
  4. Load balancer একই service এর copy গুলোর মধ্যে load ভাগ করে, আর gateway API বুঝে request কে ঠিক service এ পাঠায়; দুটো একসাথে কাজ করে। সব traffic gateway দিয়ে যায় বলে কয়েকটা stateless copy আলাদা zone এ চালাতে হয়, আর gateway কে business logic থেকে দূরে রাখতে হয়।

১৩ মনে রাখুন