اجرای بسیاری از سرورهای 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