paint-brush
দক্ষ ব্যাকএন্ড, সুপিরিয়র পারফরম্যান্স: ওয়েব সার্ভিস অপ্টিমাইজেশানে একটি গভীর ডুবদ্বারা@sergeidzeboev
890 পড়া
890 পড়া

দক্ষ ব্যাকএন্ড, সুপিরিয়র পারফরম্যান্স: ওয়েব সার্ভিস অপ্টিমাইজেশানে একটি গভীর ডুব

দ্বারা Sergei Dzeboev8m2023/11/21
Read on Terminal Reader

অতিদীর্ঘ; পড়তে

একটি ওয়েব পরিষেবার ব্যাকএন্ড অপ্টিমাইজ করা শুধু কোড এবং অ্যালগরিদম উন্নত করার বাইরেও প্রসারিত। পরিষেবার দক্ষতা বাড়ানোর চাবিকাঠি হল ডাটাবেস মিথস্ক্রিয়া অপ্টিমাইজ করা। এটি ফাইন-টিউনিং ORM ক্যোয়ারীগুলির মাধ্যমে, ফ্ল্যাট ডেটা ক্লাসগুলি ব্যবহার করে, সঠিকভাবে গরম, উষ্ণ বা ঠান্ডা হিসাবে ডেটা শ্রেণীবদ্ধ করে এবং কার্যকর ক্যাশিং কৌশল প্রয়োগ করে অর্জন করা যেতে পারে। এই পদক্ষেপগুলি একটি আরও দক্ষ, প্রতিক্রিয়াশীল, এবং উচ্চ-সম্পাদক ওয়েব পরিষেবার দিকে নিয়ে যায়৷
featured image - দক্ষ ব্যাকএন্ড, সুপিরিয়র পারফরম্যান্স: ওয়েব সার্ভিস অপ্টিমাইজেশানে একটি গভীর ডুব
Sergei Dzeboev HackerNoon profile picture
0-item


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


উন্নতির জন্য কী ফোকাস করবেন?

অনেক প্রোগ্রামার, একটি অ্যাপ্লিকেশন দ্রুত করার জন্য তাদের অনুসন্ধানে, কোড এবং অ্যালগরিদমগুলি অপ্টিমাইজ করার, উপযুক্ত ডেটা স্ট্রাকচার এবং সর্বোত্তম ক্রিয়াকলাপ বেছে নেওয়ার দিকে মনোনিবেশ করে। এটি সাধারণত উন্নত কর্মক্ষমতার দিকে নিয়ে যায়, প্রায়শই অপ্টিমাইজ করা কোডের গতিকে উন্নত করে কিন্তু উল্লেখযোগ্যভাবে নয়।


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


ফাইলের সাথে কাজ করা হোক বা ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করা হোক না কেন, ইন-মেমরি ক্রিয়াকলাপগুলির তুলনায় এই কাজের জন্য কার্যকর করার সময় সর্বদা উল্লেখযোগ্য। আপনি একটি ফাইল থেকে ডেটা পড়ার প্রক্রিয়াকে উল্লেখযোগ্যভাবে প্রভাবিত করতে পারবেন না, তবে ডাটাবেসের সাথে কাজ করা আপনার সরাসরি নিয়ন্ত্রণে। একজন বিকাশকারী হিসাবে, এই মিথস্ক্রিয়াটিকে উল্লেখযোগ্যভাবে উন্নত করার জন্য আপনার সমস্ত ক্ষমতা রয়েছে৷


আসুন আপনার ডাটাবেসের সাথে কাজকে আরও দক্ষ করার জন্য নিম্নলিখিত কৌশলগুলি অন্বেষণ করি, যার ফলে আপনার ব্যাকএন্ড পরিষেবার কার্যকারিতা উল্লেখযোগ্যভাবে বৃদ্ধি পায়


অপ্টিমাইজ কোয়েরি

আজ, এটি একটি ব্যাকএন্ড ওয়েব পরিষেবা খুঁজে পাওয়া বিরল যেটি ডাটাবেস ইন্টারঅ্যাকশনের জন্য অবজেক্ট-রিলেশনাল ম্যাপিং (ORM) সিস্টেম ব্যবহার করে না। আপনি যদি সেরা ফলাফলের লক্ষ্যে থাকেন, তাহলে ORM কাস্টমাইজ করার কথা বিবেচনা করুন। যদিও ওআরএমগুলি দক্ষ এবং ত্রুটি-মুক্ত, তবে সেগুলি সাধারণ ব্যবহারের জন্য ডিজাইন করা হয়েছে৷ এই বিস্তৃত প্রযোজ্যতা প্রায়শই উচ্চ কর্মক্ষমতা ব্যয়ে আসে।


মনে রাখবেন, ORM গুলি বিভিন্ন ডাটাবেসের সাথে সামঞ্জস্যপূর্ণ হওয়ার জন্য তৈরি করা হয়েছে, যার অর্থ হতে পারে আপনার প্রকল্পের জন্য নির্বাচিত ডাটাবেসের নির্দিষ্ট সুবিধাগুলি থেকে বঞ্চিত। উদাহরণস্বরূপ, এখানে যেমন চিত্রিত করা হয়েছে, অনন্য ডাটাবেস বৈশিষ্ট্যগুলিকে ব্যবহার করা ডাটাবেসের মিথস্ক্রিয়াগুলির গতি 30 গুণ পর্যন্ত উল্লেখযোগ্যভাবে বৃদ্ধি করতে পারে।


শুধুমাত্র একটি ORM দ্বারা প্রদত্ত ডিফল্ট প্রশ্নের উপর নির্ভর করার পরিবর্তে, আপনার নিজের অপ্টিমাইজ করা প্রশ্নগুলি তৈরি করা সার্থক৷ কাস্টম কোয়েরিগুলি প্রায়শই ভাল কাজ করে, বিশেষ করে একাধিক যোগদান জড়িত পরিস্থিতিতে।


নিচে স্প্রিং JPA-তে একটি সহজ উদাহরণ দেওয়া হল যে আপনি কীভাবে একটি জয়েন কোয়েরি ব্যবহার করে কর্মক্ষমতা উন্নত করতে পারেন:

 @Transactional @Lock(LockModeType.PESSIMISTIC_READ) @Query(value = """ SELECT e FROM EmployeeRecord e LEFT JOIN DepartmentRecord d ON e.departmentId = d.id WHERE e.departmentId = :departmentId; """) List<EmployeeRecord> findEmployeesByDepartmentId(Integer departmentId);


ফ্ল্যাট ক্লাস ব্যবহার করুন

নেস্টেড অবজেক্ট এবং একটি গভীর শ্রেণিবিন্যাস সিস্টেমের সাথে জটিল ক্লাস ব্যবহার করা সিস্টেমের কার্যকারিতায় একটি উল্লেখযোগ্য ক্ষতির কারণ হতে পারে। সমগ্র নেস্টেড কাঠামোর জন্য ডাটাবেস অনুসন্ধান করা প্রায়ই অপ্রয়োজনীয়, বিশেষ করে যখন কাঠামোর সমস্ত ক্লাস সম্পূর্ণরূপে ব্যবহার করা হয় না।


যদিও অলস প্রারম্ভিকতা নেস্টেড অবজেক্টের অপ্রয়োজনীয় প্রশ্নগুলি প্রশমিত করতে সাহায্য করে, একটি নেস্টেড অবজেক্টের প্রয়োজন হলে চ্যালেঞ্জগুলি দেখা দেয়, কিন্তু এর সমস্ত ডেটা প্রয়োজন হয় না। এই দ্বিধা সমাধান হল ফ্ল্যাট ডেটা ক্লাস নিয়োগ করা।


ডাটাবেস থেকে শুধুমাত্র প্রয়োজনীয় ফিল্ড ডেটা সংগ্রহ করার জন্য আপনার একটি ক্লাস তৈরি করা উচিত। তারপরে, একটি কাস্টম ডাটাবেস কোয়েরি সহ সমস্ত প্রয়োজনীয় যোগদানগুলিকে অন্তর্ভুক্ত করে, শুধুমাত্র সেই ক্ষেত্রগুলি নির্বাচন করুন যেগুলি সত্যিকারের প্রয়োজন৷


এই পদ্ধতিটি শুধুমাত্র কোয়েরির গতি বাড়াবে না কিন্তু ডাটাবেস থেকে আপনার পরিষেবাতে ডেটা ট্র্যাফিকও কমিয়ে দেবে।


উদাহরণস্বরূপ, স্প্রিং JPA থেকে NamedParameterJdbcTemplate ব্যবহার করে, প্রয়োজনীয় ক্ষেত্র সহ একটি সমতল শ্রেণী তৈরি করা যেতে পারে:

 public record EmployeeDepartment(Integer employeeId, String employeeName, String departmentName) { }


এর পরে, একটি সরল স্ক্রিপ্ট ব্যবহার করে, শুধুমাত্র প্রয়োজনীয় ক্ষেত্রগুলি প্রধান এবং যুক্ত টেবিল থেকে সংগ্রহ করা হয়:

 public List<EmployeeDepartment> employeeDepartments() { return template.query(""" SELECT employees.employee_id, employees.employee_name, departments.department_name FROM employees LEFT JOIN departments ON employees.department_id = departments.department_id; """, new MapSqlParameterSource(), employeeDepartmentMapper); }


এই পদ্ধতিটি উল্লেখযোগ্যভাবে লোড হ্রাস করবে এবং ডেটার সাথে কাজকে আরও দক্ষ করে তুলবে।


হট ডেটা সংজ্ঞায়িত করুন

ডেটা নিয়ে কাজ করার পরবর্তী গুরুত্বপূর্ণ ধাপ হল ডেটার প্রকারগুলি সংজ্ঞায়িত করা, যার প্রধান ধরনটি হট ডেটা।


হট ডেটা হল সেই ডেটা যা পরিষেবাটি রিয়েল-টাইমে প্রক্রিয়া করে। এই ডেটা ক্যাশে করা যাবে না কারণ ওয়েব পরিষেবার প্রতিক্রিয়ার প্রাসঙ্গিকতা তার তাত্ক্ষণিক প্রতিক্রিয়ার উপর নির্ভর করে৷ অতএব, এই তথ্য সবসময় আপ টু ডেট হতে হবে. পরিষেবাটি ধারাবাহিকভাবে হট ডেটার সাথে কাজ করে, ক্রমাগত নতুন মান রেকর্ড করে এবং সময়মত আপডেটের জন্য তথ্য বের করে।


হট ডেটার সাথে যতটা সম্ভব দক্ষতার সাথে কাজ করার জন্য, এটি যে টেবিলে সংরক্ষণ করা হয়েছে তা যতটা সম্ভব কমপ্যাক্ট থাকে তা নিশ্চিত করা গুরুত্বপূর্ণ।


  • যতটা সম্ভব ছোট কলাম রাখুন

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


  • যতটা সম্ভব ছোট সারি রাখুন

    আপনার আর প্রয়োজন নেই এমন লাইনগুলি সংরক্ষণ করবেন না। পরিবর্তে, সেগুলিকে সংরক্ষণাগার টেবিলে নিয়ে যান৷ এই পদ্ধতিটি একটি আর্কাইভে সমস্ত ঐতিহাসিক ডেটা সংরক্ষণ করার সময় আপনার প্রশ্নগুলিকে প্রয়োজনীয় সারিগুলি দ্রুত খুঁজে পেতে অনুমতি দেয়৷ একটি সাধারণ কাজের সাথে এই প্রক্রিয়াটিকে স্বয়ংক্রিয় করা ডেটা সংরক্ষণাগারে আপনার অংশগ্রহণকে কমিয়ে দেয়।


  • ইনডেক্স আপডেট রাখুন

    সূচী তৈরি করতে মনে রাখবেন। সূচীগুলি দ্রুত ডেটা অনুসন্ধানের জন্য অত্যন্ত গুরুত্বপূর্ণ এবং প্রায়শই প্রোগ্রামারদের দ্বারা উপেক্ষা করা হয়। সঠিক সূচীকরণ আপনার ডেটাবেসের অনুসন্ধানের সময় এবং মেমরি খরচ উল্লেখযোগ্যভাবে হ্রাস করতে পারে। যৌগিক সূচী সহ যোগদানে জড়িত শর্ত এবং কলাম উভয়ের জন্য সূচী তৈরি করা নিশ্চিত করুন।


  • বিদেশী কী ব্যবহার করা ছেড়ে দিন

    বিদেশী কী ব্যবহার করা ডাটাবেসের উপর একটি অতিরিক্ত লোড রাখে যাতে নিশ্চিত করা হয় যে কীটি সংশ্লিষ্ট টেবিলে বিদ্যমান রয়েছে, যা ডেটা ক্রিয়াকলাপকে ধীর করে দেয়, বিশেষ করে ডেটা লেখার সময়। আমাকে ভুল বুঝবেন না; এই জাতীয় টেবিলে একটি বিদেশী কী সংরক্ষণ করা সম্ভব এবং কখনও কখনও এমনকি প্রয়োজনীয়, তবে কীটিকে কেবল একটি সাধারণ মান হিসাবে সংরক্ষণ করা ভাল।


এই সহজ পদ্ধতিগুলি আপনাকে আপনার টেবিলের দক্ষতা এবং উপযোগিতা সর্বাধিক করতে সক্ষম করবে।


উষ্ণ ডেটা সংজ্ঞায়িত করুন

উষ্ণ ডেটা হল একটি প্রতিক্রিয়া প্রস্তুত করতে ব্যবহৃত ডেটা, যদিও এর প্রাসঙ্গিকতার কোনও সমালোচনামূলক প্রভাব নেই। উদাহরণগুলির মধ্যে রয়েছে পণ্যের বিবরণ বা উপলব্ধ আনুষাঙ্গিকগুলির একটি তালিকা। এই ধরনের ডেটা সংরক্ষণ করার সময়, টেবিলের আকার ঘনিষ্ঠভাবে পর্যবেক্ষণ করার আর প্রয়োজন নেই। যাইহোক, এই টেবিলগুলিতে সূচী তৈরির বিষয়টি উপেক্ষা করা গুরুত্বপূর্ণ, কারণ এগুলি প্রায়শই যোগদানের জন্য ব্যবহৃত হয়।


  • ক্যাশে উষ্ণ ডেটা

    উষ্ণ ডেটার একটি মূল সুবিধা হল এর ক্যাশেবিলিটি। একবার অনুরোধ করা হলে, আপনি মেমরিতে ডেটা সংরক্ষণ করতে পারেন, ডাটাবেস কলের সংখ্যা হ্রাস করতে এবং গণনার গতি বাড়াতে পারেন। যাইহোক, মনে রাখবেন ক্যাশে নিয়মিত আপডেট প্রয়োজন।


  • যুক্তিসঙ্গত TTL সেট করুন (লাইভ করার সময়)

    সঠিক অপারেশনের জন্য সঠিক সময় লাইভ (TTL) সেট করুন। সাধারণত, প্রায় 90 সেকেন্ডের একটি TTL যথেষ্ট, একজন ব্যবহারকারী সিদ্ধান্ত নিতে এবং একটি ওয়েবসাইটে অর্ডার দেওয়ার গড় সময়ের সাথে সামঞ্জস্য করে। আপনার পরিষেবার প্রয়োজনীয়তার উপর ভিত্তি করে সর্বদা TTL সামঞ্জস্য করুন।


  • উষ্ণ ডেটা সঞ্চয় করতে ছোট ক্লাস ব্যবহার করুন

    ক্যাশিংয়ের জন্য, কমপ্যাক্ট ক্লাস ব্যবহার করুন। এমনকি যখন পূর্ণাঙ্গ প্রশ্ন করা হয় এবং টেবিল থেকে সমস্ত ডেটা সংগ্রহ করা হয়, তখন ক্যাশে সবকিছু সংরক্ষণ করা এড়িয়ে চলুন। শুধুমাত্র প্রয়োজনীয় তথ্য সংরক্ষণ করুন। এই পদ্ধতিটি আপনার ব্যাকএন্ড পরিষেবার মেমরি খরচ উল্লেখযোগ্যভাবে হ্রাস করে।


উষ্ণ ডেটা সেট আপ করতে বেশি সময় লাগবে না, এবং শেষ পর্যন্ত, আপনি বাস্তব ফলাফল অর্জন করবেন।


কোল্ড ডেটার সংজ্ঞা দাও

কোল্ড ডেটা বলতে এমন ডেটা বোঝায় যা খুব কমই পরিবর্তিত হয় তবে প্রতিক্রিয়ার জন্য প্রয়োজন হয়। এই ধরনের ডেটার উদাহরণগুলির মধ্যে একটি দোকানের নাম বা ঠিকানা অন্তর্ভুক্ত। এই ডেটা খুব কমই পরিবর্তিত হয় এবং প্রতিক্রিয়ার প্রাসঙ্গিকতার উপর ন্যূনতম প্রভাব ফেলে।


  • ক্যাশে কোল্ড ডেটা বা এটি একটি ফাইলে সংরক্ষণ করুন

    এই ডাটা টাইপ সবসময় ক্যাশে করা উচিত। বড় আকারের কারণে যদি এই ধরনের ডেটা মেমরিতে ফিট করা সম্ভব না হয়, তাহলে ডাটাবেস থেকে এটি আনলোড করার এবং একটি রেডি-টু-ব্যবহারের ফর্ম্যাটে ফাইলগুলিতে সংরক্ষণ করার কথা বিবেচনা করুন। এটিকে বিভাগগুলিতে বিভক্ত করা এবং শুধুমাত্র সর্বাধিক ব্যবহৃত একটি নির্বাচন করা মেমরির ব্যবহার কমাতে সাহায্য করবে৷ উপরন্তু, এই পদ্ধতিটি ডাটাবেস থেকে ডেটা আনার তুলনায় গতিকে উল্লেখযোগ্যভাবে উন্নত করে, কারণ এটি নেটওয়ার্কে কাজ করার প্রয়োজনীয়তা দূর করে।


  • ট্রিগারে ক্যাশে আপডেট করুন

    এই ধরনের ক্যাশের জন্য বসবাসের সময় (TTL) সাধারণত 24 ঘন্টা সেট করা হয়। ক্যাশে আপডেট রাখতে, আপনার একটি টাস্ক শিডিউল করা উচিত বা একটি ট্রিগার তৈরি করা উচিত যা এই ডেটাতে পরিবর্তনগুলি নিরীক্ষণ করে এবং একটি ক্যাশে আপডেট শুরু করে৷ উদাহরণস্বরূপ, যদি কোল্ড ডেটা পোস্ট বা আপডেট করার জন্য একটি এন্ডপয়েন্টকে কল করা হয়, ক্যাশে আপডেট করার জন্য একটি ট্রিগার সক্রিয় করা উচিত।


কার্যকরভাবে কোল্ড ডেটা পরিচালনা করাও প্রতিক্রিয়া দক্ষতা অপ্টিমাইজ করার একটি গুরুত্বপূর্ণ অংশ, যার ফলে সামগ্রিক সিস্টেমের কর্মক্ষমতা বৃদ্ধি পায়।


উপসংহার

উপসংহারে, একটি ওয়েব পরিষেবার ব্যাকএন্ড অপ্টিমাইজ করা শুধুমাত্র কোড এবং অ্যালগরিদম অপ্টিমাইজেশানের উপর নির্ভর করে না। ডাটাবেস মিথস্ক্রিয়া উন্নত করা পরিষেবাটির আরও দক্ষতা এবং সামগ্রিক কর্মক্ষমতার দিকে পরিচালিত করবে। ফাইন-টিউনিং ওআরএম (অবজেক্ট-রিলেশনাল ম্যাপিং) ক্যোয়ারী, ফ্ল্যাট ডেটা ক্লাস ব্যবহার করা, ডেটার ধরন নির্ভুলভাবে সংজ্ঞায়িত করা এবং ক্যাশিং কৌশল অবলম্বন করার মতো কৌশলগুলিকে উল্লেখযোগ্যভাবে পরিষেবা কর্মক্ষমতা বৃদ্ধি করতে পারে। এই ব্যবস্থাগুলির মাধ্যমে, ওয়েব পরিষেবাটি শেষ পর্যন্ত উন্নত দক্ষতা, প্রতিক্রিয়াশীলতা এবং উন্নত সামগ্রিক কার্যকারিতা অর্জন করবে।


মূল পদক্ষেপ :

  1. ডাটাবেস কোয়েরি অপ্টিমাইজ করুন এবং শুধুমাত্র ওআরএম বাস্তবায়নের উপর নির্ভর করা এড়িয়ে চলুন।
  2. মেমরির ব্যবহার কমাতে এবং প্রতিক্রিয়ার গতি বাড়াতে ফ্ল্যাট ক্লাস ব্যবহার করুন।
  3. গরম, উষ্ণ বা ঠান্ডা হিসাবে শ্রেণীবদ্ধ করে ডেটা প্রকারগুলিকে সংজ্ঞায়িত করুন।
  4. প্রতিটি সংজ্ঞায়িত ডেটা টাইপের জন্য উপযোগী নির্দিষ্ট কৌশল প্রয়োগ করুন।