java 并发流,java并发处理数据
00-1010导论理论基础应用实务(一)编码及应用实现细节1、ConcurrentLinkedQueue2、CompletableFuture其他应用场景1、服务间接口调用概述
00-1010在并发场景下,当热点缓存键失效时,流量瞬间冲击数据库,称为缓存崩溃现象;当大范围的缓存键失效时,流量也会冲击数据库,这就是所谓的缓存雪崩现象。
使用分布式行锁时,可以有效解决缓存崩溃问题。当使用分布式表锁时,可以解决缓存雪崩问题。实际上,出于减少并发性的原因,不考虑分布式表锁。
从另一个角度来看,本文将对请求流量进行合并和拆分,以提高系统的并发性。
00-1010流量合并拆分的原理是将多个请求合并成一个请求,执行后再拆分结果。在数据库和缓存架构中,当缓存键失效时,会有大量重复请求命中数据库。实际上除了第一个请求有效,后面的请求都是无效的,浪费了数据库连接资源。
流量合并拆分的做法是唤醒一个额外的线程,每隔固定时间(比如200ms)发送一次合并的请求,执行后拆分查询结果,分发给原请求,原请求响应用户的请求。
应用到数据库对连接资源的需求明显下降,从而提高了数据库连接资源的利用率。
目录
00-1010基于MybatisPlus,提供内置封装的服务类QueueServiceImpl,透明实现查询细节流量的合并和拆分,用户可以屏蔽内部实现。
依赖关系groupIdxin.altitude.cms/groupId工件代码-CMS-Common/工件ID版本1.4.4/Version/Dependency一定时间间隔内的所有请求合并成一个请求进行处理。
@ override public bu order getOrderById(Long orderId){ return get byid(orderId);}例如,如果在特定的时间间隔内收集了相同的主键请求,则合并的请求可以通过查询数据库一次来响应所有请求。
子类覆盖父类方法来修改合并和拆分的行为。
@ override protected RequstConfig createRequstConfig(){ RequstConfig=new RequstConfig();/*单个合并请求的最大数量*/config . setmaxrequestsize(100);/*核心线程池大小*/config . setcorepoolsize(1);/*请求间隔(毫秒)*/config . setrequestinterval(200);返回配置;}
序言
00-1010 ConcurrentLinkedQueue用于缓冲和接收请求。计划任务以固定的频率消耗队列中的数据,多个请求条件被合并以汇总查询。
理论基础
CompletableFuture类是合并和拆分的关键类。原始请求将查询条件封装到CompletableFuture对象中,这些对象在提交到队列后被阻塞。计划任务成批组装查询条件,拆分结果并将它们存储在CompletableFuture对象中。最初的请求线程被唤醒并继续响应用户请求。
00-1010应用于数据库间流量的合并请求和拆分,首先提高了数据库连接资源(稀缺资源)的利用率,其次提高了网络间的数据传输效率。100次收发100条数据和一次收发100条数据的效率差。
00-1010服务之间的API接口调用也适用于流量合并和拆分:例如,当一个Http API请求发送到一个订单服务时,100个用户同时发起查询请求。利用流量合并和分流的思想,可以将多订单查询请求转化为批量查询请求,并将结果分发到不同的请求线程中,以响应用户请求。
00-1010在本文中,所选择的队列是一个本地并发安全队列。本地队列在分布式系统中合适吗?这里选择本地队列基于两点考虑:一是没有严格的分布式要求;其次,CompletableFuture类不支持序列化。用Redis做分布式队列的想法无法实现。如果使用本地队列,虽然会有少量查询条件的数据冗余(不会影响结果),但是可以避免分布式队列的网络IO延迟,反而有更好的查询效率。
该方案仅受益于高并发场景,属于针对并发场景的架构优化。普通项目可以正常操作。
以上是Java请求流量合并和拆分提高系统并发性的例子细节。更多关于Java流量合并和拆分提高系统并发性的信息,请关注风行IT的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。