分布式计算,WCF+JSON+实体对象同WebService+DataSet效率很比并

近年来举行企业项目,我们设成所有事务系统的客户数据,各工作系统的数据库有Oracle,有的是SQLSERVER,而且表结构也无平等,如何整合不同体系里的客户数化一个叫人嫌的难题!

 

缓解方案:

于结合数据的艺术达成是矛盾,有少数种方案:

方案1,将具有系统的客户数量做至一个数据库中–“中心数据库”,所要之工作要发生设计一个“超级客户数据表”,尽可能多的含各个业务体系的客户数据表的字段,然后重新付出同效仿程序完成各个业务数据库和“中心”数据库直接的多寡导入,更新,同步等;

方案2,不开“中心数据库”,数据由各个业务系统面临以需要询问,在内存中成查询有的片数据为一个外存数据集,数据集的表头根据部署决定,所用之劳作相对复杂,需要以各个业务系统受到出和布局“客户数据服务”,还要支付一个代理服务来做数据,好处是方案1之数目更新同步问题未存在了,数据维护量大大减轻。

 

咱利用WCF服务来贯彻2声泪俱下方案,具体来说就是以各个业务系统被开销各自的WCF客户数据服务(以下简称外围服务),再开发一个结缘数据的WCF代理服务,在外面服务以及代办之间利用TCP通道进行数量的高速传输,而在客户端与代办服务端,为了为IE这样的客户端能够运用JSON格式的数据,所以我们在代理服务端采用WCF+JSON+实体类
的艺术供服务。

 

经长及半独月之动向测试出(POC程序),方案2好不容易不负众望促成了,但商家外同事对这么的“分布式计算”模式非常是难以置信,因为以前从没有人这么做了,况且公司是为做多少起家的,对“集中式数据管理”的优势深信不疑,要求我们增加建筑一个测试环境进行对比测试。

 

测试环境:

2哀号方案测试环境:

出5高服务器,A,B,C,D,E,在各个台服务器上面部署一个WCF客户数据服务程序,每台服务器上面还生一个SQLSERVER2008
格式的客户数据库,服务程序访问自己机器上面的数据库,每个数据库的客户数量是500万长长的,5台服务器合计来2500万长条客户数据,任意两高服务器间的客户数还是匪另行的;代理服务程序和客户端程序都在咱们的支出机器上面。

每个外围服务程序从友好的数据库中收获2万长条记下,合计10万长,从第1万页数据(每页2万漫漫)开始取

 

1哀号方案测试环境:

提供相同尊服务器Z,它点就有一个SQLSERVER2008
格式的客户数据库,但它们起2500万长客户数量,数据还是勿另行的;访问数据库的Web服务以及客户端程序也以咱们的开发机器上面。

Web服务用每次由该数据库中取10万长条记下,从第1万页数据(每页2万漫长)开始取

 

测试结果:

2如泣如诉方案测试情况:

咱监控代理服务调用各个外围服务之数量,下面是VS2008的测试窗口输出的结果(有些服务器并未例行运作,故工作的服务器无5玉):

2010/7/7 16:02:55 服务器192.168.50.25:8119
就打响就任务,距离开始时(ms):2633.1506
线程 0x1550 已离,返回值为 0 (0x0)。
2010/7/7 16:02:56 服务器192.168.50.19:8119
早已成完成任务,距离开始日(ms):3180.1819
线程 0x160c 已脱离,返回值为 0 (0x0)。
2010/7/7 16:02:56 服务器192.168.50.15:8119
已经打响就任务,距离开始时(ms):3457.1978
线程 0x8c0 已离,返回值为 0 (0x0)。
2010/7/7 16:02:59 服务器192.168.50.5:8119
就成功完成任务,距离开始日(ms):6033.3451
线程 0x14a4 已脱离,返回值为 0 (0x0)。
总共耗时(ms):6041.3456
线程 0x1020 已退出,返回值为 0 (0x0)。

排执行时间较丰富之服务器,评价时未顶4秒(此例实际总耗时6秒左右);

客户端页面输出的总耗时:大约
17.6秒;除去代理服务准备数据的时空,代理服务以及客户端里传输数据消耗了大约11秒左右;

 


1声泪俱下方案测试结果:

咱俩在Web服务器上面监视直接采用ADO.NET查询数据所设之年华,具体代码如下:

 

 [WebMethod]
        public DataSet GetALLUser()
        {
            System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
            timer.Start();
            string sql = ”  select top 100000 * from B_User where UID not in (select top 2000000 UID from [B_User])”;
            DataSet ds = new DataSet();
            SqlDataAdapter ada = new SqlDataAdapter(sql, conn);
            ada.Fill(ds);
            timer.Stop();
            System.Diagnostics.Debug.WriteLine(“WebService 耗时(毫秒):”+timer .Elapsed .TotalMilliseconds);
            return ds;
        }

 

 

尽该次的年月啊:

WebService 耗时(毫秒):3339.8151

 

比方整整实施时间(从客户端发起呼吁到就多少绑定),一共耗时(大约):12.5秒,也即是Web服务与客户端的多少传时间大体9.2秒;


归纳对比结果:

1号方案超过,比2哀号方案快大约 5秒!

 

JSON
输给了XML?


 我们看1号方案与2哀号方案于数码传递过程的路线:

1号方案:数据库==》Web服务==》客户端;
2号方案:数据库==》外围服务==》代理服务==》客户端;

 

自数量传路径来说,2哀号方案明显比1声泪俱下方案多矣一个“代理”环节,自然有人疑这样的方案数据查询会不见面晚点,但咱精心分析,2号方案在“分布式数据查询”方面没有失败给1声泪俱下方案的“集中式数据查询”,我们看要1号方案的服务器环境完全一致,代理服务以多少的岁月约于3.5秒左右(除去耗时的50.5服务器),而Web服务及面取数据为只要3.3秒左右,这半种植方法的数查询效率差异基本上可以忽略,但也底2如泣如诉方案的最后结果以及1哀号方案差距
有5秒(排除较缓的50.5服务器,也出2秒)之多吧?方案2非是运用了JSON来传递数据吗?按照一般的领悟,JSON格式的数据量比XML格式的数据量要稍之,一般也会见省掉至少15%横的数据量(未举行过密切测试),所以JSON格式的数应比XML快,但此处JSON却负给了XML?

 

JSON:不堪 “序列化”/“反序列化”之又!


我们的测试环境中,客户端都是ASP.NET后台程序,没有以前台用IE直接行使Ajax测试,因为HTML表格直接绑定XML格式的多寡比困难,所以我们的“客户端”程序是一个ASP.NET后台程序来分别绑定1哀号方案的DataSet和2声泪俱下方案的实体类的,但问题吗在这里。

DataSet的数据表示天生就是一直支持XML的,所以她于后台系统中传输数据“序列化”/“反序列化”非常急匆匆(在此我不敢肯定是免是这么,对.NET底层不是老大了解),而实体类设表示成JSON格式,必须序列化,在前台(这里的客户端),必须对JSON字节流反序列化,再生成实体类,这同一过程通过上面的对比,我们发现效率是老没有之(因为2号方案就发生4大服务器工作,故实际上查询的总和据量比1如泣如诉方案少了2万条)。下面附上JSON在前台反序列化的代码:

 

 

 /// <summary>
        /// 以GET方式呼吁WCF服务,并以结果处理成指定的品种。服务端采用JSON格式处理要和归值。
        /// </summary>
        /// <typeparam name=”TResult”>结果类型</typeparam>
        /// <param name=”url”>服务地方,例如请求一个带来参数的主意 http://localhost:9162/Service1.svc/GetData?value=10 </param>
        /// <returns>返回 TResult 类型的数</returns>
        public static TResult GetData<TResult>(string url) where TResult : class
        {
            var request = GetRequest(url, “GET”);
            var stream = request.GetResponse().GetResponseStream();
            DateTime dt = DateTime.Now;
            var serializer = new DataContractJsonSerializer(typeof(TResult));
            var result = (TResult)serializer.ReadObject(stream);
            System.Diagnostics.Debug.WriteLine(“DataContractJsonSerializer use time(ms):” + DateTime.Now.Subtract(dt).TotalMilliseconds);
            return result;
        }

  private static System.Net.WebRequest GetRequest(string url, string method)
        {
            if (url == null || url.Trim().Length == 0)
                throw new ArgumentNullException(“服务地方为空,参数:url”);

            var request = System.Net.WebRequest.Create(url);
            if (method != null && method.Trim().Length > 0)
                request.Method = method;
           
            return request;
        }

 

 

相关文章