অনেকগুলি ছোট অনুরোধ বনাম কয়েকটি বড় অনুরোধ (এপিআই ডিজাইন)


49

আমি বর্তমানে নিম্নরূপ একটি সংস্থার সাথে একটি প্রকল্পে কাজ করছি:

  • ক্লায়েন্ট - প্রধান সার্ভার থেকে REST এপিআইয়ের মাধ্যমে ডেটা পান।
  • সার্ভার - তৃতীয় পক্ষের APIs এর মাধ্যমে অন্যান্য অন্যান্য সার্ভারের ডেটা অনুরোধ করে
  • তৃতীয় পক্ষের APIs - সার্ভারে ডেটা সরবরাহ করে এমন পরিষেবাগুলি আমার নিয়ন্ত্রণের বাইরে (রেডডিট, হ্যাকারনিউজ, কোওড়া, ইত্যাদি)

তর্কের খাতিরে, আসুন ক্লায়েন্টটির প্রথমে তৃতীয় পক্ষের প্রতিটি API থেকে আইটেমের তালিকা প্রয়োজন needs এই তালিকা থেকে, একটি আইটেম চয়ন করা হবে যার পয়েন্টে ক্লায়েন্টকে আইটেমটির সম্পূর্ণ সামগ্রীর পাশাপাশি আইটেমের প্রতিক্রিয়াগুলি (যেমন মন্তব্যগুলি) দেখতে হবে। আমি তিনটি বিকল্পের মধ্যে সিদ্ধান্ত নেওয়ার চেষ্টা করছি:

খাদ্যতালিকা অনুযায়ী

এই পদ্ধতির সাথে আমার সার্ভারে আমার কাছে পৃথক 3 টি সমাপ্তি রয়েছে: একটির আইটেমের তালিকা পেতে একটি, কোনও আইটেমের জন্য মূল বিষয়বস্তু পেতে এবং একটিতে আইটেমের প্রতিক্রিয়া পেতে।

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

সার্ভার-সাইড ক্যাশে

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

  • পেশাদাররা: ক্লায়েন্টের পক্ষ থেকে কার্যকর করা এখনও সহজ, তবে বিলম্বিত সমস্যাগুলি ছাড়াই
  • কনস: আরও কিছুটা জড়িত সার্ভারের দিক থেকে এবং প্রথম কলটি সত্যই দীর্ঘ সময় নিতে পারে।

ক্লায়েন্ট-পাশের ক্যাশে

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

  • পেশাদাররা: প্রথম কলের পরে খুব দ্রুত গতিতে সহজ সার্ভার বাস্তবায়ন
  • কনস: প্রথম কলটি খুব ধীর এবং আরও জটিল ক্লায়েন্ট-সাইড বাস্তবায়ন হবে

আমি নিশ্চিত নই যে কোনটি সেরা পন্থা, বা সম্ভবত যদি আমি সুস্পষ্ট সমাধানটি অনুপস্থিত। যেকোন উপদেশ সাদরে গ্রহণ করা হবে!


এটি আমার কাছে সতেজতা এবং গতির মধ্যে পছন্দ বলে মনে হচ্ছে। আপনার স্টেকহোল্ডার এবং শেষ ব্যবহারকারীরা কী পছন্দ করে?
এর্ক

উত্তর:


27

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

আমি সম্প্রতি একটি মাল্টি-টিম ডাটাবেস-ব্যাক ওয়েব অ্যাপ্লিকেশন প্রকল্পে সহযোগিতা করছি যা একটি দল ভারতে রয়েছে (বাকিরা মার্কিন যুক্তরাষ্ট্রে)। আমাদের মার্কিন অফিসে একটি একক ডাটাবেস উদাহরণ রয়েছে যা বিকাশকারীরা আমাদের স্থানীয় ওয়েব সার্ভারের উদাহরণগুলিতে সংযুক্ত করে। আমার ডেস্কটি পঞ্চাশ ফুট এবং দুটি ল্যান হप्स ডাটাবেসের উদাহরণ থেকে দূরে থাকতে পারে এবং কার্য সম্পাদনও ঠিক আছে।

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

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


2

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


1

আপনার দেওয়া তথ্যের ভিত্তিতে, বিকল্প 1, কারণ 1

  • একক ক্লায়েন্টের অনুরোধের সাথে আপনি আপেল এবং কমলা মিশ্রিত করবেন এবং ফলের ঝুড়িটি খুব বড় হতে পারে।

  • ক্যাচিং এমন একটি ট্রেডঅফ যেখানে আপনি পারফরম্যান্স অর্জন করেন তবে সম্ভাব্য ধারাবাহিকতা (বাসি ডেটা) হারাবেন । আপনার যদি চিহ্নিত কোনও পারফরম্যান্স সমস্যা না থাকে তবে সিঙ্ক্রোনাইজেশন সমস্যাগুলি সাধারণত ঝুঁকিপূর্ণ নয়।


0

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


0

আমি (প্রায়) ছাড়ের বিকল্পটি করব ৩. ১ এবং ২ এর মধ্যে নির্বাচন করা দুটি জিনিসের উপর নির্ভর করে:

  • (ক) একক, মোট আনার ফলাফল কত বড়
  • (খ) ক্লায়েন্ট / ব্যবহারকারী সাধারণত সেই সেশনে ফলাফলের কতটা বিশদ ব্যবহার করবে।

যদি ক এবং বি চূড়ান্ত হয় তবে সিদ্ধান্ত নেওয়া সহজ:

  • যদি এ বড় হয় এবং বি ছোট হয় তবে অবশ্যই বিকল্প 1 (এ লা কার্টে) এ যান।
  • যদি এ ছোট হয় এবং বি বড় হয়, 2 (সার্ভার-সাইড ক্যাশে) বা এমনকি 3 (ক্লায়েন্ট-সাইড ক্যাশে) এর জন্য যান।

অন্য যে কোনও এ / বি (বৃহত / ছোট) প্রকরণের জন্য আপনাকে বিচক্ষণতা প্রয়োগ করতে হবে। আমি প্রায়শই বিভিন্ন ক্লায়েন্টের কাছ থেকে বিভিন্ন ব্যবহারের ক্ষেত্রে পূরণ করার জন্য মোটা এবং সূক্ষ্ম উভয় প্রান্তই সরবরাহ করি।


0

প্রোগ্রামিংয়ে সর্বদা এটি নির্ভর করে।

সুতরাং, আসল প্রশ্নটি: এ / বি / সি বা তিনটির সংমিশ্রণের সিদ্ধান্ত নেওয়ার সময় আপনার কী বিবেচনা করা উচিত?

আমি বলব যে প্রকৃত বৈষম্যমূলক কারণগুলি হ'ল আপনি যে তৃতীয় পক্ষের API গুলি ব্যবহার করছেন তার বাস্তবায়ন বিবরণ। উদাহরণ হিসাবে, আপনার বিবেচনা করা উচিত: এগুলি কি দ্রুত বা ধীর? ডেটা ঘন ঘন এবং অপ্রত্যাশিতভাবে পরিবর্তন হয়? তারা "চটি" বা বিশ্রাম?

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

যদি আপনার বাহ্যিক ডেটা অনুমানযোগ্য উপায়ে পরিবর্তন হতে চলেছে বা আপনি ব্যবহারের সাথে সীমাবদ্ধ রয়েছেন বা কেবল আপনি আপনার সার্ভারে আরও ভাল ব্যবহারকারীর অভিজ্ঞতা ক্যাশে ডেটা পেতে পারেন তবে ২ সাথে যান But তবে মনে রাখবেন যে ক্যাশে নিখরচায় নয়: এটির ডিবাগিংয়ের ক্ষেত্রে ব্যয় হয় এবং কখনও কখনও ব্যবহারকারীরা অভিযোগ করেন যে তারা আপডেট দেখতে পান না।

বিকল্প 3, আমি কেবলমাত্র ডেটা বেশি না হলে আমি বিবেচনা করব, তবে সেই ক্ষেত্রে 1 বা 2 বিকল্পগুলিও কাজ করতে পারে এবং আপনি সার্ভারে আরও যুক্তি রাখেন, তাই আমি 1 বা 2 এর জন্য আটকে থাকব।

শুধু আমার 2 সি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.