MST

星途 面试题库

面试题:JavaScript async/await 在高并发场景下的性能调优

假设你正在开发一个高并发的 Web 应用,其中大量使用了 async 和 await 来处理异步任务。在这种场景下,如何通过调整并发数量、优化任务队列以及合理使用缓存等方式来对性能进行深度调优?请详细说明具体的思路和实现方法。
40.9万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

调整并发数量

  1. 思路
    • 过高的并发数量可能导致资源耗尽,如过多的数据库连接、过多的线程占用系统资源等。而过低的并发数量则无法充分利用系统资源,影响性能。需要找到一个平衡点,既能充分利用资源,又不会导致系统过载。
  2. 实现方法
    • 使用信号量(Semaphore):在 Node.js 中,可以通过 async - semaphore 库来实现。例如:
const Semaphore = require('async - semaphore');
const sem = new Semaphore(5); // 允许同时执行5个任务
async function asyncTask() {
    await sem.acquire();
    try {
        // 异步任务逻辑,比如数据库查询
        await someAsyncOperation();
    } finally {
        sem.release();
    }
}
  • 设置连接池大小:如果应用与数据库交互,设置合适的数据库连接池大小。例如在使用 mysql2 连接 MySQL 数据库时:
const mysql = require('mysql2');
const pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    database: 'test',
    connectionLimit: 10 // 设置连接池大小为10
});

优化任务队列

  1. 思路
    • 合理安排任务的执行顺序,优先处理重要或紧急的任务,避免任务堆积,减少任务等待时间。
  2. 实现方法
    • 优先级队列:可以使用 js - priority - queue 库在 JavaScript 中实现优先级队列。例如:
const PriorityQueue = require('js - priority - queue');
const queue = new PriorityQueue({
    compare: (a, b) => a.priority - b.priority
});
// 添加任务
queue.queue({task: asyncTask1, priority: 1});
queue.queue({task: asyncTask2, priority: 2});
// 执行任务
async function processQueue() {
    while (!queue.isEmpty()) {
        const {task} = queue.dequeue();
        await task();
    }
}
  • 节流和防抖:对于频繁触发的异步任务,如用户输入搜索框触发的搜索请求,可以使用节流(throttle)或防抖(debounce)技术。以 lodash 库为例:
import {debounce} from 'lodash';
const searchInput = document.getElementById('search - input');
const debouncedSearch = debounce(async () => {
    const query = searchInput.value;
    await performSearch(query);
}, 300);
searchInput.addEventListener('input', debouncedSearch);

合理使用缓存

  1. 思路
    • 对于频繁读取且不经常变化的数据,使用缓存可以避免重复执行相同的异步任务,大大提高响应速度。
  2. 实现方法
    • 内存缓存:在 Node.js 应用中,可以简单地使用一个对象作为内存缓存。例如:
const cache = {};
async function getData(key) {
    if (cache[key]) {
        return cache[key];
    }
    const data = await fetchDataFromSource();
    cache[key] = data;
    return data;
}
  • 分布式缓存:对于高并发的 Web 应用,使用 Redis 等分布式缓存更为合适。在 Node.js 中使用 ioredis 库:
const Redis = require('ioredis');
const redis = new Redis();
async function getData(key) {
    const cachedData = await redis.get(key);
    if (cachedData) {
        return JSON.parse(cachedData);
    }
    const data = await fetchDataFromSource();
    await redis.set(key, JSON.stringify(data));
    return data;
}