现在有很多条数据要插入数据库, 用post的方式通过resful 接口调用api 进行数据入库, 数据总量10万条,也就是连续post 10万次目前数据的入库速度大概每秒100条左右,这么大量的post请求node可以处理吗? 新手还希望大家帮忙解答
每秒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
可以参考 Google 的 Batching Requests
@hyj1991 kiil -9 PID你怎么办,发生了类似的情况呢,
@AnzerWall 实时性要求不高的话,数据库扛不住的情况感觉可以加个消息队列
@AnzerWall kill-9那也是信号量啊,总有办法做钩子的
来自酷炫的 CNodeMD
谢谢各位的解决方案,逻辑上没有限制必须分开post,数据库是pgsql,所以可以像4楼说的那样做。 还有一个问题就是多大的数据量对于node算是大量呢?
怕丢数据可以用redis缓存数据,完美解决服务器挂了丢数据的问题
来自酷炫的 CNodeMD