This commit is contained in:
Redkale
2017-03-21 13:39:37 +08:00
parent 2fa529f1e8
commit 53b9cde768
3 changed files with 10 additions and 2 deletions

View File

@@ -34,6 +34,7 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、提供分布式与集中式部署的无缝切换 <br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5、提供类似JPA功能包含数据缓存自动同步、分表分库与简洁的数据层操作接口 <br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6、支持依赖注入的资源的动态修改 <br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7、Servlet、Service、Source组件均支持异步接口 <br/>
</p>
<h3><a id="redkale_think" class="anchor" href="#" aria-hidden="true"></a>设计理念</h3>
@@ -61,6 +62,11 @@
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Redkale提供DataSource类对数据层进行操作其功能类似JPA。最大程度的简化数据层的操作免去SQL/JPQL语句的编写。同时提供过滤查询与JavaBean的结合、读写分离、数据库热切换、本地/远程部署、数据分表分库、进程间缓存自动同步等功能。</p>
<h3><a class="anchor" href="net.html#net_sncp" target="_blank" aria-hidden="true">亮点四. 异步接口</a></h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Net、Service、DataSource、CacheSource都支持异步接口<a href="service.html#service_local" target="_blank">本地模式</a><a href="service.html#service_remote" target="_blank">远程模式</a>的Service均支持。</p>
<h3><a id="redkale_code" class="anchor" href="#" aria-hidden="true"></a>Java 源码</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="https://github.com/redkale" target="_blank" >Github 源码 &nbsp;&nbsp; https://github.com/redkale</a><br/>
&nbsp;&nbsp;<br/>

View File

@@ -637,12 +637,12 @@
<span class="o">}</span></pre></div>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如上图DataSourceService的源码当DataSource为本地实例时异步接口(含<b>AsyncHandler</b>参数的)与同步接口执行流程相同。当DataSource为远程模式时调用异步接口时通信接口发到远程服务器时AsyncHandler参数的值传<b>null</b>返回数据后再调用本地的AsyncHandler参数值执行。<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;异步调用方式是提高服务并发性的有效手段特别是在远程模式Service比较多的情况下效果更明显。以HTTP服务为例在Tomcat刚刚改版成NIO的时候网上随处可见都是大谈NIO性能比BIO多好认为BIO与NIO的不同是BIO往往会引入多线程每个连接一个单独的线程NIO则是使用单线程或者只使用少量的多线程每个连接共用一个线程。而事实上呢通常还是通过增加线程数来提高并发量。为什么NIO作用不大呢 因为一个HTTP动态请求耗时最多业务逻辑层IO操作的耗时比重小得多只有在静态资源请求这种纯IO操作才能体现NIO、AIO(NIO.2)的优势。举例一个简单的数据查询请求采用BIO方式耗时为了方便比较将所耗时间扩大几倍如下: <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;异步调用方式是提高服务并发性的有效手段特别是在远程模式Service比较多的情况下效果更明显。以HTTP服务为例在Tomcat刚刚改版成NIO的时候网上随处可见都是大谈NIO性能比BIO多好认为BIO与NIO的不同是BIO往往会引入多线程每个连接一个单独的线程NIO则是使用单线程或者只使用少量的多线程每个连接共用一个线程。而事实上呢通常还是通过增加线程数来提高并发量。为什么NIO作用不大呢 因为一个HTTP动态请求耗时最多业务逻辑层,特别是操作数据库,IO操作的耗时比重小得多只有在静态资源请求这种纯IO操作才能体现NIO、AIO(NIO.2)的优势。举例一个简单的数据查询请求采用BIO方式耗时为了方便比较将所耗时间扩大几倍如下: <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、服务器TCP连接开始到进入HttpServlet耗时 10ms <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、用户态判断和参数验证&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 耗时 10ms <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、调用远程数据源(DataSource)查询数据,耗时 150ms <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、数据序列化与response的IO输出 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 耗时 10ms <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如上描述,一个请求处理耗时 180ms同时占用一个线程的时间也是 180ms。若换成NIO使IO耗时减少为了方便计算假设IO耗时为0(当然实际情况是不可能的), 那么步骤1、4的耗时忽略不计线程的占用时间由180ms变成160ms。 假设数据查询接口IO操作本身耗时也是10ms那么有140ms是用于等待。若采用DataSource异步接口 则140ms的等待时间可以释放当前线程资源。虽然整个请求的处理时间还是180ms但是线程的占用时间却只有20ms。可以看出减少耗时多的步骤的等待时间才能事半功倍大幅度地提高性能。异步接口的主要作用是远程请求在等待过程中释放当前线程资源大大减少线程数,也减少大量线程之间的切换消耗
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如上描述,一个请求处理耗时 180ms同时占用一个线程的时间也是 180ms。若换成NIO使IO耗时减少为了方便计算假设IO耗时为0(实际情况是不可能的), 那么步骤1、4的耗时忽略不计线程的占用时间由180ms变成160ms。 假设数据查询接口IO操作本身耗时也是10ms那么有140ms是用于等待。若采用DataSource异步接口 则140ms的等待时间可以释放当前线程资源。虽然整个请求的处理时间还是180ms但是线程的占用时间却只有20ms。可以看出减少耗时多的步骤的等待时间才能事半功倍大幅度地提高性能。异步接口的主要作用是远程请求在等待过程中释放当前线程资源大大减少线程数。
</p>
<footer class="site-footer">

View File

@@ -35,6 +35,7 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、动态更新变更后的数据库连接参数。 <br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、读写分离的简易配置。 <br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、进程间的缓存自动同步。 <br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、提供异步接口。 <br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据库操作方面常见的是过滤查询操作JPA规范中的JPQL虽然简化了SQL但是对于动态产生的过滤条件,开发人员还是无法免去组装过滤条件的过程(无论JPQL还是CriteriaQuery), DataSource定义了FilterBean接口可以省略组装条件的过程FilterNode提供了类似CriteriaQuery的功能且这两种对象都可以序列化<a href="service.html#service_remote" target="_blank">远程模式Service</a>提供了基础微服务架构提倡服务之间尽量降低耦合因此DataSource仅支持简单的关联查询复杂的表关联查询或统计应放在数据分析系统中。一个服务通常部署多个进程若用JPA的缓存则进程之间的缓存无法同步而DataSource采用SNCP协议即可方便地达到自动同步缓存功能。JPA无法在主数据库异常时动态切换到备份数据库DataSource会监听<a href="#source_confxml">persistence.xml</a>文件,当文件配置发生变化时自动切换新的数据库配置。<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为了降低学习成本DataSource重用了JPA里的部分注解与配置文件使用方法基本相同与JPA用法的区别是注解只能标记于字段不能标记在方法上。
</p>
@@ -73,6 +74,7 @@
</table>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以上接口除了directXXX其他都有等同的异步接口。insert、delete、update接口与JPA同名接口用法一样。DataSource提供了丰富的查询接口且有独特的翻页查询功能。每以系列的方法主要重载三类 单个字段过滤、FilterBean过滤和FilterNode过滤。<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b>带 AsyncHandler 参数的接口均为异步接口</b><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;开发者可以借鉴 <a href="https://github.com/redkale/redkale-demo" target="_blank">Redkale-demo</a> 中的 <a href="https://github.com/redkale/redkale-demo/blob/master/src/org/redkale/demo/base/AutoClassCreator.java" target="_blank"> AutoClassCreator</a>的代码根据数据表自动生成Entity代码。
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<b>过滤条件</b></p>