前端监控系统概述
前端监控系统主要负责采集用户端的异常、性能、业务埋点等数据,并将这些数据上报到服务端进行存储与可视化分析。
随着用户量的增加,数据量也会相应增大,这会对服务端产生较大的并发压力。直接将大量数据存入数据库可能会导致数据库服务崩溃。
解决方案:使用消息队列
为了应对高并发情况,可以采用消息队列(如 RabbitMQ)来优化数据处理流程。
具体流程如下:
- 数据接收与缓存:一个 Web 服务接收前端发送的数据请求,将数据存入 RabbitMQ,而不是直接写入数据库。
- 数据处理与存储:另一个 Web 服务从 RabbitMQ 中取出数据,然后存入数据库。
这样做的好处是,消息队列的并发处理能力远高于数据库,可以快速响应并缓存大量请求,从而减轻数据库的直接压力。
消息队列的并发控制
通过设置消息队列的消费速率来控制数据流向数据库的速度,例如设置每次从队列中取出 1w 条消息进行处理。
这种方法可以有效避免数据库因突发大流量而崩溃,实现了流量削峰。
消息队列的扩展性
RabbitMQ 支持水平扩展,可以增加多个 Web 服务同时消费队列中的消息,进一步增强系统的处理能力。
运行 RabbitMQ 服务
我们可以通过 docker 来跑 RabbitMQ。
搜索 rabbitmq 的镜像,选择 3.11-management 的版本:
这个版本是有 web 管理界面的。
点击 run:
run 运行后,可以通过浏览器访问 http://localhost:15672 来管理消息队列,这就是它的 web 管理界面:
账号密码全输入 guest ,进入管理页面:
可以看到 connection、channel、exchange、queue 的分别的管理页面。
Node.js 实现 RabbitMQ
环境准备
首先,创建一个新的项目目录,并初始化 Node.js 项目:
bash
复制代码
mkdir rabbitmq-test cd rabbitmq-test npm init -y
安装依赖
安装 amqplib 包:
bash
复制代码
npm install amqplib
配置项目
由于我们将使用 ES module 语法和顶层 await,您需要在 package.json 中添加以下配置:
json
复制代码
"type": "module"
生产者设置
创建 src/producer.js 文件,并编写以下代码:
javascript
复制代码
// 引入 amqplib 库,用于操作 AMQP 协议(高级消息队列协议) import * as amqp from 'amqplib'; // 连接到本地的 RabbitMQ 服务,端口默认为 5672 const connect = await amqp.connect('amqp://localhost:5672'); // 创建一个通道,大部分的 API 操作都在通道中进行 const channel = await connect.createChannel(); // 声明一个队列,如果队列不存在则创建,名为 'test1' await channel.assertQueue('test1'); // 向名为 'test1' 的队列发送消息,消息内容为 'hello yun' await channel.sendToQueue('test1', Buffer.from('h