PM2+Redis+Node.js 实现分布式部署教程

介绍

随着互联网的发展和大数据时代的到来,业务越来越庞大复杂,单机架构无法满足需求。因此,分布式架构渐成趋势。将单一的系统拆分成多个子系统,分别部署在不同的服务器上,实现负载均衡和故障转移,提升系统的可靠性和可扩展性。

前端项目也不例外,我们需要采用分布式架构来应对需求的增长。本篇文章就介绍如何采用 PM2+Redis+Node.js 实现前端项目的分布式部署。

PM2

PM2 是一个带有负载均衡功能的 Node.js 进程管理器,可以用于管理 Node.js 应用的进程。PM2 可以让我们方便地启动、停止、重启和监控 Node.js 进程。

安装和使用

安装:

npm install -g pm2

启动:

pm2 start app.js

停止:

pm2 stop app.js

重启:

pm2 restart app.js

监控:

pm2 monit

集群模式

PM2 还提供了集群模式,可以用于将应用程序分布在多个服务器上,以实现负载均衡和可靠性。

pm2 start app.js -i 4

上述命令将启动 4 个相同的 Node.js 进程,作为一个集群运行在同一个服务器上。如果要在多台服务器中运行,则需要使用 PM2 的多服务器部署功能。

pm2 deploy ecosystem.config.js production setup
pm2 deploy ecosystem.config.js production

上述命令将根据 ecosystem.config.js 配置文件,在生产环境中部署应用程序。

Redis

Redis 是一个高效的键值存储系统,可以用于处理大量数据,同时支持多种数据结构和扩展模块。

采用 Redis 可以让多个 Node.js 进程在同一个服务器或不同服务器之间共享数据,实现数据的可靠性和一致性。

安装和使用

安装:

sudo apt-get install redis-server

连接:

const redis = require('redis');
const client = redis.createClient();
client.on('error', (err) => {
  console.error(err);
});
client.on('ready', () => {
  console.log('Redis is ready');
});

设置键值:

client.set('key', 'value', redis.print);

获取键值:

client.get('key', (err, value) => {
  console.log('key: ', value);
});

发布/订阅模式

Redis 还提供了发布/订阅模式,可用于广播消息和处理事件。

client.on('subscribe', (channel, count) => {
  console.log(`subscribe ${channel}: ${count}`);
});

client.on('message', (channel, message) => {
  console.log(`receive message from ${channel}: ${message}`);
});

client.subscribe('channel');
client.publish('channel', 'hello');

Node.js

Node.js 是基于 Chrome V8 引擎的 JavaScript 运行时环境,可用于开发高性能的服务器端应用程序。

Express

Express 是一个快速、简单的 HTTP 框架,可用于构建 Web 应用程序和 API。

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`);
});

Socket.IO

Socket.IO 是一个实时双向通信库,可用于构建实时应用程序和游戏。

const io = require('socket.io')(80);

io.on('connection', (socket) => {
  console.log('connection established');
  socket.on('message', (data) => {
    console.log(`message from ${socket.id}: ${data}`);
    socket.broadcast.emit('message', data);
  });
});

上述代码将监听端口号 80,当客户端连接时,会发送 connection established 消息,当客户端发送 message 消息时,会广播到其他客户端。

分布式部署实例

我们采用以下技术来实现前端项目的分布式部署:

  • 消息队列:采用 Redis 的发布/订阅模式实现。
  • 任务分发:采用 Socket.IO 实现,将要执行的任务分发到各个客户端。
  • 构建部署:采用 PM2 集群模式实现,在多台服务器上同时启动多个相同的 Node.js 进程。

以下是实现的大致流程:

  1. 启动多个 Node.js 进程,作为一个集群运行在多数服务器上,由 PM2 管理。
  2. Node.js 进程连接到 Redis,订阅特定的频道,接收所需执行的任务。
  3. 构建和部署的任务被放入消息队列中,向 Redis 发布任务执行的命令。
  4. 一个客户端被选为任务执行者,接收到任务后,开始执行构建和部署任务,执行完成后,将执行结果广播给其他客户端。
  5. 其他客户端收到执行结果后,更新任务状态,准备下一轮任务。

代码示例

该示例代码实现了通过构建打包部署前端静态资源的分布式任务,其中部分代码已简化。

const redis = require('redis');
const client = redis.createClient();
const io = require('socket.io')(3000);

client.on('error', (err) => {
  console.error(err);
});

client.on('ready', () => {
  console.log('Redis is ready');
  client.subscribe('build');
});

client.on('message', (channel, message) => {
  console.log(`receive message from ${channel}: ${message}`);
  if (channel === 'build') {
    io.emit('task', message);
  }
});

io.on('connection', (socket) => {
  console.log('connection established');
  socket.on('result', (result) => {
    console.log(`result from ${socket.id}: `, result);
    io.emit('status', result);
  });
});

上述代码实现了以下功能:

  • 通过 Redis 的发布/订阅模式接收构建任务。
  • 通过 Socket.IO 将任务分发给各个客户端。
  • 接收并广播执行结果。

总结

本篇文章详细介绍了 PM2+Redis+Node.js 实现前端项目的分布式部署,从技术选型到代码实现都有详细的讲解,并提供了示例代码以帮助读者更好地理解和应用。

采用分布式架构可以提升系统的可靠性和可扩展性,同时也带来了更多的挑战,需要我们不断地学习和优化。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6591046feb4cecbf2d63cf06


纠错
反馈