多线程带来的困扰
我的工作是做接口,有许多合作方,我们需要频繁通过http协议来传输数据。
接口里面还会有一些业务逻辑操作,首先要根据数据中某一个参数来判断数据库中是否存在,如果存在,exit()。否则插入数据库,我再去访问别人的接口。
但访问我接口的有些合作方,会采用多线程。我这边会遇到一个问题:有时同时间内会过来n个包,这n个包中有一些数据是重复的,同时去数据库中查询这条数据中的一个参数是否存在。但数据库的反应速度没那么快。也许第n个包去查询的时候,数据库中还没有存在的参数,于是返回数量为0,但n+1条数据竟然也跟着这条数据插入进了数据库。
最后造成的结果就是滤重失败,还是有重复数据插入了。
于是,我给数据库加了唯一约束,从数据库底层滤重,这样确实有效果了。重复数据插不进去了。但是,我的程序并没有停止,下面的业务逻辑操作还会继续,还会带着这条数据去请求其他合作方的接口。。。
对于这个问题,我能想到的解决方案有下面几个:
1 升级服务器
2 不将滤重的参数存在数据库,而是存在内存中,并且根据实际情况来说,重复参数只会发生在1个小时之内。
3 优化数据表结构,提高数据库查询和返回结果的速度。
4 要求我的每个合作方都在数据库增加唯一索引,因为我的转发速度也是相当快的,到他们那边程序滤重也会失效。
5 要求所有合作方采用单线程方式
关于第三个方案,实际上效果并不理想,如果并发请求真的很密集的话,还是有可能会有数据漏过去的。