分布式计算,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;
        }

 

 

相关文章