কম্পিউটার টিউটোরিয়াল

Kafka দিয়ে রুবি অ্যাপস উন্নত করা: একটি প্রমাণিত Sidekiq সাকসেস স্টোরি

একটি সর্বদা বেড়ে যাওয়া all-in-one APM হিসেবে, আমরা অ্যাপসিগন্যাল কীভাবে আমাদের ট্রাফিক বৃদ্ধির সাথে মোকাবিলা করবে সেটা নিশ্চিত করার জন্য অনেক সময় ব্যয় করি। সাধারণত, আমরা এটা নিয়ে কথা বলি না; আমাদের ব্লগ রুবির হুডের নিচে জিনিসপত্র বা এলিক্সিরের সাথে ক্রেজি জিনিসপত্র সম্পর্কে আর্টিকেলে ভরা, কিন্তু অ্যাপসিগন্যাল কী টিক করে সেটা নিয়ে নয়।

এইবারের মुद্দে, আমরা গত কয়েক বছরে আমাদের স্ট্যাকে করা কিছু বড় পরিবর্তন শেয়ার করতে চাই, যাতে আমরা (সহজে) প্রতি মাসে ডবল-ডিজিট বিলিয়ন রিকোয়েস্ট রিয়েল-টাইমে প্রসেস করতে পারি। আজ আমরা আমাদের স্কেলিং অভিজ্ঞতা ব্যবহার করি আমাদের নিজস্ব স্ট্যাক নিয়ে আলোচনা করতে এবং আপনাকে সাহায্য করতে।

স্ট্যান্ডার্ড রেইলস সেটআপ থেকে কাস্টম পার্টসের দিকে

AppSignal একটি বেশ স্ট্যান্ডার্ড রেইলস সেটআপ দিয়ে শুরু হয়েছিল। আমরা একটি রেইলস অ্যাপ ব্যবহার করতাম যা একটি API এন্ডপয়েন্ট 통해 ডেটা কালেক্ট করত এবং Sidekiq জব তৈরি করত ব্যাকগ্রাউন্ডে প্রসেস করার জন্য।

কিছুক্ষণ পর আমরা রেইলস API কে একটি Rack মিডলওয়্যার দিয়ে রিপ্লেস করলাম কিছু গতি পেতে এবং পরে এটি একটি Go ওয়েব সার্ভার দিয়ে রিপ্লেস করা হয়েছিল যা Sidekiq-কম্প্যাটিবল জব রেডিসে পুশ করত।

অ্যাপ স্টেট এবং ইনক্রিমেন্ট/আপডেট

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

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

Kafka-র প্রবেশ

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

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

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

Kafka এবং Ruby/Rails সংযোগ

যখন আমরা এই ট্রানজিশন শুরু করেছিলাম, তখন কয়েকটি Kafka রুবি জেম ছিল, কিন্তু কোইও লেটেস্ট (उस সময় 0.10.x) Kafka রিলিজের সাথে কাজ করত না এবং অধিকাংশ আনমেইনটেইনড ছিল।

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

শেষে আমরা একটি আলাদা সমাধান বের করলাম। আমাদের Kafka স্ট্যাক Rust-এ বিল্ট এবং আমরা একটি ছোট বাইনারি লিখলাম যা একটি sidekiq_out টপিক কনসিউম করে এবং রেডিসে Sidekiq-কম্প্যাটিবল জব তৈরি করে। এইভাবে আমরা এই বাইনারি আমাদের ওয়ার্কার মেশিনে ডিপ্লয় করতে পারি এবং এটি Sidekiq-এ নতুন জব ফিড করবে ঠিক वैसेই जैसे আপনি রেইলসের ভিতর থেকে করতেন।

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

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

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

আমরা Protobuf ব্যবহার করি আমাদের সকল (ইন্টারন্যাল) মেসেজ ডিফাইন করতে, এইভাবে আমরা নিশ্চিত হতে পারি যে যদি টেস্ট পাস করে, ওয়ার্কারটি সঠিকভাবে Kafka থেকে জব প্রসেস করবে।

শেষ পর্যন্ত এই সমাধান আমাদের অনেক সময় এবং শক্তি বাঁচিয়েছে এবং আমাদের রুবি টিমের জীবন অনেক সহজ করে দিয়েছে।

ফায়দা এবং ক্ষতি

সব কিছুর মত এখানেও কয়েকটি প্রস এবং কনস আছে এই সেটআপের:

Pros:

  • রুবিতে কোনো পরিবর্তন লাগেনি, API কম্প্যাটিবল
  • ডিপ্লয় এবং রিভার্ট করা সহজ
  • Kafka এবং রুবির মধ্যে সুইচ করা সহজ
  • লিমিটার ব্যবহার করলে রেডিস মেসেজ দিয়ে ওভারলোড হয় না, সার্ভারে মেমরি বাঁচায়, মেসেজগুলো Kafka-এ রাখে।
  • হরিজেন্টাল স্কেলিং ছোট ক্যাশে লিড করে প্রতিটি সার্ভারে, কি করা মেসেজের কারণে।

Cons:

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

Sidekiq এবং Kafka

Sidekiq ব্যবহার করে আমরা অত্যন্ত সাহায্য পেয়েছি আমাদের প্রসেসিং পাইপলাইন Kafka-এ মাইগ্রেট করার সময়। আমরা এখন почти সম্পূর্ণরূপে Sidekiq থেকে দূরে যাচ্ছি এবং সব কিছু হ্যান্ডেল করছি আমাদের Kafka ড্রাইভার দিয়ে সরাসরি, কিন্তু সেটা আরেকটি আর্টিকেলের জন্য।

এই হ্যাপি এন্ডিং lurrভ স্টোরিকে মোড় দিয়েছে। আশা করি আপনি এই পারফরম্যান্স এবং স্কেলিংর পারস্পেক্টিভ এবং AppSignal স্কেলিংর অভিজ্ঞতা উপভোগ করেছেন। আমরা আশা করি আমাদের স্ট্যাক নিয়ে সিদ্ধান্তগুলোর এই গল্প, অনുവর্তে, আপনাকে সাহায্য করবে।

ব্লগের বাকি অংশ চেক আউট করুন বা আমাদের ফলো করুন যাতে আমাদের Kafka সেটআপ সম্পর্কে পরবর্তী এপিসোড পাবলিশ হলে আপনি জানতে পারেন। এবং আপনি যদি একটি all-in-one APM খুঁজেন যা সত্যিকারায় ডেভেলপারদের দ্বারা ডেভেলপারদের জন্য, আমাদের খুঁজে বের করুন।

  1. RuboCop দিয়ে রুবি কোড কোয়ালিটি উন্নত: লিন্টিং ও অটো-ফরম্যাটিং

  2. রুবি লগিং মাস্টারি: Logger এবং Lograge-এ এক্সপার্ট গাইড

  3. রুবি স্ট্যাক ট্রেস মাস্টার করুন: কীভাবে পড়বেন এবং ডায়াগনোজ করবেন

  4. রুবি কোড দ্রুত করুন: ৪টি প্রমাণিত মেমোইজেশন প্যাটার্ন এবং একটি অপরিহার্য জেম