缩放

根据您的要求,您的Feathers应用可能需要提供高可用性.Feathers旨在扩展.

Feathers应用程序中使用的传输类型将影响缩放配置.例如,仅使用 feathers-rest 适配器的Feathers应用程序将需要较少的缩放配置,因为HTTP是无状态协议.如果通过 feathers-socketiofeathers-primus 适配器使用websockets(有状态协议),配置可能会更复杂,以确保websockets正常工作.

水平缩放

水平缩放指的是:

  • 设置 cluster,或

  • 添加更多机器以支持您的应用程序

为了实现高可用性,可以使用两种策略的不同组合.

群集配置

support内置于核心NodeJS中.由于NodeJS是单线程的,因此集群允许您在多个子进程(和多个线程)之间轻松分发应用程序请求.在多核环境中运行Feathers时,群集是一个不错的选择.

下面是使用 feathers-socketio 提供程序向 Feathers 添加聚类的示例.默认情况下, websocket连接通过多个HTTP请求的握手开始, 并升级到websocket协议.但是, 启用群集时, 同一工作程序将不会处理握手的所有HTTP请求, 从而导致HTTP 400错误.为确保握手成功, 强制单个工作人员通过禁用http传输并专门使用 websocket 传输来处理握手.

禁用websockets的HTTP传输时需要注意很明显的副作用.虽然所有现代浏览器都支持websocket连接,但是没有websocket支持 IE <= 9 和 Android Browser <= 4.3. 如果您必须支持这些浏览器,请使用其他缩放策略.

import cluster from 'cluster';
import feathers from '@feathersjs/feathers';
import socketio from '@feathersjs/socketio';

const CLUSTER_COUNT = 4;

if (cluster.isMaster) {
  for (let i = 0; i < CLUSTER_COUNT; i++) {
    cluster.fork();
  }
} else {
  const app = feathers();
  // ensure the same worker handles websocket connections
  app.configure(socketio({
    transports: ['websocket']
  }));
  app.listen(4000);
}

在您的Feathers客户端代码中,将 socket.io-client 限制为 websocket transport 并禁用 upgrade.

import feathers from '@feathersjs/client';
import io from 'socket.io-client';
import socketio from 'feathers-socketio/client';

const app = feathers()
  .configure(socketio(
    io('http://api.feathersjs.com', {
      transports: ['websocket'],
      upgrade: false
    })
  ));