大量post 请求 restful接口怎么做合适
发布于 8 年前 作者 ouyangxuanyun 5074 次浏览 来自 问答

现在有很多条数据要插入数据库, 用post的方式通过resful 接口调用api 进行数据入库, 数据总量10万条,也就是连续post 10万次目前数据的入库速度大概每秒100条左右,这么大量的post请求node可以处理吗? 新手还希望大家帮忙解答

13 回复

每秒100条不叫大量,node+mongodb最普通的开发机都承受的住了,连redis都不用上

虽然看起来请求多,但是不管是接收post请求还是入库操作都是网络IO,这恰恰是node最擅长的,性能肯定没啥问题。 其次,你要做进一步的优化的话,可以考虑设置一个全局的批插入数组做缓存:

  • 收到post请求组装要插入的数据,push进该全局数组
  • 设置一个定时器,比如30s检测一次这个数组,满10000条的时候把前10000条记录移除掉并执行一次数据库的批插入操作

这样子你的十万数据只要进程10次插入操作就行了

@hyj1991 楼上你有考虑到如果没满10000条的时候挂了,丢了数据怎么办吗?

连续post 十万次是因为逻辑上限制必须分开post吗,如果不是,是否可以转化成一次post,然后到达后台再批量插入,sql,nosql都支持批量插入的操作。mongo好像单次tcp是1000还是10000一次多了驱动会自动拆成多次。。。。。

node没问题,node擅长高并发。

RESTful API好像可以声明资源的复数形式,用以批量插入,如: POST /user 插入一个用户 POST /users 插入多个用户

然后就是mongodb的insert是支持传入数组批量插入的,你可以研究一下文档。

有顾虑的话可以先在测试环境进行压测,遇到问题再说。

@@AnzerWall 拦截SIGPUB或者SIGTERM就行了,做一个异常退出前的钩子

来自酷炫的 CNodeMD

@hyj1991 我这只是一个大概的优化思路,想做性能优化肯定要仔细推敲细节

来自酷炫的 CNodeMD

@hyj1991 kiil -9 PID你怎么办,发生了类似的情况呢,

@AnzerWall 实时性要求不高的话,数据库扛不住的情况感觉可以加个消息队列

@AnzerWall kill-9那也是信号量啊,总有办法做钩子的

来自酷炫的 CNodeMD

谢谢各位的解决方案,逻辑上没有限制必须分开post,数据库是pgsql,所以可以像4楼说的那样做。 还有一个问题就是多大的数据量对于node算是大量呢?

怕丢数据可以用redis缓存数据,完美解决服务器挂了丢数据的问题

来自酷炫的 CNodeMD

回到顶部