برنامه نویسی

اجرای بسیاری از سرورهای WebSocket – انجمن DEV

در Woovi ما 7 فرانت اند داریم و هر فرانت اند سرور مخصوص به خود را دارد.
برای ارائه DX بهتر، همه سرورها را فقط در یک سرور در حال توسعه اجرا می کنیم.
راه حل ما برای مدیریت بسیاری از سرورهای WebSocket در یک سرور، داشتن 1 سرور WebSocket در هر نقطه پایانی است.

سرور WebSocket در هر نقطه پایانی

import http from 'http';

import WebSocket, { WebSocketServer as WSWebSocketServer } from 'ws';

// work with commonjs and esm
const WebSocketServer = WebSocket.Server || WSWebSocketServer;

export const createWebsocketMiddleware = (
  propertyName = 'ws',
  options = {},
) => {
  if (options instanceof http.Server) options = { server: options };

  const wsServers = {};

  const getOrCreateWebsocketServer = (url: string) => {
    const server = wsServers[url];

    if (server) {
      return server;
    }

    const newServer = new WebSocketServer({
      ...(options.wsOptions || {}),
      noServer: true,
    });

    wsServers[url] = newServer;

    return newServer;
  };

  const websocketMiddleware = async (ctx, next) => {
    const upgradeHeader = (ctx.request.headers.upgrade || '')
      .split(',')
      .map((s) => s.trim());

    if (~upgradeHeader.indexOf('websocket')) {
      const wss = getOrCreateWebsocketServer(ctx.url);

      ctx[propertyName] = () =>
        new Promise((resolve) => {
          wss.handleUpgrade(
            ctx.req,
            ctx.request.socket,
            Buffer.alloc(0),
            (ws) => {
              wss.emit('connection', ws, ctx.req);
              resolve(ws);
            },
          );
          ctx.respond = false;
        });
      ctx.wss = wss;
    }

    await next();
  };

  return websocketMiddleware;
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

استفاده

const app = new Koa();

app.use(createWebsocketMiddleware());

const routes = new Router();

routes.all('/ws', async (ctx) => {
   if (ctx.wss) { // check if this is a websocket connection
      // connect to websocket - upgrade
      const client = await ctx.ws(); 
   }
});
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بیایید شیرجه بزنیم:

getOrCreateWebsocketServer یک سرور WebSocket موجود دریافت کنید یا یک سرور جدید بر اساس URL ایجاد کنید
upgradeHeader بررسی می کند که آیا درخواست می خواهد از WebSocket استفاده کند
wss.handleUpgrade درخواست ها برای استفاده از WebSocket را ارتقا می دهد

برای جمع بندی

این یک رویکرد عمومی است که به شما امکان می دهد سرورهای WebSocket زیادی را در یک سرور در هر نقطه پایانی داشته باشید.
می توان از آن در لوکال هاست برای بهبود DX یا حتی در تولید اگر ترافیک زیادی ندارید استفاده کرد.


وای
Woovi یک استارت آپ است که خریداران را قادر می سازد هر طور که دوست دارند پرداخت کنند. برای ایجاد این امکان، Woovi راه حل های پرداخت فوری را برای بازرگانان برای پذیرش سفارشات ارائه می دهد.

اگر می خواهید با ما کار کنید، ما استخدام می کنیم!


عکس تنبیر محمود در Unsplash

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا