আমরা এমন একটি পরিস্থিতি পেয়েছি যেখানে আমাদের সার্ভারে আসা প্রচুর ইভেন্টের স্রোতে আমার প্রতি সেকেন্ডে প্রায় 1000 ইভেন্টে মোকাবিলা করতে হবে (পিকটি 2000 ডলার হতে পারে)।
সমস্যাটি
আমাদের সিস্টেম হিরোকুতে হোস্ট করা হয়েছে এবং তুলনামূলকভাবে ব্যয়বহুল হিরোকু পোস্টগ্রিস ডিবি ব্যবহার করে , যা সর্বোচ্চ 500 ডিবি সংযোগের অনুমতি দেয়। আমরা সার্ভার থেকে ডিবিতে সংযোগ করতে সংযোগ পুলিং ব্যবহার করি।
ডিবি সংযোগ পুল যেভাবে পরিচালনা করতে পারে তার চেয়ে বেশি ইভেন্ট ইভেন্টগুলিতে আসে
আমাদের সমস্যাটি হ'ল সংযোগ পুল হ্যান্ডল করার চেয়ে ইভেন্টগুলি দ্রুত চলে আসে। কোনও সংযোগটি সার্ভার থেকে ডিবিতে নেটওয়ার্কের রাউন্ডট্রিপ শেষ করে, তাই এটি পুলটিতে আবার মুক্তি পেতে পারে, n
অতিরিক্ত ইভেন্টের চেয়ে আরও বেশি কিছু আসে।
ঘটনাচক্রে ঘটনাগুলি সজ্জিত হয়, সংরক্ষণের জন্য অপেক্ষা করে এবং পুলে কোনও উপলভ্য সংযোগ না থাকায় এগুলি শেষ হয়ে যায় এবং পুরো সিস্টেমটি অপ-কার্যক্ষম হয়।
আমরা ক্লায়েন্টদের কাছ থেকে ধীর গতিতে আপত্তিকর উচ্চ-ফ্রিকোয়েন্সি ইভেন্টগুলি নির্ধারণের মাধ্যমে জরুরি সমাধান করেছি, তবে আমরা এখনও এই উচ্চ-ফ্রিকোয়েন্সি ইভেন্টগুলি পরিচালনা করতে চাইলে আমাদের কীভাবে এই পরিস্থিতিগুলি পরিচালনা করতে হবে তা জানতে চাই।
সীমাবদ্ধতাসমূহ
অন্যান্য ক্লায়েন্টরা একই সাথে ইভেন্টগুলি পড়তে চাইতে পারে
অন্যান্য ক্লায়েন্টরা ক্রমাগত সমস্ত ইভেন্টকে ডিবিতে সংরক্ষণ না করা সত্ত্বেও একটি নির্দিষ্ট কী সহ সমস্ত ইভেন্ট পড়ার অনুরোধ করে।
কোনও ক্লায়েন্ট GET api/v1/events?clientId=1
ক্লায়েন্ট 1 এর মাধ্যমে প্রেরিত সমস্ত ইভেন্টকে জিজ্ঞাসা করতে এবং সেগুলি পেতে পারে, যদিও সেই ইভেন্টগুলি কেবলমাত্র ডিবিতে সংরক্ষণ না করা হয়।
কীভাবে এটি মোকাবেলা করতে হবে তার কোনও "শ্রেণিকক্ষ" উদাহরণ রয়েছে?
সম্ভাব্য সমাধান
আমাদের সার্ভারে ইভেন্টগুলি সারিবদ্ধ করুন
আমরা সার্ভারে ইভেন্টগুলি সারিবদ্ধ করতে পারি (সংযোগ পুলটি শেষ না হওয়ার সাথে সারি সর্বাধিক সম্মতিযুক্ত 400 রয়েছে)।
এটি খারাপ ধারণা কারণ:
- এটি উপলব্ধ সার্ভার মেমরি খেয়ে ফেলবে। স্ট্যাকড আপ সারিবদ্ধ ইভেন্টগুলি প্রচুর পরিমাণে র্যাম গ্রহণ করবে।
- আমাদের সার্ভারগুলি প্রতি 24 ঘন্টা পরে পুনরায় চালু হয় । এটি হিরোকু দ্বারা আরোপিত একটি কঠিন সীমা । ইভেন্টগুলি সারিবদ্ধ হওয়া অবস্থায় সার্ভারটি পুনরায় আরম্ভ করতে পারে যার ফলে আমাদের ত্রুটিযুক্ত ইভেন্টগুলি হারাতে পারে।
- এটি সার্ভারে স্থিতি প্রবর্তন করে, ফলে স্কেলাবিলিটিটি আহত হয়। যদি আমাদের একটি মাল্টি-সার্ভার সেটআপ থাকে এবং কোনও ক্লায়েন্ট সমস্ত এনকুইড + সংরক্ষিত ইভেন্টগুলি পড়তে চায় তবে আমরা কোন সার্ভারে এনকুইড ইভেন্টগুলি লাইভ করব তা জানব না।
একটি পৃথক বার্তা সারি ব্যবহার করুন
আমি ধরে নিই যে আমরা একটি বার্তার সারিটি ব্যবহার করতে পারি (যেমন রাবিট এমকিউ ?), যেখানে আমরা বার্তাগুলি এতে পাম্প করি এবং অন্য প্রান্তে অন্য একটি সার্ভার রয়েছে যা কেবলমাত্র ডিবিতে ইভেন্টগুলি সংরক্ষণ করার জন্য ডিল করে।
আমি নিশ্চিত নই যে মেসেজের কাতাগুলি এনকুইড ইভেন্টগুলিকে জিজ্ঞাসা করার অনুমতি দেয় (যা এখনও সংরক্ষণ করা হয়নি) সুতরাং অন্য ক্লায়েন্ট যদি অন্য ক্লায়েন্টের বার্তা পড়তে চান তবে আমি কেবল ডিবি থেকে সংরক্ষিত বার্তাগুলি এবং কাতার থেকে থাকা ম্যাসেজগুলি পেতে পারি এবং তাদের একত্রে সম্মতি জানাই যাতে আমি তাদেরকে পুনরায় পড়ার অনুরোধ ক্লায়েন্টের কাছে পাঠাতে পারি।
একাধিক ডাটাবেস ব্যবহার করুন, প্রতিটি বার্তাগুলির একটি অংশ কেন্দ্রীয় ডিবি-কো-অর্ডিনেটর সার্ভারের সাথে পরিচালনা করতে সেগুলি পরিচালনা করে
আমাদের আর একটি সমাধান হ'ল কেন্দ্রীয় একটি "ডিবি সমন্বয়কারী / লোড ব্যালেন্সার" সহ একাধিক ডাটাবেস ব্যবহার করা। কোনও ইভেন্ট পাওয়ার পরে এই সমন্বয়কারী বার্তাটি লেখার জন্য একটি ডাটাবেস বেছে নেবে। এটি আমাদের একাধিক হেরোকু ডাটাবেস ব্যবহার করার অনুমতি দেয় যাতে এইভাবে সংযোগের সীমা 500 x সংখ্যক ডাটাবেসে উন্নীত হয়।
একটি পাঠ্য ক্যোয়ারিতে, এই সমন্বয়কারী SELECT
প্রতিটি ডাটাবেসে প্রশ্নগুলি সরবরাহ করতে পারে , সমস্ত ফলাফলকে মার্জ করে এবং সেই ক্লায়েন্টের কাছে পাঠাতে অনুরোধ করে যা তাদের পাঠিয়ে দিতে পারে।
এটি খারাপ ধারণা কারণ:
- এই ধারণাটি মনে হচ্ছে ... আহেম .. ওভার ইঞ্জিনিয়ারিং? পাশাপাশি পরিচালনা করার জন্য একটি দুঃস্বপ্ন হবে (ব্যাকআপগুলি ইত্যাদি)) এটি নির্মাণ এবং রক্ষণাবেক্ষণ করা জটিল এবং এটি একেবারে প্রয়োজনীয় না হলে এটি KISS লঙ্ঘনের মতো শোনাচ্ছে ।
- এটি ধারাবাহিকতা ত্যাগ করে । আমরা যদি এই ধারণাটি নিয়ে চলে যাই তবে একাধিক ডিবিতে লেনদেন করা কোনও উপায় নেই।
ANALYZE
নিজেরাই অনুসন্ধানগুলি চালিয়েছি এবং এগুলি কোনও সমস্যা নয় are আমি সংযোগ পুল অনুমানটি পরীক্ষা করার জন্য একটি প্রোটোটাইপও তৈরি করেছি এবং যাচাই করেছি যে এটি আসলেই সমস্যা। ডাটাবেস এবং সার্ভার নিজেই বিভিন্ন মেশিনে লাইভ করে তাই বিলম্ব। এছাড়াও, হিরোকুকে একান্ত প্রয়োজন না হলে ছেড়ে দিতে চাই না, মোতায়েনের বিষয়ে উদ্বিগ্ন না হওয়া আমাদের জন্য একটি বিশাল প্লাস।
select null
500 সংযোগে জারি করার চেষ্টা করুন । আমি বাজি ধরছি আপনি দেখতে পাবেন যে সংযোগ পুলটি সেখানে সমস্যা নয়।