Apache AGE দিয়ে গ্রাফ-ভিত্তিক ভিডিও রিলেশনশিপ কুয়েরি তৈরি করা
আমাদের সবচেয়ে ব্যয়বহুল কুয়েরি ছিল একটি সাধারণ "show related videos" প্যানেল।
ViralVidVault-এ আমরা ভিডিও ট্রেন্ড ট্র্যাক করি। আমরা দেখেছি যে শেয়ার করা চ্যানেল বা কো-ভিউড (co-viewed) সেশনের মাধ্যমে সম্পর্কিত ভিডিও খুঁজে বের করা আমাদের ডাটাবেস পারফরম্যান্সকে মারাত্মকভাবে কমিয়ে দিচ্ছিল। আমরা রিকার্সিভ জয়েনসহ (recursive joins) SQLite ব্যবহার করার চেষ্টা করেছিলাম। এটি এক হপ (one hop) পর্যন্ত কাজ করেছিল। কিন্তু দুই হপ-এ গিয়ে ডেটার পরিমাণ বিশাল হয়ে যায়। একটি মাত্র কুয়েরি লক্ষ লক্ষ রো (row) তৈরি করছিল। আমাদের ওয়ার্কাররা টাইম-আউট হতে শুরু করল।
ডেটা আসলে একটি গ্রাফ। আমরা এটিকে টেবিলের মধ্যে জোর করে ঢোকানোর চেষ্টা করছিলাম এবং তার মাসুল দিচ্ছিলাম।
আমরা রিলেশনশিপ লেয়ারটি Apache AGE-এ সরিয়ে নিয়েছি। এটি PostgreSQL-এর জন্য একটি openCypher এক্সটেনশন। আমরা আমাদের PHP 8.4 অ্যাপ এবং SQLite স্টোর অপরিবর্তিত রেখেছি।
ফলাফলসমূহ: • রিলেটেড প্যানেলের ল্যাটেন্সি (latency) ৯০০ms থেকে কমে ৪০ms-এর নিচে নেমে এসেছে। • জটিল টু-হপ ট্রাভার্সাল (two-hop traversals) এখন মাত্র এক অঙ্কের মিলিসেকেন্ড সময় নেয়। • আমাদের অপারেশনাল কাজের চাপ একই রয়েছে কারণ AGE সরাসরি Postgres-এর ভেতরে চলে।
একটি স্ট্যান্ডঅ্যালোন (standalone) গ্রাফ ডাটাবেসের পরিবর্তে কেন Apache AGE ব্যবহার করবেন?
১. অপারেশনাল সরলতা (Operational Simplicity) ব্যাকআপ বা নিরাপত্তার জন্য আপনার নতুন কোনো ডাটাবেসের প্রয়োজন নেই। AGE আপনার বিদ্যমান Postgres সেটআপ, কানেকশন পুল এবং সিকিউরিটি রুলস ব্যবহার করে।
২. নেটিভ গ্রাফ কুয়েরি (Native Graph Queries) SQL-এ ভ্যারিয়েবল-লেংথ পাথ (variable-length paths) এর জন্য জটিল রিকার্সন প্রয়োজন হয়। কিন্তু Cypher-এ আপনি এগুলোকে সহজ প্যাটার্ন হিসেবে লিখতে পারেন। একটি ৪০ লাইনের রিকার্সিভ SQL ব্লক মাত্র ৬ লাইনের একটি Cypher কুয়েরিতে পরিণত হয়েছে।
৩. উন্নত পারফরম্যান্স একটি গ্রাফ ইঞ্জিন অ্যাডজাসেন্সি (adjacency) ইনডেক্স করে। এটি ম্যাচ করে না এমন পাথগুলো এক্সপ্যান্ড করা বন্ধ করে দেয়। এটি ডেটা ফ্যান-আউট (data fan-out) রোধ করে, যা আমাদের আগের সিস্টেমটিকে ক্র্যাশ করিয়েছিল।
আমাদের মাইগ্রেশন থেকে একটি গুরুত্বপূর্ণ শিক্ষা: সবসময় আপনার এন্ট্রিপয়েন্ট প্রপার্টিজগুলো (entrypoint properties) ইনডেক্স করুন। আপনি যদি ট্রাভার্সাল শুরু করার জন্য ব্যবহৃত ID-টি ইনডেক্স না করেন, তবে AGE একটি ফুল স্ক্যান (full scan) করবে। এটি এমনকি সেরা গ্রাফ কুয়েরিকেও ধীরগতির করে তোলে।
আমরা গ্রাফটিকে একটি রিড মডেল (read model) হিসেবে ব্যবহার করি। আমাদের র (raw) ডেটা SQLite-এ থাকে। আমরা এই দুটিকে সিঙ্ক করার জন্য একটি Python স্ক্রিপ্ট ব্যবহার করি। এটি আমাদের গ্রাফকে দ্রুত, লাইটওয়েট এবং পুনরায় তৈরি করা সহজ রাখে।
আপনার রিকার্সিভ SQL কুয়েরিগুলো যদি খুব জটিল হয়ে ওঠে, তবে রিলেশনাল মডেলের সাথে লড়াই করবেন না। আপনার বর্তমান স্টোরের পাশাপাশি একটি ছোট গ্রাফ প্রজেকশন (graph projection) তৈরি করুন।
