高并发应用,在互联网的场景下非常多。比如“秒杀”、但其实秒杀来讲,是一个很大的话题,涉及前端,网关,服务端等等。
我这里主要描述的是服务端的处理理解。
对于服务端来讲,就是一个接一个的请求过来,也可以理解为就是一个方法被连续的执行,而这些方法都要争抢一个资源。
为了保证资源的逻辑性,比如现金券,要保证资金不会超出(超卖),例如准备发500,实际发了5000。
就要对资源进行控制,不允许并发进行写操作。如同时增加,或者同时减少。
正常的原理都是如下的伪代码
if(locked())
{
wait(A);
}
else
{
write(A=TRUE)
}
只不过,利用java的concurrent包,可以解决很多问题,不用我们思考,比如控制并发在方法上,变量上,或者代码段上。
在测试的时候,重点要关注锁的释放和排队逻辑,不管是开发自己实现还是继承其他成熟的包。
一般情况下
第一:需要关注单独线程的性能,即单方法的执行时间,如果单方法时间太长,本身就不成立了,后面的排队全都超时了。
第二:需要关注排队线程的超时时长,是想让用户更多的等待,还是想让用户多进行点击,是需要根据系统产品的逻辑进行权衡。
第三:需要关注线程等待过大,内存撑爆,系统的抵抗能力,以及线程满之后的丢弃,或者限流机制等。
第四:需要关注抽奖类的逻辑,随机的方法以及命中之后的处理等。
如果单方法是事务,内部也涉及较多的系统交互和流程,亦需要关注事务本身的回滚,以及下一个请求事务的调入,
总之,要对系统的调度,各个持久化状态的变更了如指掌,才能测好这种高并发的逻辑。