API Architecture

তুমি যখন স্কেলেবল সফটওয়্যার, ডিস্ট্রিবিউটেড সিস্টেম বা মাইক্রোসার্ভিস আর্কিটেকচার নিয়ে কাজ করো, তখন ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা আদান-প্রদানের সঠিক রূপরেখা নির্ধারণ করা অত্যন্ত গুরুত্বপূর্ণ। REST, GraphQL, gRPC বা WebSockets—এই নামগুলো বারবার সামনে আসে। একজন দক্ষ সফটওয়্যার ইঞ্জিনিয়ার হিসেবে তোমাকে বুঝতে হবে, প্রজেক্টের রিকোয়ারমেন্ট অনুযায়ী কোন টুলটি কখন ব্যবহার করা উচিত।

সহজভাবে বললে, API Architecture হলো সেই নিয়ম এবং কাঠামোর ব্লুপ্রিন্ট, যা নির্ধারণ করে:

  • ডেটা কোন ফরম্যাটে আদান-প্রদান হবে (JSON, XML, Protocol Buffers)।

  • কোন প্রোটোকল ব্যবহার করা হবে (HTTP/1.1, HTTP/2, TCP, WebSocket)।

  • ক্লায়েন্টের ডেটার ওপর কতটা নিয়ন্ত্রণ থাকবে।

  • সিস্টেমের স্পিড, সিকিউরিটি এবং স্কেলেবিলিটি কেমন হবে।

চলো, আধুনিক সফটওয়্যার ইঞ্জিনিয়ারিংয়ের সবচেয়ে গুরুত্বপূর্ণ ৬টি API আর্কিটেকচার নিয়ে গভীরভাবে আলোচনা করি।

1. REST (Representational State Transfer)

REST হলো বর্তমান ওয়েবের সবচেয়ে জনপ্রিয় এবং বহুল ব্যবহৃত আর্কিটেকচারাল স্টাইল। এটি মূলত HTTP প্রোটোকলের স্ট্যান্ডার্ড মেথড (GET, POST, PUT, DELETE, PATCH) ব্যবহার করে রিসোর্স-ভিত্তিক (Resource-based) কমিউনিকেশন করে।

ডিপ ডাইভ (মিসিং কনসেপ্ট): REST-এর একটি প্রধান শর্ত হলো এটি Stateless। অর্থাৎ, সার্ভার ক্লায়েন্টের আগের কোনো রিকোয়েস্টের তথ্য মনে রাখে না। প্রতিটি রিকোয়েস্টকে সম্পূর্ণ স্বাধীন হতে হয়। এছাড়াও, অ্যাডভান্সড REST এপিআইগুলো HATEOAS (Hypermedia as the Engine of Application State) মেনে চলে, যেখানে রেসপন্সের সাথেই পরবর্তী অ্যাকশনের লিংক দেওয়া থাকে।

কখন ব্যবহার করবে?

  • স্ট্যান্ডার্ড ওয়েব বা মোবাইল অ্যাপ্লিকেশনের CRUD (Create, Read, Update, Delete) অপারেশনের জন্য।

  • পাবলিক এপিআই (Public API) বানাতে।

Java (Spring Boot) Code Example:

@RestController
@RequestMapping("/api/users")
public class UserController {

    @GetMapping("/{id}")
    public ResponseEntity<User> getUserById(@PathVariable String id) {
        // Fetch user logic here
        User user = new User(id, "Farjanul Nayem", "backend-engineer");
        return ResponseEntity.ok(user);
    }
}

2. SOAP (Simple Object Access Protocol)

SOAP কোনো আর্কিটেকচারাল স্টাইল নয়, এটি একটি প্রোটোকল। এটি অত্যন্ত ফর্মাল এবং সম্পূর্ণ XML-ভিত্তিক।

ডিপ ডাইভ (মিসিং কনসেপ্ট): SOAP এপিআই কাজ করে WSDL (Web Services Description Language) ফাইলের ওপর ভিত্তি করে। এটি হলো এপিআইয়ের একটি কঠোর চুক্তি বা কন্ট্রাক্ট।

কখন ব্যবহার করবে?

  • ব্যাংকিং, ফাইন্যান্স বা পেমেন্ট গেটওয়ের মতো এন্টারপ্রাইজ লেভেলের অ্যাপ্লিকেশনে।

  • যেখানে এসিড কমপ্লায়েন্স (ACID compliance) এবং WS-Security (বিল্ট-ইন সিকিউরিটি স্ট্যান্ডার্ড) অপরিহার্য।

3. GraphQL: ক্লায়েন্টের হাতে সম্পূর্ণ নিয়ন্ত্রণ

REST-এর সবচেয়ে বড় সমস্যা হলো Over-fetching (প্রয়োজনের চেয়ে বেশি ডেটা আসা) এবং Under-fetching (একটি পেজ লোড করতে একাধিক এপিআই কল করা)। ফেসবুকের তৈরি করা GraphQL এই সমস্যার চমৎকার সমাধান দেয়। এখানে একটিমাত্র এন্ডপয়েন্ট (সাধারণত /graphql) থাকে এবং ক্লায়েন্ট ঠিক করে দেয় তার কোন কোন ফিল্ডগুলো দরকার।

কখন ব্যবহার করবে?

  • যখন ফ্রন্টএন্ড বা মোবাইল অ্যাপকে অত্যন্ত ফ্লেক্সিবল করতে হয়।

  • ব্যান্ডউইথ বাঁচানোর জন্য যখন শুধুমাত্র নির্দিষ্ট কিছু ডেটার প্রয়োজন হয়।

Python Code Example (GraphQL Query Structure):

# The client sends exactly what it needs
graphql_query = """
query {
  user(id: "123") {
    name
    email
    posts {
      title
    }
  }
}
"""

# The server returns exactly those fields, nothing more.

4. gRPC (Google Remote Procedure Call): মাইক্রোসার্ভিসের পাওয়ারহাউস

তুমি যখন মাইক্রোসার্ভিস আর্কিটেকচার নিয়ে কাজ করো—ধরো, একটি Python (FastAPI/Django) এআই সার্ভিস তোমার একটি Java (Spring Boot) ব্যাকএন্ডের সাথে কথা বলছে—তখন REST অনেক স্লো মনে হতে পারে। ঠিক এখানেই gRPC সুপারফাস্ট পারফরম্যান্স দেয়।

ডিপ ডাইভ (মিসিং কনসেপ্ট): gRPC সাধারণ JSON-এর বদলে Protocol Buffers (Protobuf) ব্যবহার করে ডেটাকে বাইনারি (Binary) ফরম্যাটে কনভার্ট করে পাঠায়। এটি HTTP/2 প্রোটোকলের ওপর চলে, যার কারণে এটি মাল্টিপ্লেক্সিং (Multiplexing) এবং বাই-ডিরেকশনাল স্ট্রিমিং সাপোর্ট করে।

কখন ব্যবহার করবে?

  • মাইক্রোসার্ভিসগুলোর মধ্যে ইন্টারনাল কমিউনিকেশনের (Internal Communication) জন্য।

  • যেখানে লো-ল্যাটেন্সি (Low latency) এবং হাই পারফরম্যান্স দরকার।

Python/Protobuf Code Example:

// user_service.proto (The Contract)
syntax = "proto3";

service UserService {
  rpc GetUser (UserRequest) returns (UserResponse);
}

message UserRequest {
  string user_id = 1;
}

message UserResponse {
  string name = 1;
  string expertise = 2;
}

5. WebSockets: রিয়েল-টাইম যোগাযোগের রাজা

REST বা GraphQL সাধারণত ক্লায়েন্টের রিকোয়েস্টের ওপর ভিত্তি করে কাজ করে। কিন্তু তুমি যদি রিয়েল-টাইম চ্যাট অ্যাপ্লিকেশন বা গেমিং প্ল্যাটফর্ম তৈরি করো, তবে বারবার রিকোয়েস্ট পাঠানো সম্ভব নয়। WebSocket হলো ফুল-ডুপ্লেক্স (Full-duplex) কানেকশন, যেখানে ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি ডেডিকেটেড চ্যানেল ওপেন থাকে এবং উভয় পক্ষ যেকোনো সময় ডেটা আদান-প্রদান করতে পারে।

কখন ব্যবহার করবে?

  • লাইভ চ্যাট, মাল্টিপ্লেয়ার গেমিং, এবং রিয়েল-টাইম স্টক আপডেটের জন্য।

6. Server-Sent Events (SSE): ওয়ান-ওয়ে রিয়েল-টাইম ডেটা

SSE হলো একটি একমুখী (Unidirectional) কমিউনিকেশন প্রোটোকল। এখানে ক্লায়েন্ট শুধু একবার কানেকশন ওপেন করে রাখে, আর সার্ভার একটানা ডেটা পাঠাতে থাকে। এটি সাধারণ HTTP প্রোটোকলের ওপরই কাজ করে।

ডিপ ডাইভ (মিসিং কনসেপ্ট): তুমি যখন লার্জ ল্যাঙ্গুয়েজ মডেল (LLMs) বা RAG পাইপলাইন নিয়ে কাজ করো, তখন এআই-এর জেনারেট করা রেসপন্সগুলো টোকেন-বাই-টোকেন (Token-by-token) ফ্রন্টএন্ডে স্ট্রিম করার জন্য (ঠিক যেমনটা ChatGPT করে) SSE হলো সবচেয়ে নিখুঁত এবং লাইটওয়েট সমাধান।

কখন ব্যবহার করবে?

  • এআই মডেলের রেসপন্স স্ট্রিমিং (LLM Token Streaming)।

  • লাইভ নিউজ ফিড বা রিয়েল-টাইম ড্যাশবোর্ড আপডেট।

সঠিক আর্কিটেকচার কীভাবে বেছে নেবে?

  • REST: এটি হলো অলরাউন্ডার। সাধারণ ওয়েব অ্যাপ বা পাবলিক এপিআইয়ের জন্য এটি সেরা।

  • GraphQL: ডেটা ফেচিংকে ফ্লেক্সিবল করতে এবং ওভার-ফেচিং এড়াতে।

  • gRPC: ডিস্ট্রিবিউটেড সিস্টেম বা মাইক্রোসার্ভিসের ইন্টারনাল হাই-স্পিড কমিউনিকেশনের জন্য।

  • WebSocket: বাই-ডিরেকশনাল রিয়েল-টাইম চ্যাট বা ইন্টারঅ্যাকটিভ অ্যাপের জন্য।

  • SSE: সার্ভার থেকে একমুখী কন্টিনিউয়াস ডেটা বা এআই টোকেন স্ট্রিমিংয়ের জন্য।

  • SOAP: হাইলি সিকিউরড লিগ্যাসি বা ব্যাংকিং সিস্টেমের জন্য।

একজন সিনিয়র ইঞ্জিনিয়ার কখনোই সব জায়গায় একটিমাত্র আর্কিটেকচার ব্যবহার করেন না। সিস্টেমের প্রকৃতি, স্কেলিং রিকোয়ারমেন্ট এবং ইউজকেস বিশ্লেষণ করে সঠিক টুলটি বেছে নেওয়াই হলো প্রকৃত সিস্টেম ডিজাইনের সৌন্দর্য।