accdb 批量写入数据 慢_如何让你的cassandra写入速率提升10倍!

公司有个功能需求,就是要把用户车辆的gps信息存到cassandra,然后用作后续的轨迹计算和查询。首先,我觉得把这些数据写入es会更好一些,众所周知es的查询性能非常好,也刚好适用于我们的业务场景,一次写入多次查询,无修改。我不太明白为什么公司要写入cassandra,或许做这个决定的人刚好用过cassandra,不太清楚es。好了题外话不说了,进入正题。

起初拿到这个需求就查了下资料,因为之前没用过cassandra,不知道怎么写,查了些资料最后选用了springboot封装好的包spring-boot-starter-data-cassandra,用法非常简单,pom引包

5a928d9a7e449439a43da33c251b3cc2.png

创建cassandra实体及对应的dao,dao集成CrudRepository,然后调用insert方法实现数据的批量插入。这一些列的操作跟Mysql JPA 的用法一样,全程不需要写一条sql。两三下搞完了,上线测试,ok,可以写进去,功能也算完成了。

bbb82ca607612e5caa5dc0c2191e4df6.png

后来呢,随着公司注册用户越来越多,从一开始的4w多增长到现在的13w,直接增长了10w,而且这个趋势还在继续,感觉过年能突破20w。怎么办,我可不想正吃着团年饭呢被叫去改bug。趁着过年前赶紧优化下。

测试了一下,写入很慢,大概1秒1000条写入,这个速度太慢了,虽然目前哪些gps数据1秒也就六七百,但是后面肯定不行。

网上找到一个办法,用的cassandra原生的包来写,引包:

32f2d7f6850615918fb4fe7ab9480797.png

原生的包调用起来肯定会比较麻烦,从创建客户端到最后批量写入都要自己写,一顿操作之后写了个demo出来了

6284969ae4de7df6dd49134d45a77032.png

af490fb140f1a0f4d7301adc9757ee8a.png

从代码可以看出来,这里的批量插入其实就是把很多条插入语句拼在一起,一次执行插入,在这里需要注意,每次批量的大小不能太大,因为太多了会导致拼的cql过长无法写入。最后尝试了好几次,最终确定一次100,在保证了可用的前提下,每次写入最大化。

运行程序测试了一下,10w的数据写进去花了七八秒,平均1秒超过1w,简直太爽了,按照这个速度,最少可以支撑120w用户,足够撑上个一年半载的了。

问题是解决了,但是还是不清楚为什么用springboot的jar包写入速度那么慢,换上原生jar包后瞬间提升10倍,抱着这个疑问去看了下spring-boot-starter-data-cassandra的写入源码。

1a3d8a722af52d8b5d1fc1068839feb2.png

看到这里我觉得答案已经出来了,他所谓的批量插入只是在迭代一次一次地insert。。。。

写入调用的主要的方法:

5d2b0885ea89f21fdec2cee610803854.png

每插入一条数据都要去做一遍这样的操作,而我用原生jar包写入时,只是在程序初始化时创建客户端,然后在批量写入时每100条数据拼成一条cql,然后执行,一次插入100条,试想一下,如果我们每写入一条都要去创建一次客户端,构造cql,然后执行,那是不是太繁琐了,这里面做了很多重复的动作,所以就很慢了。

25c4b496ad62c890e8928f50b1a27ed9.png

如图,把人从左边运到右边,第一个一次运1个,第二个一次运6个,很显然下面的快!

所以说封装好的东西虽然好用但是还是有很多坑啊,用别人的东西之前一定要先了解它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值