সংযোগ-সীমাবদ্ধ সীমাবদ্ধ ডাটাবেসে উচ্চ-ফ্রিকোয়েন্সি ইভেন্টগুলি সংরক্ষণ করা


13

আমরা এমন একটি পরিস্থিতি পেয়েছি যেখানে আমাদের সার্ভারে আসা প্রচুর ইভেন্টের স্রোতে আমার প্রতি সেকেন্ডে প্রায় 1000 ইভেন্টে মোকাবিলা করতে হবে (পিকটি 2000 ডলার হতে পারে)।

সমস্যাটি

আমাদের সিস্টেম হিরোকুতে হোস্ট করা হয়েছে এবং তুলনামূলকভাবে ব্যয়বহুল হিরোকু পোস্টগ্রিস ডিবি ব্যবহার করে , যা সর্বোচ্চ 500 ডিবি সংযোগের অনুমতি দেয়। আমরা সার্ভার থেকে ডিবিতে সংযোগ করতে সংযোগ পুলিং ব্যবহার করি।

ডিবি সংযোগ পুল যেভাবে পরিচালনা করতে পারে তার চেয়ে বেশি ইভেন্ট ইভেন্টগুলিতে আসে

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

ঘটনাচক্রে ঘটনাগুলি সজ্জিত হয়, সংরক্ষণের জন্য অপেক্ষা করে এবং পুলে কোনও উপলভ্য সংযোগ না থাকায় এগুলি শেষ হয়ে যায় এবং পুরো সিস্টেমটি অপ-কার্যক্ষম হয়।

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

সীমাবদ্ধতাসমূহ

অন্যান্য ক্লায়েন্টরা একই সাথে ইভেন্টগুলি পড়তে চাইতে পারে

অন্যান্য ক্লায়েন্টরা ক্রমাগত সমস্ত ইভেন্টকে ডিবিতে সংরক্ষণ না করা সত্ত্বেও একটি নির্দিষ্ট কী সহ সমস্ত ইভেন্ট পড়ার অনুরোধ করে।

কোনও ক্লায়েন্ট GET api/v1/events?clientId=1ক্লায়েন্ট 1 এর মাধ্যমে প্রেরিত সমস্ত ইভেন্টকে জিজ্ঞাসা করতে এবং সেগুলি পেতে পারে, যদিও সেই ইভেন্টগুলি কেবলমাত্র ডিবিতে সংরক্ষণ না করা হয়।

কীভাবে এটি মোকাবেলা করতে হবে তার কোনও "শ্রেণিকক্ষ" উদাহরণ রয়েছে?

সম্ভাব্য সমাধান

আমাদের সার্ভারে ইভেন্টগুলি সারিবদ্ধ করুন

আমরা সার্ভারে ইভেন্টগুলি সারিবদ্ধ করতে পারি (সংযোগ পুলটি শেষ না হওয়ার সাথে সারি সর্বাধিক সম্মতিযুক্ত 400 রয়েছে)।

এটি খারাপ ধারণা কারণ:

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

একটি পৃথক বার্তা সারি ব্যবহার করুন

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

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

একাধিক ডাটাবেস ব্যবহার করুন, প্রতিটি বার্তাগুলির একটি অংশ কেন্দ্রীয় ডিবি-কো-অর্ডিনেটর সার্ভারের সাথে পরিচালনা করতে সেগুলি পরিচালনা করে

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

একটি পাঠ্য ক্যোয়ারিতে, এই সমন্বয়কারী SELECTপ্রতিটি ডাটাবেসে প্রশ্নগুলি সরবরাহ করতে পারে , সমস্ত ফলাফলকে মার্জ করে এবং সেই ক্লায়েন্টের কাছে পাঠাতে অনুরোধ করে যা তাদের পাঠিয়ে দিতে পারে।

এটি খারাপ ধারণা কারণ:

  • এই ধারণাটি মনে হচ্ছে ... আহেম .. ওভার ইঞ্জিনিয়ারিং? পাশাপাশি পরিচালনা করার জন্য একটি দুঃস্বপ্ন হবে (ব্যাকআপগুলি ইত্যাদি)) এটি নির্মাণ এবং রক্ষণাবেক্ষণ করা জটিল এবং এটি একেবারে প্রয়োজনীয় না হলে এটি KISS লঙ্ঘনের মতো শোনাচ্ছে ।
  • এটি ধারাবাহিকতা ত্যাগ করে । আমরা যদি এই ধারণাটি নিয়ে চলে যাই তবে একাধিক ডিবিতে লেনদেন করা কোনও উপায় নেই।

3
তোমার বাধা কোথায়? আপনি আপনার সংযোগ পুলের উল্লেখ করছেন, তবে এটি কেবল সামঞ্জস্যকে প্রভাবিত করে, প্রতি সন্নিবেশের গতি নয়। আপনার যদি 500 সংযোগ রয়েছে এবং উদাহরণস্বরূপ 2000 কিউপিএস, প্রতিটি ক্যোয়ারী 250 মিটারের মধ্যে পূর্ণ হয় তবে এটি দীর্ঘ সময় হয়। কেন 15 মিমি উপরে? এছাড়াও নোট করুন যে কোনও PaaS ব্যবহার করে আপনি উল্লেখযোগ্য অপ্টিমাইজেশনের সুযোগগুলি ছেড়ে দিচ্ছেন, যেমন ডাটাবেস হার্ডওয়্যার স্কেল করা বা প্রাথমিক ডাটাবেসে লোড কমাতে রিড-প্রতিলিপি ব্যবহার করা। হিরোকু এটির মূল্যহীন নয় যদি না আপনার ব্যবহার সবচেয়ে বড় সমস্যা হয়।
আমন

@amon অটলটি আসলে সংযোগ পুল pool আমি ANALYZEনিজেরাই অনুসন্ধানগুলি চালিয়েছি এবং এগুলি কোনও সমস্যা নয় are আমি সংযোগ পুল অনুমানটি পরীক্ষা করার জন্য একটি প্রোটোটাইপও তৈরি করেছি এবং যাচাই করেছি যে এটি আসলেই সমস্যা। ডাটাবেস এবং সার্ভার নিজেই বিভিন্ন মেশিনে লাইভ করে তাই বিলম্ব। এছাড়াও, হিরোকুকে একান্ত প্রয়োজন না হলে ছেড়ে দিতে চাই না, মোতায়েনের বিষয়ে উদ্বিগ্ন না হওয়া আমাদের জন্য একটি বিশাল প্লাস।
নিক কিরিয়াকাইডস

1
বলা হচ্ছে, আমি বুঝতে পারি যে মাইক্রো-অপটিমাইজেশন রয়েছে যা আমি করতে পারি যা আমার বর্তমান সমস্যা সমাধানে সহায়তা করবে । আমি ভাবছি যে আমার সমস্যার কোনও স্কেলযোগ্য আর্কিটেকচারাল সমাধান আছে কিনা ।
নিক কিরিয়াকাইডস

3
আপনি ঠিক কীভাবে যাচাই করেছেন যে সংযোগ পুলটি সমস্যাটি? @amon তার গণনায় সঠিক। select null500 সংযোগে জারি করার চেষ্টা করুন । আমি বাজি ধরছি আপনি দেখতে পাবেন যে সংযোগ পুলটি সেখানে সমস্যা নয়।
usr

1
যদি নাল নির্বাচন করা সমস্যাযুক্ত হয় তবে আপনি সম্ভবত সঠিক। যদিও এটি আকর্ষণীয় হবে যেখানে সেই সমস্ত সময় ব্যয় হয়। কোনও নেটওয়ার্ক এত ধীর হয় না।
usr

উত্তর:


9

ইনপুট স্ট্রিম

এটি আপনার স্পষ্ট নয় যে আপনার 1000 ইভেন্ট / সেকেন্ডে শিখরগুলি উপস্থাপন করে বা এটি একটি ক্রমাগত বোঝা:

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

প্রস্তাবিত সমাধান

স্বজ্ঞাতভাবে, উভয় ক্ষেত্রেই আমি কাফকা ভিত্তিক ইভেন্ট-স্ট্রিমের জন্য যাব :

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

এটি সর্বস্তরে অত্যন্ত স্কেলেবল:

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

ক্লায়েন্টদের কাছে ডিবিতে এখনও লিখিত না হওয়া ইভেন্টগুলির অফার

আপনি চান যে আপনার ক্লায়েন্টরা এখনও পাইপে থাকা তথ্যের অ্যাক্সেস পেতে সক্ষম হন এবং ডিবিতে এখনও লিখিত হয়নি। এটি আরও কিছুটা নাজুক।

বিকল্প 1: ডিবি প্রশ্নের পরিপূরক হিসাবে একটি ক্যাশে ব্যবহার করা

আমি গভীরতার সাথে বিশ্লেষণ করিনি, তবে আমার মনে প্রথম যে ধারণাটি আসে তা হ'ল ক্যোয়ারী প্রসেসর (গুলি) কে কাফকা বিষয়গুলির ভোক্তা (গুলি) তৈরি করা, তবে অন্য কাফকা গ্রাহক গোষ্ঠীতে । অনুরোধ প্রসেসরটি তখন ডিবি লেখক যে সমস্ত বার্তা পাবেন তা স্বতন্ত্রভাবে গ্রহণ করবে। এটি তখন তাদের স্থানীয় ক্যাশে রাখতে পারে। এরপরে কোয়েরিগুলি ডিবি + ক্যাশে (+ নকলকে অপসারণ) এ চালানো হবে।

নকশাটি এর পরে দেখতে হবে:

এখানে চিত্র বর্ণনা লিখুন

এই ক্যোয়ারী স্তরটির স্কেলাবিলিটি আরও ক্যোয়ারী প্রসেসর (প্রতিটি নিজস্ব গ্রাহক দলের) যুক্ত করে অর্জন করা যেতে পারে।

বিকল্প 2: একটি দ্বৈত এপিআই নকশা করুন

আইএমএইচওর পক্ষে একটি দ্বৈত এপিআই দেওয়া (পৃথক গ্রাহক গোষ্ঠীর প্রক্রিয়াটি ব্যবহার করা) আরও ভাল হবে:

  • ডিবিতে ইভেন্টগুলি অ্যাক্সেস করতে এবং / অথবা বিশ্লেষণগুলি তৈরি করার জন্য একটি কোয়েরি এপিআই
  • একটি স্ট্রিমিং এপিআই যা কেবলমাত্র বিষয় থেকে সরাসরি বার্তাগুলি ফরওয়ার্ড করে

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

ভেরিয়েন্ট

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

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


নাক্ষত্রিক; আপনি কি বলতে চাইছেন a distributed database (for example using a specialization of the server by group of keys)? এছাড়াও রাব্বিটএমকিউয়ের পরিবর্তে কাফকা কেন? একে অপরকে বেছে নেওয়ার জন্য কি বিশেষ কারণ আছে?
নিক কিরিয়াকাইডস

@ নিকোলাস কাইরিয়াকিডস ধন্যবাদ! 1) আমি কেবল কয়েকটি স্বতন্ত্র ডাটাবেস সার্ভারের কথা চিন্তা করছিলাম তবে একটি স্পষ্ট বিভাজন স্কিম (কী, ভূগোল, ইত্যাদি।) যা কার্যকরভাবে কমান্ডগুলি প্রেরণের জন্য ব্যবহার করা যেতে পারে। 2) স্বজ্ঞাতভাবে , সম্ভবত কারণ কাফকা খুব উচ্চ থ্রুপুট জন্য ধ্রুবক বার্তা সহ ডিজাইন করা হয়েছে আপনার সার্ভারগুলি পুনরায় চালু করা দরকার?) আমি নিশ্চিত নই যে রেবিট এমকিউ বিতরণ করা পরিস্থিতিতে যেমন নমনীয় এবং অবিচ্ছিন্ন সারিগুলি কর্মক্ষমতা হ্রাস করে
ক্রিস্টোফ

1) সুতরাং এটি আমার Use multiple databasesধারণার সাথে অনেকটা একই রকম তবে আপনি বলছেন যে আমি কেবল এলোমেলোভাবে (বা রাউন্ড-রবিন) প্রত্যেকটি ডেটাবেজে বার্তা বিতরণ করব না। রাইট?
নিক কিরিয়াকাইডস

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

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

11

আমার অনুমান যে আপনি প্রত্যাখ্যান করেছেন এমন একটি পদ্ধতির আপনাকে আরও যত্ন সহকারে অন্বেষণ করতে হবে

  • আমাদের সার্ভারে ইভেন্টগুলি সারিবদ্ধ করুন

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

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

ইভেন্টগুলি সারিবদ্ধ হওয়া অবস্থায় সার্ভারটি পুনরায় আরম্ভ করতে পারে যার ফলে আমাদের ত্রুটিযুক্ত ইভেন্টগুলি হারাতে পারে।

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

  • একাধিক ডাটাবেস ব্যবহার করুন, প্রতিটি বার্তাগুলির একটি অংশ কেন্দ্রীয় ডিবি-কো-অর্ডিনেটর সার্ভারের সাথে পরিচালনা করতে সেগুলি পরিচালনা করে

হতে পারে - আমি আপনার ব্যবসায়ের গণ্ডির দিকে তাকাতে আরও বেশি সম্ভাব্য হব তা দেখার জন্য যে ডেটাটি তীক্ষ্ণ করার জন্য প্রাকৃতিক স্থান রয়েছে কিনা।

এমন কিছু মামলা রয়েছে যেখানে ডেটা হারানো একটি গ্রহণযোগ্য ট্রেড অফ?

ঠিক আছে, আমি অনুমান করি যে সেখানে থাকতে পারে, কিন্তু আমি যেখানে যাচ্ছিলাম তা নয়। মুল বক্তব্যটি হ'ল বার্তাটি ক্ষতির মুখোমুখি হওয়ার জন্য অগ্রগতির জন্য নকশার দৃ it়তা তৈরি করা উচিত ছিল।

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

উদী দহন (ইতিমধ্যে অ্যান্ডি দ্বারা রেফারেন্স করা ) এবং বিতরণ লেনদেন ছাড়াই নির্ভরযোগ্য মেসেজিং এবং গ্রেগ ইয়ংয়ের পলিগ্লট ডেটা দেখুন


In a distributed system, I think you can be pretty confident that messages are going to get lost। সত্যি? এমন কিছু মামলা রয়েছে যেখানে ডেটা হারানো একটি গ্রহণযোগ্য ট্রেড অফ? আমি ছাপের মধ্যে ছিলাম যে ডেটা = ব্যর্থতা হারানো।
নিক কিরিয়াকাইডস

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

6

যদি আমি সঠিকভাবে বুঝতে পারি তবে বর্তমান প্রবাহটি হ'ল:

  1. গ্রহণ এবং ইভেন্ট (আমি HTTP এর মাধ্যমে ধরে নিই?)
  2. পুল থেকে সংযোগের জন্য অনুরোধ করুন।
  3. ইভেন্টটি ডিবিতে sertোকান
  4. পুলের সাথে সংযোগটি ছেড়ে দিন।

যদি তাই হয় তবে আমি মনে করি ডিজাইনের প্রথম পরিবর্তনটি হ'ল প্রতিটি ইভেন্টে আপনার এমনকি হ্যান্ডলিং কোডটি রিটার্ন সংযোগগুলি পুলের সাথে বন্ধ করে দেওয়া। পরিবর্তে সন্নিবেশ থ্রেড / প্রক্রিয়াগুলির একটি পুল তৈরি করুন যা ডিবি সংযোগের সংখ্যার সাথে 1-থেকে -1 হয়। এগুলির প্রত্যেকের জন্য একটি ডেডিকেটেড ডিবি সংযোগ থাকবে।

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

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


5

অনুমিতি

আমি ধরে নিচ্ছি যে আপনি যে লোডটি বর্ণনা করেছেন তা ধ্রুবক, কারণ এটি সমাধান করা আরও কঠিন পরিস্থিতি।

আমি ধরে নেব যে আপনার ওয়েব অ্যাপ্লিকেশন প্রক্রিয়ার বাইরে চালিত, দীর্ঘকালীন ওয়ার্কলোডগুলি চালানোর কোনও উপায় রয়েছে।

সমাধান

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

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

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

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

বাধ্যতা

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

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


3

ডিবি সংযোগ পুল যেভাবে পরিচালনা করতে পারে তার চেয়ে বেশি ইভেন্ট ইভেন্টগুলিতে আসে

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

বার্তা সারিটি সেই নকশার সাহায্যে ব্যবহার করা যেতে পারে, আপনার বার্তা প্রযোজক (গুলি) দরকার যা বার্তাগুলির কাতারে ইভেন্টগুলি ধাক্কা দেয় এবং কর্মীরা (গ্রাহকরা) সারি থেকে বার্তাগুলি প্রক্রিয়া করে।

অন্যান্য ক্লায়েন্টরা একই সাথে ইভেন্টগুলি পড়তে চাইতে পারে

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

যদি ক্লায়েন্টরা কেবল কাঁচা ইভেন্টগুলি অনুসন্ধান করতে চান তবে আমি ইলাস্টিক অনুসন্ধানের মতো অনুসন্ধান ইঞ্জিন ব্যবহার করার পরামর্শ দেব। এমনকি আপনি কোয়েরি / অনুসন্ধান এপিআই বিনামূল্যে পাবেন।

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

স্কেলিং ইলাস্টিক অনুসন্ধান সহজ, তবে এমনকি বেসিক কনফিগারেশন সহ এটি বেশ উচ্চতর পারফরম্যান্ট।

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


2

1 সেকেন্ড বা 2 কে ইভেন্ট (5 কেবি) প্রতি সেকেন্ডে কোনও ডাটাবেসের পক্ষে তেমন কিছু হয় না যদি এর উপযুক্ত স্কিমা এবং স্টোরেজ ইঞ্জিন থাকে। @ অ্যাডিসের পরামর্শ অনুসারে এক বা একাধিক ক্রীতদাসের সাথে একজন মাস্টার লেখার প্রতিশ্রুতি থেকে পড়ার প্রশ্নগুলি আলাদা করতে পারেন। কম ডিবি সংযোগ ব্যবহার করা আপনাকে সামগ্রিক মাধ্যমে আরও ভাল আউটপুট দেবে।

অন্যান্য ক্লায়েন্টরা একই সাথে ইভেন্টগুলি পড়তে চাইতে পারে

এই অনুরোধগুলির জন্য, তাদের মাস্টার ডিবি থেকেও পড়তে হবে কারণ পঠিত দাসদের প্রতিরূপকরণ পিছিয়ে থাকবে।

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

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


টিবিএইচ পর্যাপ্ত হার্ডওয়ারের কোনও সু-প্রশাসিত ডাটাবেস এই লোডটি মোকাবেলা করতে সক্ষম হওয়া উচিত। ওপির সমস্যাটি ডাটাবেস পারফরম্যান্স বলে মনে হচ্ছে না তবে সংযোগের বিলম্ব হয়েছে; আমার অনুমান হেরোকু হ'ল একজন পাইস সরবরাহকারী তাদের আলাদা এডাব্লুএস অঞ্চলে পোস্টগ্র্রেস উদাহরণ বিক্রি করছে।
আমন

1

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

শুভকামনা

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