রবলোক্স কীভাবে থেটা স্কেচেস ব্যবহার করে নির্মাতা অ্যানালিটিক্সকে স্কেল করেছে

আজকের রিয়েল-টাইম মাল্টিপ্লেয়ার গেমগুলির জন্য অ্যানালিটিক্স অপরিহার্য। Roblox-এ, আমরা আমাদের নির্মাতাদের উন্নতিতে সহায়তা করার জন্য পরিমাপের সরঞ্জাম তৈরি করতে মনোনিবেশ করছি। আমাদের বিনামূল্যের, সরাসরি ব্যবহারযোগ্য অ্যানালিটিক্স নির্মাতাদের তাদের অভিজ্ঞতার বৃদ্ধি, ব্যবহারকারী অর্জন এবং ধরে রাখার বিষয়ে তাৎক্ষণিক অন্তর্দৃষ্টি প্রদান করে, যা তাদের সাফল্য সর্বাধিক করতে সাহায্য করে।
লক্ষ লক্ষ Roblox নির্মাতারা যে আপ-টু-ডেট অ্যানালিটিক্স সিস্টেমের ওপর নির্ভর করেন, তা তৈরি করা একটি গুরুত্বপূর্ণ চ্যালেঞ্জ। এই চ্যালেঞ্জ মোকাবেলা করতে, আমরা আমাদের অ্যানালিটিক্স কুয়েরি ইঞ্জিনকে এমনভাবে অপ্টিমাইজ করেছি যে একটি 120-কোর প্রসেসিং ক্লাস্টার প্রায় 300,000 দৈনিক ভিজিটরের 86 TB ডেটা অ্যাক্সেসের মাধ্যমে প্রতিদিন 6 মিলিয়নেরও বেশি কুয়েরি সেবা দিতে পারে। আমাদের সমাধানের কেন্দ্রে রয়েছে একটি অনলাইন অ্যানালিটিক্যাল প্রসেসিং (OLAP) ডাটাবেস, যা আমরা এর স্কেলেবিলিটি এবং আনুমানিক অ্যালগরিদমের সাথে একীকরণের কারণে বেছে নিয়েছি। ডেটা রোলআপ কৌশল এবং HyperLogLog ও Theta Sketch অ্যালগরিদমের সংমিশ্রণ ব্যবহার করে, আমরা লক্ষ লক্ষ Roblox অভিজ্ঞতার জন্য অ্যানালিটিক্স প্রদান করি।
OLAP অ্যানালিটিক্সের একটি প্রারম্ভিক নির্দেশিকা
যত বেশি ডেটা কোয়েরি করা হয়, ফলাফল তৈরি করতে তত বেশি সময় লাগে। যখন আমরা প্রয়োজনীয় ডেটা কমাতে এবং বিশ্লেষণ প্রক্রিয়া দ্রুততর করতে পারি, তখন নির্মাতারা তাদের কর্মকাণ্ড থেকে প্রায় তাত্ক্ষণিক অন্তর্দৃষ্টি পেতে পারেন। আমরা যে কয়েকটি কৌশল ব্যবহার করি, সেগুলো হল:
- কলামভিত্তিক স্টোরেজ: OLAP Druid শুধুমাত্র প্রয়োজনীয় কলামগুলোই পড়ে।
- বিভাজন এবং সাজানোর ফিল্টার: OLAP শুধুমাত্র প্রাসঙ্গিক ফাইলগুলো পড়ে যা সরাসরি প্রয়োজনীয় ডেটা ব্লকগুলোতে সূচিবদ্ধ।
- রোলআপ: OLAP সাধারণ গ্রুপবিভাগ ব্যবহার করে ইভেন্টগুলোকে আংশিকভাবে একত্রিত করে।
রোলআপ বিশেষভাবে OLAP-গুলোকে বৃহত্তম SQL কোয়েরি ইঞ্জিন যেমন Spark বা Presto (যাদের ল্যাটেন্সি কয়েক দশক সেকেন্ড) এবং পয়েন্ট কোয়েরি বা সীমিত SQL, যা সাধারণত সম্পূর্ণরূপে অ্যাগ্রিগেটেড ডেটা সরবরাহ করে, এর মধ্যে কাজ করার সুযোগ দেয়। রোলআপের মাধ্যমে কোয়েরিগুলো মাত্রার গ্রুপিং অনুযায়ী কীড হয়, যার ফলে মোট সারি কার্ডিনালিটি ব্যাপকভাবে কমে যায়। যখন বিলিয়ন বা এমনকি ট্রিলিয়ন কাঁচা ইভেন্ট দেখা হয়, তখন সেগুলোকে মিলিয়ন গ্রুপে রোলআপ করা অনেক বেশি কার্যকর হতে পারে, যেগুলো উপ-সেকেন্ড লেটেন্সিতে একত্রিত করা যায়। উদাহরণস্বরূপ:

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

ক্যুয়েরি ইঞ্জিন নির্বাচন এবং অপ্টিমাইজেশন
পারফরম্যান্স চ্যালেঞ্জ অতিক্রম
প্রোডাকশন শ্যাডো টেস্টিংয়ের চূড়ান্ত রাউন্ডে আমরা একটি গুরুত্বপূর্ণ চ্যালেঞ্জ আবিষ্কার করেছি: একক বড় কোয়েরি থেকে দৈনিক অ্যাগ্রিগেশন প্যাটার্নে পরিবর্তন করার পর আমাদের MAU কোয়েরির পারফরম্যান্স বাড়াতে হয়েছিল। এগুলো আমাদের নির্মাতা বিশ্লেষণ ভিজ্যুয়ালাইজেশনের জন্য অত্যন্ত গুরুত্বপূর্ণ।
আমরা দেখেছি যে কোয়েরির গঠন আমাদের OLAP সমাধানের অন্তর্নিহিত কর্মক্ষমতাকে ব্যাপকভাবে প্রভাবিত করে। একাধিক কার্যনির্বাহী ধাপযুক্ত স্ট্যান্ডার্ড কোয়েরি (যেমন নেস্টেড "GROUP BY" স্টেটমেন্ট) প্রায়ই কাজের বড় অংশ হালকা-পাতলা ব্রোকার নোডগুলিতে ঠেলে দেয়।
এটি একটি ক্লাসিক বিগ ডেটা সমস্যা, যেখানে কুয়েরির কিছু অংশ গুরুত্বপূর্ণ ছোট সার্ভিং নোডে চলে যায়। আমরা আশা করেছিলাম আমাদের আনুমানিক ডেটা স্ট্রাকচারগুলো সাধারণ গণনা বা যোগের মতো কাজ করবে, কিন্তু আমরা দেখলাম এগুলো আসলে অনেক ভিন্নভাবে আচরণ করছে।
নিচের চিত্রটি সমস্যাটি ব্যাখ্যা করে। এতে দেখানো হয়েছে কীভাবে আমাদের ঐতিহাসিক নোডগুলো আংশিক সমষ্টিকরণ করত, প্রতিদিন একটি Theta Sketch তৈরি করে এবং তারপর তাদের ডেটা ব্রোকারে পাঠিয়ে দিত। এরপর ব্রোকার প্রতিটি বড় দৈনিক স্কেচকে একক মাসিক মান (প্রতিদিনের) মধ্যে একত্রিত করার চেষ্টা করত। ৩০ দিনের MAU-এর জন্য, এর মানে ছিল ব্রোকারে ১,৮০০টি সর্বোচ্চ-আকারের থিটা স্কেচ একত্রিত করা, যার ফলে একটি ধীর, ব্যর্থতা-প্রবণ কোয়েরি তৈরি হয়েছিল যা ব্রোকারের CPU একচেটিয়াভাবে ব্যবহার করছিল।

আমাদের সমাধান ছিল কম সংখ্যক বৃহৎ ঐতিহাসিক ওয়ার্কার নিয়ে OLAP চালানো, যাতে অনুমানমূলক কুয়েরিতে নির্ভরশীল ডেটা সোর্সগুলোর জন্য ডেটা লোকালিসিটি সর্বোচ্চ হয়। বাস্তবে, এর ফলে একটি মার্জ অপারেশন, যা ১০০ এমবি-র বেশি ডেটা প্রক্রিয়াকরণ দাবি করতে পারতো, তা আবার আমাদের ঐতিহাসিক নোডগুলোতে চাপিয়ে দেওয়া হয়েছে।
SQL-এ এটি অর্জন করতে, আমরা ইনলাইন জয়েন ব্যবহার করেছি যাতে কুয়েরিগুলো ঐতিহাসিক নোডগুলোতে প্রয়োজনীয় তথ্য প্রেরণ করতে পারে এবং ইনলাইন ফলাফল তারিখের একটি তালিকা সহ একটি কুয়েরি প্রস্তুত করেছি। প্রতিটি ফলাফল তারিখ তারপর ঐতিহাসিক নোড সেগমেন্টগুলো থেকে প্রাসঙ্গিক ডেটা সংগ্রহ করতে পারে। এরপর ডেটা ব্রোকারে ফেরত পাঠানো হয়, যেখানে ফলাফলগুলো দ্রুত একটি একক মানচিত্র—ফলাফল তারিখ থেকে মেট্রিক ডেটা—এ একত্রিত হয়, যেমনটি নিচে দেখা যাচ্ছে।

এই অপ্টিমাইজেশন বৃহৎ-স্কেল কোয়েরির কর্মক্ষমতায় নাটকীয় প্রভাব ফেলেছে। একটি প্রধান অভিজ্ঞতার MAU-এর দেশভিত্তিক বিভাজন অনুযায়ী গড় কোয়েরি কর্মক্ষমতা ৫ গুণ (১৭.৫৩ সেকেন্ড থেকে ৩.২৩ সেকেন্ড) উন্নত হয়েছে, যা নীচের চার্টে দেখানো হয়েছে। আমরা ব্রোকারে CPU সময়ে ৫০ গুণ হ্রাস (১৬.৮৩ সেকেন্ড থেকে ০.৩৪ সেকেন্ড) দেখেছি।
যদিও ফলাফল ভিন্ন হতে পারে, এটি জটিল অপারেশন (যেমন লক্ষ লক্ষ স্কেচ একত্রিত করা) সাবধানে পরিচালনার গুরুত্বকে তুলে ধরে। এই অপারেশনগুলোকে সাধারণ অ্যাগ্রিগেশনের সমতুল্য মনে করলে উল্লেখযোগ্য কর্মক্ষমতা সমস্যা দেখা দিতে পারে, বিশেষ করে এমন সিস্টেমে যেখানে শেষ-মাইল ক্লায়েন্ট অ্যাগ্রিগেশন সাধারণ।
রোলআপস এবং একটি তাত্ত্বিক থিটা কিউব

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


কারণ আমরা এই ত্রুটির হার দ্রুত হিসাব করতে পারি, তাই এটিও একটি শক্তিশালী সংকেত যে কাঁচা টেবিল পড়া সম্ভবত কার্যকর হবে। যেখানে ওভারল্যাপিং ডেটা ইউনিয়নের তুলনায় কম (উদাহরণস্বরূপ জার্মানিতে জাপানি ভাষাভাষীরা), সেখানে কাঁচা টেবিলের অনেক সারি ফিল্টার হয়ে যাবে। এর ফলে দক্ষ পুশডাউন অপ্টিমাইজেশন ঘটে। ডাইমেনশন গ্রুপ, আনুমানিক জয়েন এবং ত্রুটি-ভিত্তিক কাঁচা টেবিল রিড ব্যবহার করে এমন একটি সিস্টেম আনুমানিক-বান্ধব কুয়েরিতে রোলআপ কর্মক্ষমতা সর্বোচ্চ করবে।
Roblox-এর জন্য, এই সমাধানটি আমাদের পরবর্তী স্কেল স্তরে—সম্ভবত ডায়নামিক ফানেল বা কাস্টম ইভেন্ট বিশ্লেষণের জন্য—আরও প্রযোজ্য হবে, যখন আমাদের বর্তমান সাধারণ রোলআপ রেপ্লিকা আজকের চাহিদা পূরণ করছে।
একটি স্ব-সেবা প্ল্যাটফর্ম তৈরি
আমাদের ব্রোকার অপ্টিমাইজ করার পর, আমরা আমাদের OLAP সলিউশনে যুক্ত ডেটাসেটগুলির অনবোর্ডিং এবং কোয়েরির জন্য টুল তৈরি করতে মনোনিবেশ করি। আমরা আমাদের ডেটাস্কেচ ফাংশনগুলির জন্য একটি ওপেন-সোর্স Spark এবং Trino UDAF লাইব্রেরি তৈরি করেছি, যা Spark-কে আমাদের OLAP6-এর মতো একই বাইনারি ডেটাস্কেচ ফরম্যাট ব্যবহার করতে দেয়। এর ফলে আমাদের অধিকাংশ কম্পিউট ওয়ার্কলোড Spark-এ রাখা সম্ভব হয়েছে এবং Roblox জুড়ে অনুমানের মানকীকরণে সহায়তা করেছে, যা নির্দিষ্ট কিছু ডেটাসেটের জন্য কম্পিউট খরচ সর্বোচ্চ ৮০% পর্যন্ত কমাতে পারে।
আমরা আমাদের ব্যাচ জব শিডিউলার-এ একটি অভ্যন্তরীণ এক্সটেনশন যোগ করে অনবোর্ডিং সহজ করেছি এবং ডেটাফ্রেম-স্টাইল একটি API সংজ্ঞায়িত করেছি যা ডেভেলপারদের নির্দিষ্ট মেজার এবং ডাইমেনশন নির্ধারণে গাইড করে, ফলে ওপেন কোয়েরির প্রভাব কমে যায়। আমরা আমাদের OLAP-এ এই ডেটা কীভাবে লোড এবং কোয়েরি করি তার কিছু নমুনা ওয়ার্কফ্লোও ওপেন-সোর্স করেছি।
আমাদের অপ্টিমাইজড অ্যানালিটিক্স ডেটাসেটগুলো এখন আমাদের নির্মাতাদের গভীর অন্তর্দৃষ্টি প্রদান করছে। আমাদের অপ্টিমাইজেশন গড় কর্মক্ষমতা ৪ গুণ এবং সবচেয়ে খারাপ ক্ষেত্রে কর্মক্ষমতা ৫০ গুণ উন্নত করেছে। স্ব-পরিষেবা প্ল্যাটফর্মটি আমাদের ক্রিয়েটর অ্যানালিটিক্স দলকে ডেভেলপারদের জন্য নতুন ডেটাসেট নিয়ে অব্যাহত পুনরাবৃত্তি করতে সক্ষম করে। আমরা সব আকারের ডেভেলপারদের এই টুলগুলো ব্যবহার করে Roblox-এ অবিশ্বাস্য অভিজ্ঞতা তৈরি করতে দেখার জন্য উচ্ছ্বসিত।
1 যে কোনো অ্যাক্সেস
সহ অনন্য ইউনিভার্সের শেষ ৬০ দিনের হিসাব 2 এই সরল MAU কোয়েরির
মতো 3 ফলাফল ২১–২৮ মার্চ, ২০২৫ থেকে
4 এভাবে সম্পাদিত: SELECT c.experience_id, c.country, p.platform, THETA_INTERSECT(c.user_theta, p.user_theta) from (select experience_id, country, user_theta from theta_cube where agg_level = country) c union (select experience_id, platform, user_theta from theta_cube where agg_level = platform) p
5 https://datasketches.apache.org/docs/Theta/ThetaSketchSetOpsAccuracy.html
6 druid sql ফাংশনের মাধ্যমে COMPLEX_DECODE_BASE64('HLLSketch', sketch_col_name ).


