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 的异步特性,避免阻塞操作。
这些措施共同保证了系统在高并发下依然具备良好的性能和可用性。