并发操作

40 阅读3分钟

1. 问:你们项目中有哪些场景涉及到并发操作?是如何处理的?

答:
在本项目中,常见的并发操作场景包括:

  • 用户高并发登录、注册请求
  • 新闻、产品等数据的批量爬取与写入(如 web-server/crawler/index.js)
  • 用户点赞、评论等操作的高并发提交(如 web-server/controllers/web/likeController.js、CommentController.js)
  • 文件上传(如 web-server/controllers/web/UploadController.js)
    我们通过 Node.js 的异步非阻塞特性、数据库事务、乐观锁/悲观锁、以及队列等方式来保证数据一致性和系统稳定性。例如,点赞操作会在数据库层面做唯一性约束,防止重复点赞。

2. 问:在高并发场景下,如何保证数据的一致性?请结合项目举例说明。

答:
以用户点赞为例(web-server/controllers/web/likeController.js):

  • 前端每次点赞会发送请求到后端,后端会先检查该用户是否已点赞(通过 userId 和 targetId 唯一索引)。
  • 数据库层面设置唯一索引,防止并发下重复插入。
  • 如果出现并发写入,数据库会抛出唯一约束异常,后端捕获后返回友好提示。
  • 这种方式保证了即使在高并发下,点赞数据不会出现重复或丢失,数据始终一致。

3. 问:你们项目中有用到队列或异步任务来处理并发吗?具体是如何实现的?

答:
有。在新闻爬取(web-server/crawler/index.js)和大文件上传等场景下,我们采用了异步队列的方式:

  • 爬虫任务会将待爬取的新闻URL加入任务队列,使用 setImmediate 或第三方库(如 bull、kue)进行异步处理,避免阻塞主线程。
  • 文件上传时,采用分片上传和异步合并,提升并发处理能力。
  • 这样可以平滑高并发压力,防止单点阻塞导致服务不可用。

4. 问:数据库层面如何防止并发写入导致的数据冲突?项目中有哪些具体实现?

答:
项目中主要通过以下方式防止并发写入冲突:

  • 唯一索引:如点赞、收藏、用户注册等表都设置了唯一索引,防止重复数据。
  • 事务处理:在涉及多表写入(如用户注册时写用户表和日志表)时,使用数据库事务保证操作的原子性。
  • 乐观锁:对于需要防止数据被覆盖的场景(如产品库存扣减),可以在表中增加 version 字段,更新时带上 version 校验。
    这些措施在 web-server/models 及 controllers 层均有体现。

5. 问:在高并发下如何保证接口的性能和可用性?你们项目做了哪些优化?

答:
我们主要做了以下优化:

  • 接口限流:如登录、注册等接口通过中间件(web-server/middleware/BruteForceProtection.js)做限流,防止恶意刷接口。
  • 缓存:对于热点数据(如新闻列表、产品列表),采用 Redis 或内存缓存,减少数据库压力。
  • 数据库优化:合理设计索引,避免全表扫描。
  • 异步处理:如爬虫、批量导入等操作采用异步队列,避免阻塞主线程。
  • 代码层面:充分利用 Node.js 的异步特性,避免阻塞操作。
    这些措施共同保证了系统在高并发下依然具备良好的性能和可用性。