近些年做公司项目,大家要组成全部事务系统的客户数量,各业务种类的数据库有的Oracle,有的是SQLSECRUISERVE路虎极光,而且表结构也不等同,如何结合分化连串里头的客户数据变成一个令人恨入骨髓的难点!

 

赶尽杀绝方案:

在结合数据的点子上设有差异,有二种方案:

方案1,将装有系统的客户数据整合到叁个数据库中–“主旨数据库”,所要的行事至关心保护要有宏图多个“超级客户数据表”,尽恐怕多的盈盈各类业务系统的客户数据表的字段,然后再开发一套程序达成各样业务数据库与“核心”数据库直接的数目导入,更新,同步等;

方案2,不实行“大旨数据库”,数据从各种业务系统中按需询问,在内存中组成查询出的有个别数据为一个内部存款和储蓄器数据集,数据集的表头遵照安插决定,所急需的做事相对复杂,需求在依次业务系统中支出和配置“客户数据服务”,还要支付一个代理服务来组成数据,好处是方案1的数额更新同步难题不存在了,数据维护量大大减轻。

 

大家采纳WCF服务来落到实处2号方案,具体来说正是在依次业务系统中支付各自的WCF客户数据服务(以下简称外围服务),再支付三个构成数据的WCF代理服务,在外界服务和代办之间利用TCP通道进行数量的高速传输,而在客户端和代理服务端,为了让IE那样的客户端能够利用JSON格式的数量,所以我们在代理服务端选取WCF+JSON+实体类
的章程提供服务。

 

透过长达半个月的大势测试开发(POC程序),方案2算是成功落到实处了,但集团任何同事对如此的“分布式计算”格局格外困惑,因为原先从不曾人这么做过,况且公司是以做多少起家的,对“集中式数据管理”的优势深信不疑,供给大家搭建3个测试环境进行对照测试。

 

测试环境:

2号方案测试环境:

有5台服务器,A,B,C,D,E,在每台服务器上边安排1个WCF客户数据服务程序,每台服务器上边都有多少个SQLSE福特ExplorerVER二零一零格式的客户数据库,服务程序访问本人机器上边包车型大巴数据库,每种数据库的客户数据是500万条,5台服务器合计有2500万条客户数量,任意两台服务器之间的客户数据都以不另行的;代理服务程序和客户端程序都在我们的开销机器上边。

每种外围服务程序从友好的数据库中取2万条记下,合计10万条,从第2万页数据(每页2万条)早先取

 

1号方案测试环境:

提供一台服务器Z,它上面仅仅有贰个SQLSE纳瓦拉VE奥迪Q3二〇〇八格式的客户数据库,但它有2500万条客户数据,数据都是不重复的;访问数据库的Web服务和客户端程序也在大家的开发机器下边。

Web服务将每趟从该数据库中取10万条记下,从第一万页数据(每页2万条)开始取

 

测试结果:

2号方案测试情状:

作者们监察和控制代理服务调用各类外围服务的数额,上边是VS2010的测试窗口输出的结果(有个别服务器并未健康运维,故工作的服务器并未5台):

二〇〇九/7/7 16:02:55 服务器192.168.50.25:8119
已经成功达成职分,距离开端时间(ms):2633.1506
线程 0x1550 已脱离,再次回到值为 0 (0x0)。
2008/7/7 16:02:56 服务器192.168.50.19:8119
业已打响做到职分,距离发轫时间(ms):3180.1819
线程 0x160c 已退出,重回值为 0 (0x0)。
二零一零/7/7 16:02:56 服务器192.168.50.15:8119
一度成功完成任务,距离先导时间(ms):3457.一九八〇
线程 0x8c0 已脱离,再次来到值为 0 (0x0)。
贰零零捌/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;
        }

 

 

相关文章

网站地图xml地图