মোবাইল অ্যাপ্লিকেশনের জন্য মিডলওয়্যার — মৌলিক বিষয়, আর্কিটেকচার এবং ব্যবহার

লেখক: IT Sectr প্রকাশিত: 2026-03-09 পড়ার সময়: 8 মিনিট

মিডলওয়্যার হল একটি মধ্যবর্তী সফ্টওয়্যার স্তর যা অ্যাপ্লিকেশনের মূল লজিকের আগে বা পরে ডেটা প্রসেস করে, ক্রস-কাটিং উদ্বেগগুলিকে বিজনেস কোড থেকে আলাদা করে। Redux (2026) অনুসারে, মিডলওয়্যার কেন্দ্রীভূত প্রক্রিয়াকরণের মাধ্যমে লগিং এবং প্রমাণীকরণ কোডের পুনরাবৃত্তি 40% হ্রাস করে। Redux মিডলওয়্যার একটি ক্লাসিক উদাহরণ, কিন্তু প্যাটার্নটি আরও ব্যাপকভাবে ব্যবহৃত হয়: Ktor Client, Bloc, Express.js এবং Dio।

মূল বিষয়

  • মিডলওয়্যার ডেটা উৎস এবং বিজনেস লজিকের মধ্যে একটি স্তর, যা ক্রস-কাটিং উদ্বেগগুলিকে আলাদা করে।
  • Redux মিডলওয়্যার dispatch-কে ইন্টারসেপ্ট করে এবং reducer-এর আগে বা পরে action-কে পরিবর্তন করে।
  • Bloc লগিং এবং অ্যানালিটিক্সের জন্য BlocObserver-এর মাধ্যমে মিডলওয়্যার ব্যবহার করে।
  • Ktor Client Logging এবং Auth প্লাগইন সহ pipeline-ভিত্তিক HTTP-মিডলওয়্যার তৈরি করে।
  • Dio Interceptor Flutter-এ HTTP অনুরোধের জন্য ইন্টারসেপ্টরের চেইন সহ মিডলওয়্যার।

মিডলওয়্যার কী?

মিডলওয়্যার হল একটি সফ্টওয়্যার স্তর যা দুটি সিস্টেম কম্পোনেন্টের মধ্যে অবস্থিত, ডেটা ইন্টারসেপ্ট এবং প্রসেস করে এবং লক্ষ্য কম্পোনেন্টে পাঠানোর আগে প্রক্রিয়া করে। মোবাইল ডেভেলপমেন্টে, মিডলওয়্যার তিনটি প্রধান প্রসঙ্গে ব্যবহৃত হয়: স্টেট ম্যানেজমেন্ট (Redux, Bloc), HTTP যোগাযোগ (Ktor Client, Dio) এবং ইভেন্ট হ্যান্ডলিং (EventBus, NotificationCenter)। মূল মূল্য হল অ্যাপ্লিকেশনের ডোমেন লজিক থেকে ক্রস-কাটিং উদ্বেগের বিচ্ছিন্নতা (লগিং, প্রমাণীকরণ, অ্যানালিটিক্স)। প্রতিটি স্ক্রিনে অ্যানালিটিক্স কল যোগ করার পরিবর্তে, মিডলওয়্যার এটি কেন্দ্রীয়ভাবে করে।

Pipe and Filter আর্কিটেকচার

মিডলওয়্যার Pipe and Filter প্যাটার্ন বাস্তবায়ন করে: প্রতিটি মিডলওয়্যার কম্পোনেন্ট ডেটা গ্রহণ করে, তা প্রসেস করে এবং চেইনের পরবর্তী লিঙ্কে পাঠায়। মিডলওয়্যার সংযোগের ক্রম প্রক্রিয়াকরণের ক্রম নির্ধারণ করে — প্রথম মিডলওয়্যার কাঁচা ডেটা গ্রহণ করে, শেষটি তা লক্ষ্য হ্যান্ডলারে পাঠায়। JetBrains (2026) অনুসারে, এই আর্কিটেকচার বিদ্যমান কোড পরিবর্তন না করেই মিডলওয়্যার যোগ বা অপসারণের অনুমতি দেয়, যা পরীক্ষা এবং পরীক্ষামূলক মডিউলের A/B পরীক্ষা সহজ করে।

Interceptor-এর থেকে পার্থক্য

মিডলওয়্যার একটি সাধারণ প্যাটার্ন, Interceptor হল HTTP-এর জন্য এর বিশেষ ক্ষেত্র। মিডলওয়্যার যেকোনো ডেটা ফ্লোর সাথে কাজ করে: Redux-এ actions, Bloc-এ ইভেন্ট, Ktor-এ HTTP অনুরোধ। Interceptor সর্বদা নেটওয়ার্ক স্তরের সাথে আবদ্ধ এবং শুধুমাত্র Request/Response নিয়ে কাজ করে। এই পার্থক্য বোঝা সঠিক অ্যাবস্ট্রাকশন চয়ন করতে সহায়তা করে: ব্যবহারকারীর ক্রিয়া লগ করার জন্য — মিডলওয়্যার, হেডার যোগ করার জন্য — Interceptor। বড় প্রজেক্টে, উভয় প্যাটার্ন প্রায়ই সহাবস্থান করে: মিডলওয়্যার স্টেট পরিচালনা করে, Interceptor HTTP যোগাযোগ পরিচালনা করে।

স্টেট ম্যানেজমেন্টে মিডলওয়্যার

Redux মিডলওয়্যার reducer-এ পৌঁছানোর আগে প্রতিটি dispatch action-কে ইন্টারসেপ্ট করে। এটি actions লগ করা, Redux Thunk বা Redux Saga-এর মাধ্যমে অ্যাসিঙ্ক্রোনাস অনুরোধ করা, action পরিবর্তন করা বা শর্তসাপেক্ষে বাতিল করার অনুমতি দেয়। প্রতিটি মিডলওয়্যার store (স্টেটে অ্যাক্সেস), next (পরবর্তী মিডলওয়্যার বা reducer-এর রেফারেন্স) এবং action গ্রহণ করে, এবং সিদ্ধান্ত নেয় কী করতে হবে: action পাস করা, পরিবর্তন করা বা ব্লক করা।

dart
Middleware<AppState> analyticsMiddleware = (store, action, NextDispatcher next) {
    if (action is NavigationAction) {
        Analytics.logEvent(action.screenName);
    }
    return next(action);
};

final store = Store<AppState>>(
    reducer,
    initialState,
    middleware: [analyticsMiddleware]
);

Flutter Redux-এর জন্য Dart-এ analyticsMiddleware-এর উদাহরণ। মিডলওয়্যার সমস্ত NavigationAction ইন্টারসেপ্ট করে, স্ক্রিনের নাম অ্যানালিটিক্স সিস্টেমে লগ করে এবং চেইন চালিয়ে যেতে next(action) কল করে। যদি next কল না করা হয়, তাহলে action reducer-এ পৌঁছাবে না — এইভাবে শর্তসাপেক্ষ নেভিগেশন বা অবাঞ্ছিত actions ব্লক করা সম্ভব। অ্যারেতে মিডলওয়্যারের ক্রম প্রক্রিয়াকরণের ক্রম নির্ধারণ করে।

অ্যাসিঙ্ক্রোনাস মিডলওয়্যার: Thunk এবং Saga

Redux Thunk একটি মিডলওয়্যার যা শুধু action অবজেক্ট নয়, ফাংশনও dispatch করার অনুমতি দেয়। ফাংশন dispatch এবং getState গ্রহণ করে, অ্যাসিঙ্ক্রোনাস অপারেশন (HTTP ক্লায়েন্টের মাধ্যমে API অনুরোধ, DB থেকে পড়া) করতে পারে এবং সম্পন্ন হলে সাধারণ actions dispatch করতে পারে। Redux অ্যাপ্লিকেশনে নেটওয়ার্ক অনুরোধের জন্য এটি মানক পদ্ধতি। Redux Saga আরও জটিল পরিস্থিতির জন্য জেনারেটর (yield) ব্যবহার করে: অনুরোধ বাতিল, রেস কন্ডিশন, সমান্তরাল অপারেশন এবং ব্যবহারকারী ইনপুট ডিবাউন্স। Redux Saga (2026) অনুসারে, Saga করুটিনগুলি নেস্টেড Thunk কলব্যাকের তুলনায় পরীক্ষা এবং ডিবাগ করা সহজ।

HTTP ক্লায়েন্টে মিডলওয়্যার

Ktor Client JetBrains দ্বারা pipeline মিডলওয়্যারের উপর ভিত্তি করে HTTP প্রক্রিয়াকরণ তৈরি করে। অনুরোধের প্রতিটি ধাপ — সংযোগ সেটআপ, হেডার পাঠানো, প্রতিক্রিয়া পড়া — pipeline-এ একটি পৃথক পর্যায় দ্বারা উপস্থাপিত হয়। ডেভেলপার client.install { }-এর মাধ্যমে প্লাগইন (মিডলওয়্যার) ইনস্টল করে, একটি প্রক্রিয়াকরণ চেইন প্রাপ্ত করে। ইনস্টলেশনের ক্রম নির্ধারণ করে কোন মিডলওয়্যার প্রথমে ডেটা প্রসেস করে: Logging, Auth, ContentNegotiation, Caching।

kotlin
val client = HttpClient {
    install(Logging) {
        level = LogLevel.BODY
    }
    install(Auth) {
        bearer {
            loadTokens { BearerTokens("access", "refresh") }
        }
    }
    install(ContentNegotiation) {
        json(Json { ignoreUnknownKeys = true })
    }
    install(HttpTimeout) {
        requestTimeoutMillis = 15000
    }
}

ইনস্টল করা মিডলওয়্যার প্লাগইন সহ Ktor Client-এর কনফিগারেশন। Logging — অনুরোধ এবং প্রতিক্রিয়া বডি লেখে। Auth — রিফ্রেশ সমর্থন সহ স্বয়ংক্রিয়ভাবে Bearer টোকেন যোগ করে। ContentNegotiation — JSON সিরিয়ালাইজ/ডিসিরিয়ালাইজ করে। HttpTimeout — টাইমআউট সেট করে। প্রতিটি প্লাগইন স্বাধীন: পরীক্ষার পরিবেশে অনুরোধ কোড পরিবর্তন না করেই ক্লায়েন্ট কনফিগারেশন প্রতিস্থাপন করে Auth নিষ্ক্রিয় করা যেতে পারে।

Flutter-এ Dio Interceptor

Dio Flutter-এর জন্য একটি জনপ্রিয় HTTP ক্লায়েন্ট, যা Interceptor-কে মিডলওয়্যার হিসেবে ব্যবহার করে। Interceptor পাঠানোর আগে RequestOptions এবং প্রাপ্তির পরে Response-কে ইন্টারসেপ্ট করে, একাধিক ইন্টারসেপ্টরের চেইন সমর্থন করে। Dio Interceptor Dart/Flutter-এর জন্য OkHttp Interceptor-এর অনুরূপ। Dio (2026) অনুসারে, RetryInterceptor এবং LogInterceptor Flutter প্রজেক্টে সবচেয়ে বেশি ব্যবহৃত মিডলওয়্যার।

Bloc আর্কিটেকচারে মিডলওয়্যার

Bloc-এ পৃথক কম্পোনেন্ট হিসেবে বিল্ট-ইন মিডলওয়্যার নেই, কিন্তু প্যাটার্নটি BlocObserver-এর মাধ্যমে বাস্তবায়িত হয় — একটি বৈশ্বিক পর্যবেক্ষক যা অ্যাপ্লিকেশনের প্রতিটি ব্লক থেকে ইভেন্ট গ্রহণ করে। BlocObserver.onEvent প্রতিটি ইভেন্ট প্রক্রিয়াকরণের আগে কল করা হয়, onTransition প্রতিটি স্টেট ট্রানজিশনে, onError প্রতিটি এক্সেপশনে। এটি অ্যানালিটিক্স, লগিং, ক্র্যাশ রিপোর্টিং এবং পারফরম্যান্স মনিটরিংয়ের জন্য একটি পূর্ণাঙ্গ মিডলওয়্যার।

dart
class AppBlocObserver extends BlocObserver {
    @override
    void onEvent(Bloc bloc, Object? event) {
        Crashlytics.log("${bloc.runtimeType}: $event");
        super.onEvent(bloc, event);
    }

    @override
    void onTransition(Bloc bloc, Transition transition) {
        Analytics.log(transition.eventName());
        super.onTransition(bloc, transition);
    }

    @override
    void onError(Bloc bloc, Object error, StackTrace stackTrace) {
        Crashlytics.recordError(error, stackTrace);
        super.onError(bloc, error, stackTrace);
    }
}

BlocOverrides.runZoned(() {
    runApp(MyApp());
}, blocObserver: AppBlocObserver());

Dart-এ Bloc-এর জন্য AppBlocObserver-এর উদাহরণ। onEvent প্রতিটি ইভেন্ট Crashlytics-এ লগ করে, onTransition ইভেন্ট অ্যানালিটিক্সে পাঠায়, onError এক্সেপশন ক্র্যাশ রিপোর্টিং-এ লেখে। BlocOverrides.runZoned-এর মাধ্যমে সংযোগ পর্যবেক্ষককে তাদের কোড পরিবর্তন না করেই সমস্ত ব্লকের জন্য বৈশ্বিক করে তোলে। পরীক্ষায় নিষ্ক্রিয় করতে, কেবল একটি খালি পর্যবেক্ষক পাস করুন বা BlocOverrides ওভাররাইড করবেন না।

কখন এবং কীভাবে মিডলওয়্যার ব্যবহার করবেন

মিডলওয়্যার কার্যকর সেই কাজগুলির জন্য যা অনেক কম্পোনেন্টকে প্রভাবিত করে: লগিং, প্রমাণীকরণ, অ্যানালিটিক্স, ক্যাশিং, পারফরম্যান্স মনিটরিং। মিডলওয়্যার ব্যবহার করুন যখন একই লজিক অ্যাপ্লিকেশনের বিভিন্ন অংশে পুনরাবৃত্তি হয় — প্রতিটি অনুরোধে টোকেন যোগ করা, প্রতিটি ব্যবহারকারীর ক্রিয়া লগ করা, প্রতিটি স্ক্রিন ট্রানজিশনের অ্যানালিটিক্স। Dio (2026) অনুসারে, মিডলওয়্যারের মাধ্যমে কেন্দ্রীভূত প্রক্রিয়াকরণ প্রতিটি কম্পোনেন্টে আলাদাভাবে কোড নকল করার তুলনায় বাগ 25% হ্রাস করে।

  • অতিরিক্ত ব্যবহার করবেন না — অত্যধিক মিডলওয়্যার ডিবাগিং জটিল করে এবং অতিরিক্ত কলের কারণে কর্মক্ষমতা হ্রাস করে
  • ক্রম গুরুত্বপূর্ণ — প্রথম মিডলওয়্যার ডেটা মূল আকারে গ্রহণ করে, শেষটি সমস্ত পরিবর্তনের পরে
  • অ্যাসিঙ্ক্রোনাস অপারেশন — প্রধান UI থ্রেড ব্লক না করে ভারী কল অ্যাসিঙ্ক্রোনাস মিডলওয়্যারে স্থানান্তর করুন
  • পরীক্ষাযোগ্যতা — প্রতিটি মিডলওয়্যার mock পরিবেশের মাধ্যমে পৃথকভাবে পরীক্ষা করা উচিত
  • চেইন ডকুমেন্ট করুন — প্রকল্পে কোন মিডলওয়্যার এবং কোন ক্রমে সংযুক্ত তা স্পষ্টভাবে বর্ণনা করুন

মিডলওয়্যার ব্যবহারে সাধারণ ভুল

সবচেয়ে সাধারণ ভুল হল ভুল মিডলওয়্যার ক্রম, যখন প্রথম ইন্টারসেপ্টর এমন ডেটা আশা করে যা দ্বিতীয়টি যোগ করে। দ্বিতীয় সবচেয়ে সাধারণ ভুল হল প্রধান থ্রেডে মিডলওয়্যারে ব্লকিং অপারেশন: ফাইল লেখা, সিঙ্ক্রোনাস HTTP কল, এনক্রিপশন। তৃতীয়টি হল এক্সেপশন হ্যান্ডলিংয়ের অভাব: যদি মিডলওয়্যার এক্সেপশন ফেলে, পুরো চেইন ভেঙে যায় এবং action reducer-এ পৌঁছাবে না বা অনুরোধ পাঠানো হবে না। সর্বদা মিডলওয়্যার লজিক try-catch-এ মোড়ান এবং চেইন না ভেঙে Crashlytics বা Sentry-তে ত্রুটি লগ করুন। কোড রিভিউয়ের সময় নিয়মিত মিডলওয়্যার চেইন পরীক্ষা করুন — এটি আর্কিটেকচারের অবনতি রোধ করে।

সচরাচর জিজ্ঞাসিত প্রশ্ন

মিডলওয়্যার Interceptor-এর থেকে কীভাবে আলাদা?

Interceptor HTTP যোগাযোগের জন্য মিডলওয়্যারের একটি বিশেষ ক্ষেত্র। মিডলওয়্যার একটি বিস্তৃত প্যাটার্ন: এটি actions (Redux), ইভেন্ট (Bloc), HTTP (Ktor) এবং যেকোনো ডেটা ফ্লো হ্যান্ডেল করতে পারে। Interceptor সর্বদা নেটওয়ার্ক স্তরের সাথে আবদ্ধ এবং শুধুমাত্র Request/Response নিয়ে কাজ করে।

পরীক্ষার পরিবেশে মিডলওয়্যার কীভাবে নিষ্ক্রিয় করবেন?

ফ্যাক্টরি পদ্ধতি বা DI কন্টেইনার (Dagger, Koin, GetIt) ব্যবহার করুন যা dev এবং prod-এর জন্য মিডলওয়্যারের আলাদা সেট ফেরত দেয়। Redux-এ, পরীক্ষায় একটি খালি অ্যারে পাস করুন। Ktor-এ, প্লাগইন ছাড়া পরীক্ষার HttpClient ব্যবহার করুন। মূল নীতি — মিডলওয়্যার কোডে হার্ডকোড করা উচিত নয়।

মিডলওয়্যার কি dispatch-এর পরে action পরিবর্তন করতে পারে?

হ্যাঁ — মিডলওয়্যার reducer বা পরবর্তী মিডলওয়্যারে পাঠানোর আগে action পরিবর্তন করে। উদাহরণস্বরূপ, Redux মিডলওয়্যার ডিসপ্যাচার কোড পরিবর্তন না করেই প্রতিটি action-এ মেটাডেটা (userId, timestamp, deviceId) যোগ করতে পারে। মূল নিয়ম — মূল অবজেক্ট মিউটেট না করে স্প্রেড অপারেটরের মাধ্যমে নতুন তৈরি করা।

Ktor-এ মিডলওয়্যার এবং Interceptor-এর মধ্যে পার্থক্য কী?

Ktor-এ, শর্তাবলী বিনিময়যোগ্য — Ktor Client মিডলওয়্যার এবং প্লাগইন একই জিনিস বোঝায়। প্রতিটি প্লাগইন HttpClientPlugin বাস্তবায়ন করে এবং client.install { }-এর মাধ্যমে ইনস্টল করা হয়। সমস্ত প্লাগইন অনুরোধ pipeline-এ এম্বেড করা হয়, একটি প্রক্রিয়াকরণ চেইন গঠন করে।

Bloc-এ মিডলওয়্যার কীভাবে ত্রুটিগুলি হ্যান্ডেল করে?

BlocObserver.onError ওভাররাইড করে — একটি বৈশ্বিক হ্যান্ডলার যা যেকোনো ব্লকে প্রতিটি এক্সেপশনে কল করা হয়। এটি প্রতিটি ব্লকে try-catch-এর বিকল্প: একটি মিডলওয়্যার কেন্দ্রীয়ভাবে ত্রুটিগুলি হ্যান্ডেল করে, সেগুলি Crashlytics-এ লেখে এবং ব্যবহারকারীকে snackbar দেখায়।

সারসংক্ষেপ

  • মিডলওয়্যার অ্যাপ্লিকেশন কম্পোনেন্টগুলির মধ্যে ক্রস-কাটিং উদ্বেগ আলাদা করার জন্য একটি সার্বজনীন প্যাটার্ন, Interceptor-এর চেয়ে বিস্তৃত।
  • Redux মিডলওয়্যার লগিং, অ্যাসিঙ্ক্রোনাস অনুরোধ (Thunk) এবং জটিল পরিস্থিতির (Saga) জন্য dispatch ইন্টারসেপ্ট করে।
  • Ktor Client স্বাধীন Logging, Auth, ContentNegotiation প্লাগইন সহ pipeline-এর মাধ্যমে মিডলওয়্যার বাস্তবায়ন করে।
  • BlocObserver Flutter Bloc-এর জন্য মিডলওয়্যার: onEvent, onTransition এবং onError বৈশ্বিকভাবে সমস্ত ব্লক হ্যান্ডেল করে।
  • Dio Interceptor Flutter-এর জন্য HTTP-মিডলওয়্যার যার চেইন OkHttp Interceptor-এর অনুরূপ।
  • মিডলওয়্যারের সংযোগের ক্রম ডেটা প্রক্রিয়াকরণের ক্রম নির্ধারণ করে — এটি স্পষ্টভাবে ডকুমেন্ট করুন।
  • মিডলওয়্যারের সঠিক ব্যবহার কোড পুনরাবৃত্তি 25-40% হ্রাস করে এবং ক্রস-কাটিং উদ্বেগের ইউনিট পরীক্ষা সহজ করে।

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন