𝗦𝗶𝗺𝗽𝗹𝗲 𝗟𝗶𝘃𝗲 𝗖𝗵𝗮𝘁 𝗔𝗹𝗺𝗼𝘀𝘁 𝗦𝗮𝗻𝗸 𝗧𝗵𝗶𝘀 𝗥𝗲𝗹𝗲𝗮𝘀𝗲
ایک بنیادی لائیو چیٹ سسٹم نے میری تازہ ترین ریلیز کو تقریباً برباد کر دیا تھا۔
یہ سننے میں سادہ لگتا ہے۔ آپ قریبی صارفین کو دکھاتے ہیں اور انہیں بات کرنے دیتے ہیں۔ لیکن تکنیکی حقیقت کہیں زیادہ مشکل ہے۔ مجھے لائیو چیٹ کو جیو لوکیشن (geolocation) اور ریٹنگ سسٹم کے ساتھ جوڑنا پڑا۔ اس سے اندرونی طور پر بہت زیادہ پیچیدگی پیدا ہوگئی۔
آرکیٹیکچر (The Architecture):
• فرنٹ اینڈ (Frontend): React اور TypeScript۔ • بیک اینڈ (Backend): Node.js، Express اور WebSockets کے ساتھ۔ • ڈیٹا بیس (Database): صارفین اور ریٹنگز کے لیے PostgreSQL۔ • کیش (Cache): ایکٹو سیشنز اور موجودگی (presence) کے لیے Redis۔
جیو لوکیشن (Geolocation) کا مسئلہ
مقام (location) کے ذریعے صارفین کو میچ کرنا آسان نہیں ہے۔ مجھے کئی مشکل صورتحال (edge cases) کو سنبھالنا پڑا:
- لیٹی ٹیوڈ (latitude) اور لونگی ٹیوڈ (longitude) کو اسٹور کرنا۔
- فاصلے کی查询 (query) کرنے کے لیے Postgres extensions کا استعمال کرنا۔
- ان صارفین کو سنبھالنا جو لوکیشن کی اجازت نہیں دیتے۔
- جب کوئی صارف ایپ کھولے بغیر حرکت کرتا ہے تو پرانے (stale) ڈیٹا کو مینیج کرنا۔
اگر میں یہ دوبارہ کرتا، تو میں لوکیشن اکٹھا کرنے کے عمل کو میچنگ کے عمل سے الگ الگ سروسز میں تقسیم کر دیتا۔
لائیو چیٹ کی حقیقت
WebSockets ریئل ٹائم فیچرز لاتے ہیں، لیکن وہ افراتفری بھی لاتے ہیں۔ میں نے مختلف سرورز پر پیغامات بھیجنے کے لیے Redis pub/sub کا استعمال کیا۔
مشکل ترین حصے یہ تھے:
- جب صارفین غیر متوقع طور پر ڈس کنیکٹ ہو جائیں تو کنکشنز کو صاف کرنا (cleaning up)۔
- پیغامات کو ان رومز میں بھیجے جانے سے روکنا جنہیں صارف چھوڑ چکا ہو۔
- 'گھوسٹ سیشنز' (ghost sessions) بنائے بغیر دوبارہ کنیکٹ ہونے کے عمل کو سنبھالنا۔
میں نے سیکھا کہ سادہ فلیگز (flags) کے استعمال کے مقابلے میں ایک باقاعدہ اسٹیٹ مشین (state machine) بہتر ہے۔
ریٹنگ سسٹم
ریٹنگز تب تک معمولی معلوم ہوتی ہیں جب تک آپ انہیں خود نہ بنائیں۔ مجھے اس بات کو یقینی بنانا پڑا کہ:
- صارفین ایک ہی سیشن کو دو بار ریٹ نہ کر سکیں۔
- پروفائل ویوز کے لیے ریٹنگز تیزی سے جمع (aggregate) ہو سکیں۔
- ایپ میں ڈیٹا مستقل (consistent) رہے۔
میں نے ڈپلیکیٹس کو روکنے کے لیے سیشن آئی ڈیز پر یونیک کنسٹرینٹس (unique constraints) کا استعمال کیا اور کارکردگی بہتر بنانے کے لیے اوسط (averages) کو کیش (cache) کر لیا۔
سیکھے گئے اسباق
اگر میں آج اسے دوبارہ بناتا ہوں، تو میں تین چیزیں تبدیل کروں گا:
- میچنگ اور چیٹ کو الگ الگ ماڈیولز میں تقسیم کرنا۔
- WebSocket کنکشن اسٹیٹس کے لیے واضح ماڈلنگ کا استعمال کرنا۔
- پہلے دن سے ہی چیٹ اور میچنگ کے لیے بہتر لاگز (logs) اور میٹرکس (metrics) شامل کرنا۔
سافٹ ویئر بنانا چھوٹے چھوٹے فیصلوں کا ایک سلسلہ ہے۔ یہی فیصلے طے کرتے ہیں کہ آپ کا سسٹم صاف ستھرا ہے یا ناپائیدار (brittle)۔
کیا آپ نے کبھی لائیو چیٹ یا میچنگ سسٹم بنایا ہے؟ آپ کیا مختلف کرتے؟
ماخذ (Source): https://dev.to/jaeger974/simple-live-chat-almost-sank-this-release-2pn7