আমি একাধিক গ্রাহকের জন্য একটি এপিআই তৈরি করছি। মত মূল এন্ডপয়েন্টগুলি /users
প্রতিটি গ্রাহক ব্যবহার করেন তবে কিছু শেষবিন্দু পৃথক কাস্টমাইজেশনের উপর নির্ভর করে। সুতরাং এটি হতে পারে যে ব্যবহারকারী এ একটি বিশেষ শেষ পয়েন্ট চায় /groups
এবং অন্য কোনও গ্রাহকের কাছে সেই বৈশিষ্ট্য থাকবে না। কেবল একটি সিডনোট হিসাবে , এই অতিরিক্ত বৈশিষ্ট্যগুলির কারণে প্রতিটি গ্রাহক তার নিজস্ব ডাটাবেস স্কিমা ব্যবহার করবেন।
আমি ব্যক্তিগতভাবে নেস্টজে (হুডের নিচে এক্সপ্রেস) ব্যবহার করি। সুতরাং app.module
বর্তমানে আমার সমস্ত মূল মডিউলগুলি (তাদের নিজস্ব শেষ পয়েন্টগুলি সহ) নিবন্ধিত করুন
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module'; // core module
@Module({
imports: [UsersModule]
})
export class AppModule {}
আমি মনে করি এই সমস্যাটি নেস্টজেগুলির সাথে সম্পর্কিত নয় তাই আপনি কীভাবে তত্ত্বটি পরিচালনা করবেন?
আমার মূলত এমন একটি অবকাঠামো দরকার যা একটি বেসিক সিস্টেম সরবরাহ করতে সক্ষম। কোনও মূল সমাপ্তি নেই কারণ প্রতিটি সম্প্রসারণ অনন্য এবং একাধিক /users
বাস্তবায়ন সম্ভব হতে পারে। একটি নতুন বৈশিষ্ট্য বিকাশ করার সময় মূল প্রয়োগটি স্পর্শ করা উচিত নয়। এক্সটেনশনগুলি তাদের একীভূত হওয়া উচিত বা প্রারম্ভের সময় সংহত হওয়া উচিত। মূল সিস্টেমটি শিপগুলি শেষ প্রান্তবিহীন তবে সেই বাহ্যিক ফাইলগুলি থেকে প্রসারিত হবে।
কিছু ধারণা আমার মনে আসে
প্রথম পদ্ধতির:
প্রতিটি এক্সটেনশন একটি নতুন সংগ্রহস্থল উপস্থাপন করে। সমস্ত এক্সটেনশন প্রকল্পগুলি ধারণ করে একটি কাস্টম বহিরাগত ফোল্ডারের একটি পথ নির্ধারণ করুন। এই কাস্টম ডিরেক্টরিতে একটি groups
সহ একটি ফোল্ডার থাকবেgroups.module
import { Module } from '@nestjs/common';
import { GroupsController } from './groups.controller';
@Module({
controllers: [GroupsController],
})
export class GroupsModule {}
আমার এপিআই সেই ডিরেক্টরিটি লুপ করতে পারে এবং প্রতিটি মডিউল ফাইল আমদানির চেষ্টা করতে পারে।
পেশাদাররা:
- কাস্টম কোডটি মূল সংগ্রহস্থল থেকে দূরে রাখা হয়েছে
কনস:
নেস্টজেগুলি টাইপসক্রিপ্ট ব্যবহার করে তাই আমাকে প্রথমে কোডটি সংকলন করতে হবে। আমি কীভাবে কাস্টম অ্যাপ্লিকেশনগুলি থেকে API বিল্ড এবং বিল্ডগুলি পরিচালনা করব? (প্লাগ এবং প্লে সিস্টেম)
কাস্টম এক্সটেনশানগুলি খুব আলগা কারণ তারা কেবল কিছু টাইপ স্ক্রিপ্ট ফাইল ধারণ করে। এপিআইয়ের নোড_মডিউলগুলির ডিরেক্টরিতে তাদের অ্যাক্সেস না থাকার কারণে, আমার সম্পাদক আমাকে ত্রুটিগুলি দেখায় কারণ এটি বাহ্যিক প্যাকেজ নির্ভরতাগুলি সমাধান করতে পারে না।
কিছু এক্সটেনশন অন্য এক্সটেনশান থেকে ডেটা আনতে পারে। গ্রুপ পরিষেবাদি ব্যবহারকারীর পরিষেবা অ্যাক্সেস করার প্রয়োজন হতে পারে। জিনিসগুলি এখানে জটিল হয়ে উঠতে পারে।
দ্বিতীয় পদ্ধতির: প্রতিটি এক্সটেনশানটি API এর src ফোল্ডারের সাবফোল্ডারের ভিতরে রাখুন। তবে এই সাবফোল্ডারটি .gitignore ফাইলটিতে যুক্ত করুন। এখন আপনি নিজের এক্সটেনশানগুলি API এর ভিতরে রাখতে পারেন।
পেশাদাররা:
আপনার সম্পাদক নির্ভরতাগুলি সমাধান করতে সক্ষম
আপনার কোড স্থাপন করার আগে আপনি বিল্ড কমান্ড চালাতে পারেন এবং এতে একক বিতরণ হবে
আপনি সহজেই অন্যান্য পরিষেবাদি অ্যাক্সেস করতে পারেন (
/groups
আইডি দ্বারা কোনও ব্যবহারকারীকে সন্ধানের প্রয়োজন)
কনস:
- বিকাশকালে আপনাকে সেই সংগ্রহকারীর ফাইলগুলি সেই সাবফোল্ডারের ভিতরে অনুলিপি করতে হবে। কিছু পরিবর্তন করার পরে আপনাকে এই ফাইলগুলি আবার অনুলিপি করতে হবে এবং আপডেট করা ফাইলগুলির সাহায্যে আপনার সংগ্রহস্থলগুলি ওভাররাইড করতে হবে।
তৃতীয় পদ্ধতি:
একটি বাহ্যিক কাস্টম ফোল্ডারের অভ্যন্তরে, সমস্ত এক্সটেনশান সম্পূর্ণরূপে স্ট্যান্ডএলোন এপিআই দ্বারা প্রস্তুত। আপনার মূল এপিআই কেবল প্রমাণীকরণ স্টাফ সরবরাহ করবে এবং আগত অনুরোধগুলিকে টার্গেট এপিআই এ পুনঃনির্দেশ করার জন্য একটি প্রক্সি হিসাবে কাজ করতে পারে।
পেশাদাররা:
- নতুন এক্সটেনশনগুলি সহজেই বিকাশ ও পরীক্ষা করা যায়
কনস:
মোতায়েন করা জটিল হবে। আপনার নিজস্ব একটি প্রক্রিয়া শুরু করতে এবং একটি বন্দর শোনার জন্য একটি প্রধান এপিআই এবং এন এক্সটেনশন এপিআই থাকবে।
প্রক্সি সিস্টেমটি জটিল হতে পারে। যদি ক্লায়েন্টকে
/users
প্রক্সিটির অনুরোধ করা হয় তবে কোন এক্সটেনশন এপিআই সেই শেষ পয়েন্টটি শুনবে, সেই এপিআই কল করে এবং সেই প্রতিক্রিয়াটি ক্লায়েন্টের কাছে ফরোয়ার্ড করে।এক্সটেনশন এপিআইগুলিকে সুরক্ষিত করতে (মূল API দ্বারা প্রমাণীকরণ পরিচালনা করা হয়) প্রক্সিটির সেই APIগুলির সাথে একটি গোপন ভাগ করা প্রয়োজন। সুতরাং এক্সটেনশান এপিআই কেবলমাত্র প্রক্সি থেকে ম্যাচিং গোপন সরবরাহ করা হলে আগত অনুরোধগুলি পাস করবে।
চতুর্থ পন্থা:
Microservices সাহায্য করতে পারে। আমি এখান থেকে https://docs.nestjs.com/microservices/basics থেকে একটি গাইড নিয়েছি
আমি ব্যবহারকারীর পরিচালনা, গোষ্ঠী পরিচালন ইত্যাদির জন্য একটি মাইক্রোসার্ভিস পেতে পারি এবং একটি ছোট এপিআই / গেটওয়ে / প্রক্সি তৈরি করে সেই পরিষেবাগুলি গ্রাস করতে পারি যা সেই মাইক্রোসার্ফিসগুলি কল করে।
পেশাদাররা:
নতুন এক্সটেনশনগুলি সহজেই বিকাশ ও পরীক্ষা করা যায়
উদ্বেগ পৃথক করা
কনস:
মোতায়েন করা জটিল হবে। আপনার কাছে একটি নিজস্ব এপিআই এবং এন মাইক্রোসার্কেস রয়েছে তাদের নিজস্ব প্রক্রিয়া শুরু করার এবং একটি বন্দর শোনার।
দেখে মনে হচ্ছে যে আমি প্রতিটি গ্রাহকের জন্য এটি অনুকূলিত করতে চাইলে একটি নতুন গেটওয়ে এপিআই তৈরি করতে হবে। সুতরাং অ্যাপ্লিকেশনটি প্রসারিত করার পরিবর্তে আমাকে প্রতিটি সময় কাস্টমাইজড কমসুমিং এপিআই তৈরি করতে হবে। এটি সমস্যার সমাধান করবে না।
এক্সটেনশন এপিআইগুলিকে সুরক্ষিত করতে (মূল API দ্বারা প্রমাণীকরণ পরিচালনা করা হয়) প্রক্সিটির সেই APIগুলির সাথে একটি গোপন ভাগ করা প্রয়োজন। সুতরাং এক্সটেনশান এপিআই কেবলমাত্র প্রক্সি থেকে ম্যাচিং গোপন সরবরাহ করা হলে আগত অনুরোধগুলি পাস করবে।