چگونه مشکل مقیاس بندی WebSocket را بدون شکستن بانک حل کردم

مدت‌ها پیش، خودم را در موقعیتی دیدم که مجبور شدم یک سیستم مقیاس‌پذیر ایجاد کنم که بتواند صدها اتصال همزمان را با هزینه‌ای نه چندان زیاد و با زمان پاسخگویی معقول، اما نه فوری، مدیریت کند.

اولین افکار من؟ بیایید همه اقدامات ایجاد/ویرایش/حذف را به صف انتقال دهیم و از طریق WebSocket به کاربران اطلاع دهیم که آیا اقدامات آنها موفقیت آمیز بوده یا خیر.

اما در آن زمان، من تجربه زیادی با WebSockets در تولید نداشتم، بنابراین اولین قدم من این بود که با کمک آموزش‌ها، سرریز پشته‌ها و منابع دیگر بررسی کنم که چگونه کار می‌کند.

بنابراین، پس از مدتی، خلاصه ای از نحوه کارکرد آن را فهمیدم و شروع به تهیه یک کد کردم و برای مدتی با ابزار تست بارگذاری برای شبیه سازی ترافیک بالا شروع به تهیه کد کردم.

مشکل اول

برخی از پرسش‌ها و پاسخ‌ها فراخوانی روش اشتراک را در نمونه Redis در سرویس گیرنده WebSocket متصل پیشنهاد می‌کنند.

io.sockets.on('connection', function (sockets) {
    sockets.emit('message',{Hello: 'World!'});
    sub.subscribe('attack-map-production');

    sockets.on('disconnect', function() {
            sub.unsubscribe('attack-map-production');
    });
});

اما به این ترتیب، ما در حال ایجاد یک اتصال جدید به Redis هستیم، بنابراین استفاده از حافظه در برنامه ما و استخر اتصال Redis در حال افزایش است. (Redis تنها 10 هزار اتصال را به یک…

Source link