引领先锋|携程基于Quasar协程的NIO实践( 四 )
public void waitBlocking() throws SuspendExecution {//从DB获取结果String ans = waitBlocking(this::selectFromDB);}private ExecutorService threadPool = Executors.newCachedThreadPool();privateT waitBlocking(Supplier supplier) throws SuspendExecution {CompletableFuture future = new CompletableFuture<>();threadPool.submit(() -> {T ans = supplier.get();future.complete(ans);});try {return AsyncCompletionStage.get(future);} catch (Exception e) {return null;}}2.5 并发工具的使用
协程对并发锁的使用有比较大的限制 , 需要使用者理解线程锁与协程的调度机制 。 在synchronized同步块的内部 , 不能包含挂起协程的语句 。 当持有锁的协程挂起后会让出线程资源 , 由于锁的可重入性 , 另一个运行在同一个线程上的协程再加锁时同样会成功 。 另一方面 , 协程挂起后恢复执行时 , 也可能会在另一个线程上运行 。 出现两个线程操作共享资源的异常 。 同时未持有锁的线程释放时 , 会出现IllegalMonitorStateException异常 。
但如果同步块的内部没有挂起协程的语句 , 则线程锁的机制仍然有效 。 线程的在执行过程中可能切换 , 而协程的调度在每个执行线程上是串行的 , 协程持有的锁在不包含挂起操作时 , 会在占用线程执行完毕直到退出同步块为止 , 不会发生锁失效的情况 。
JDK并发包中的工具可分为两类 , 一类是Lock、Semaphore、CountDownLatch等具有线程可重入性的工具 , 不能在未释放资源前使用挂起协程的操作 , 而另一类则是原子变量、并发容器等不会让出线程的工具 , 仍可正常使用 , 但要注意高并发的情况下锁的性能 。 此外 , 在使用并发工具的阻塞方法 , 如await时 , 可能导致协程的执行线程中发生阻塞 。
三、总结系统运行在4核心的主机上 , 线程池构成如下 。
业务逻辑运行在Quasar的协程调度线程池中 , 线程池大小为CPU核数 。 HTTP请求与RPC调用均通过内部的NIO线程池管理 。 此外定义了一个core size为8的可伸缩的线程池用于少量消息队列、DB等阻塞IO的操作 。 其余的线程是系统中引入的其他组件所新建的线程 , 正常情况下不会成为系统性能的瓶颈 。
改造后 , 在业务高峰流量激增数十倍的情况下线程数量依然稳定 , 而CPU利用率也从平均5%以下提升至10%-60% , 在瞬时与高峰流量下能保持稳定 。 集群CPU核数在保留一定的业务冗余以应对业务高峰的情况下 , 缩减至1/5 。
3.1 限制与风险
Quasar协程不是Java的语言标准 , 没有JVM层面的支持 , 使用时必须手动抛出异常声明每一个挂起方法 , 对代码有一定的侵入性 。 使用不当时 , 可能出现异常 。
代码的try/catch时可能同时捕获SuspendExecution异常 , 从而忘记标记方法 , 此方法字节码不会被修改 , 结合Quasar的原理不难看出 , 当没有织入字节码时 , 挂起方法恢复执行 , 无法还原方法栈帧和执行状态 , 将会出现语句被重复执行、空指针等错误 。 运行时空指针、死循环的症状 , 排查的重点是是否漏加SuspendExecution标记 。
在新线程而不是新协程中使用挂起方法时 , 会出现同样的问题 。 Thread的构造方法中传入的是Runnable接口对象 , 其run方法没有声明SuspendExecution异常 , run内部的语句不会被织入字节码 , 造成上述异常 。
3.2 总结与展望
协程使得NIO能够更好地应用在Java中 , 比回调方法更易读易维护 。 对系统的改造集中在底层通信封装和对方法的标记上 , 业务逻辑无需修改 。 虽然具有一定的代码侵入性和理解成本 , 但这种学习成本能逐渐被代码的可维护性优势抵消 。
推荐阅读
- 引领时尚新时代|她是饶雪漫书中的模特,和鹿晗在一起被赞般配,笑起来碾压林允!
- 引领时尚新时代|传闻她被渣男骗钱骗大肚子,无奈生下孩子给母亲抚养,气质美上天
- 引领时尚新时代|她是典型中国好媳妇,却嫁给相识不到20天的男友,穿搭霸气侧漏
- 引领时尚新时代|她从小就被亲爸说是捡来的,出道10年没谈过恋爱,美得让人着迷
- 「宁静」宁静不管穿了个啥都能引领时髦,嫌T恤配牛仔裤不够炫,再加薄纱
- 引领先锋|扔员工证的工厂到底啥来头?营收超三千亿,与富士康、伟创力齐名
- 国庆:携程发布“2020国庆旅行指北”:“大西北”搜索热度暴增475%
- 新京报|摩登日记|引领潮流的时尚偶像麦当娜
- 山东沂水提倡彩礼费1万以内|临沂沂水倡导婚俗简约 举办集体婚礼引领风尚
- 【山东沂水提倡彩礼费1万以内】临沂沂水倡导婚俗简约 举办集体婚礼引领风尚
