大量业务的并发请求的电子数据处理的方法

文档序号:7658691阅读:268来源:国知局
专利名称:大量业务的并发请求的电子数据处理的方法
技术领域
本发明涉及电子数据的处理,具体为一种针对大量业务的并发请求的电子数据处理的方法。

背景技术
针对交易数据量较大的交易,平台的稳定性是最重要的一个指标,要求该平台不与数据库打交道,并提供较强的容错功能,同时能快速应对大量并发请求。现有的处理量大的数据均采用数据库平台,成本较高。


发明内容
本发明要解决的技术问题是针对大量业务的并发请求,提供一种稳定快速的大型电子数据平台。
本发明的技术方案是大量业务的并发请求的电子数据处理的方法,系统处理不依靠数据库,记录数据,查询统计等通过文件的方式进行,并发写文件,快速进行文件索引操作,外部系统请求接入时,由HTTP获取数据模块接收请求,经逻辑处理模块处理,再由FTP发送数据模块将处理后的数据发到外部发卡平台,具体为 (1)由HTTP获取数据模块采用Apache+WebLogic的集群策略来进行控制处理,Apache架于前端,配置Apache将请求分发到后端的WebLogic集群上,并配置Apache的请求分发权重; (2)逻辑处理模块采用分步式Cache的方式来进行WebLogic系统的文件保存,对于同一文件进行局部映射,实现文件的同时写操作,文件读取采用缓存读取; (3)FTP发送数据模块采用Socket方式进行远程加密,用池模式来进行连接池管理,首先从池里面去获取可用连接,来和远程通讯。
本发明采用多线程处理模式,封装生产者,消费者线程来进行业务调用,生产者线程采集对象放入共享队列中,启动多个消费者线程,消费者线程从共享队列里面获取数据,来进行快速处理。
本发明不采用数据库,大大减少了系统的成本,并且提高了系统的稳定性。分布式Cache可以整合数据,局部映射提供了文件的并发处理。Socket池进行快速TCP/IP访问,生产、消费者多线程的处理方式大大提高了业务的处理速度。



图1是本发明硬件部署示意图。
图2是本发明平台业务处理流程图 图3是本发明平台接入处理流程图 图4是本发明采用一台Apache和一台WebLogic处理的图形报告。
图5是本发明采用一台Apache和一台WebLogic处理的聚合报告。
图6是本发明采用一台Apache和两台WebLogic处理的图形报告。
图7是本发明采用一台Apache和两台WebLogic处理的聚合报告。

具体实施例方式 本发明系统处理不依靠数据库,记录数据,查询统计等通过文件的方式进行,并发写文件。外部系统请求接入时,由HTTP获取数据模块接收请求,经逻辑处理模块处理,再由FTP发送数据模块将处理后的数据发到外部发卡平台 (1)HTTP获取数据模块采用Apache+WebLogic的集群策略来进行控制处理,Apache架于前端,配置Apache将请求分发到后端的WebLogic集群上,并配置Apache的请求分发权重; (2)逻辑处理模块采用分步式Cache的方式来进行WebLogic系统的文件保存,对于同一文件进行局部映射,实现文件的同时写操作,文件读取采用缓存读取; (3)FTP发送数据模块采用Socket方式进行远程加密,用池模式来进行连接池管理,首先从池里面去获取可用连接,来和远程通讯。
为提高后台处理性能,采用多线程处理模式,封装生产者,消费者线程来进行业务调用,生产者线程采集对象放入共享队列中,启动多个消费者线程,消费者线程从共享队列里面获取数据,来进行快速处理。
由于没有数据库支持,需要通过文件方式来保存数据及交易情况,采用分步式Cache的方式来进行两台WebLogic系统的统一文件保存,在这其中由于并发的交易非常多,存在对于同一日志文件的频繁的并发操作。通常来说,对于同一文件不能进行同时的写操作。本发明通过对同一文件进行局部映射,实现文件的同时写操作。另外由于文件会越来越大,重新封装了读取文件的方式,进行缓存读取,大大提高了系统读取文件,处理文件的速度。
本发明Apache+WebLogic的集群策略为 Http前置服务器采用开源的Apache的Http Server,负责完成如下的任务 1、根据下游Web机器的性能情况进行权重配置,Apache进行合理的请求分发,实现负载均衡。
ProxyPass/balancer://proxy/ <Proxy balancer://proxy> BalancerMember http://192.168.0.97:7001/loadfactor=1 BalancerMember http://192.168.0.99:7001/loadfactor=3 </Proxy> 2、通过灵活的配置实现,可以实现复杂的分发需求。比如对于http://ucreceiver/HQLWebService和http://ucreceiver/HTLWebService,不同的上下文根对应着不同分发策略,对于/HQLWebService发送到下游的Web1及Web2上,而对于/HTLWebService发送到下游的Web3及Web4上。
ProxyPass /HQLWebService balancer://proxy_HQLWebService/ <Proxy balancer://proxy_HQLWebService> BalancerMember http://192.168.0.26:7001/loadfactor=1--对应Web1 BalancerMember http://192.168.0.99:5555/loadfactor=1--对应Web2 </Proxy> ProxyPass /HTLWebService balancer://proxy_HTLWebService/ <Proxy balancer://proxy_HTLWebService> BalancerMember http://192.168.0.97:6161/loadfactor=1--对应Web3 BalancerMember http://192.168.0.99:7080/loadfactor=1--对应Web4 </Proxy> 3、采用请求分发的方式,可以对于系统的支撑情况得以提升,来满足今后业务拓展后的系统需求,方便系统进行扩容。
下面对比两组测试数据 准备三台测试机器一台DELL D610PC Server(CPU 1.6GHZ,内存1G),Windows XPSP2操作系统,装有Apache2.2和WebLogic9.0,用作Apache请求分发; 两台联想E390PC Server(CPU 1.73GHZ双盒,内存1G),Windows XP SP2操作系统,装有WebLogic9.0,用作业务交易处理。
首先构造测试数据用例,创建19组测试数据,并发数分别为10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,每个连接进行50笔最为简单的请求调用。
分别进行单机处理和多机(两台)处理的调用对比。
①单机处理调用结果 图形报告如图4,其中 样本数据52250笔交易 吞吐量7588.7778笔交易/分钟 平均值126笔/秒(总运行时间除以发送到服务器的请求数)。
中间值15ms(平均一笔请求的处理时间)。
偏离103笔交易数据偏差率较大,占到所有请求里面的0.197%聚合报告如图5 Label请求类型为Http请求。
#Samples总共发送到服务器的样本数目52250。
Average126笔/秒(总运行时间除以发送到服务器的请求数)。
Median15ms(有一半的服务器响应时间低于该值而另一半高于该值)。
90%line32笔/秒(指90%请求的响应时间比这个数值还要小)。
Min0ms(服务器响应的最短时间)。
Max2344ms(服务器响应的最长时间)。
Error%0.00%(请求的错误百分比)。
Throughput126.5笔/秒(服务器每秒处理的交易数)。
KB/sec690.5KB/秒(单位时间内请求的字节数)。
结论90%line这个数据说明在发送的请求中,90%的用户响应时间都比得到的数值32笔/秒时间还短,是系统性能里的重要数据。该数据说明Apache对于系统的并发数能够很好的支撑(最大测试并发连接100个),并能够快速响应。
②双机处理调用结果 图形报告如图6 样本数据52250笔交易 吞吐量7751.2096笔交易/分钟 平均值129笔/秒(总运行时间除以发送到服务器的请求数)。
中间值23ms(平均一笔请求的处理时间)。
偏离103笔交易数据偏差率较大,占到所有请求里面的0.197%聚合报告如图7 Label请求类型为Http请求。
#Samples总共发送到服务器的样本数目52250。
Average129笔/秒(总运行时间除以发送到服务器的请求数)。
Median0ms(有一半的服务器响应时间低于该值而另一半高于该值)。
90%line31笔/秒(指90%请求的响应时间比这个数值还要小)。
Min0ms(服务器响应的最短时间)。
Max2282ms(服务器响应的最长时间)。
Error%0.00%(请求的错误百分比)。
Throughput129.2笔/秒(服务器每秒处理的交易数)。
KB/sec0KB/秒(单位时间内请求的字节数)。
结论进行两台机器的并行处理分发,系统的交易吞吐量得到一定的提升。由单机时候的7588.7778笔交易/分钟提升到7751.2096笔交易/分钟。有2.09%的性能提升。
使用Apache+WebLogic的集群策略 1、对后台Web进行集群,可以提高系统的容错能力,在其中某台Web服务器发生硬件系统级别故障情况下,系统仍能够支撑运行。请求可以自动转到正常的机器上,而不至于系统瘫痪。
2、后台Web集群策略可以使得应用可以在不停进程的情况下进行新功能上线,不影响在线系统,提升服务质量。
本发明还采用磁盘阵列策略,能够更大限度的保证数据的安全性和一致性。Web服务器访问磁盘阵列,来保证所访问的数据源的一致性。数据阵列需要做RARI,来保证硬件故障的时候,数据不发生丢失。
逻辑处理模块对同一文件进行局部映射,实现文件的同时写操作,具体为 public synchronized void recordCryptCount(String dataIndex,String currentRecordTime)throws IOException{ RandomAccessFile randomAccessFile=new RandomAccessFile(new File(cryptOprFile),″rw″); MappedByteBuffer mbbo=null;//进行对象的申明 FileChannel fco=null; try{ String currentCount=″001″; String lastRecordTime=″″; boolean isFound=false; long fileLen=randomAccessFile.length(); randomAccessFile.seek(0); while(randomAccessFile.getFilePointer()<fileLen){ String line=randomAccessFile.readLine(); if(line!=null && line.indexOf(dataIndex)!=-1){String[]str=line.split(″\t″); if(str
.equalsIgnoreCase(dataIndex)){ currentIndex=randomAccessFile.getFilePointer()- (IBossCryptLog.getRecordLen()+1); java.text.DecimalFormat df= new java.text.DecimalFormat(″000″); int j=Integer.parseInt(str[1]); currentCount=df.format(j+1); lastRecordTime=str[2]; isFound=true; break; } } } if(lastRecordTime.equalsIgnoreCase(currentRecordTime)) return; if(!isFound){ currentIndex=fileLen; } fco=randomAccessFile.getChannel(); mbbo=fco.map(FileChannel.MapMode.READ_WRITE, CryptBufferedRandomAccessFile.currentIndex, IBossCryptLog.getRecordLen()+1);//映射局部文件对象构造 byte[]oldCryptBytes=new byte[IBossCryptLog.getRecordLen()+1]; mbbo.get(oldCryptBytes);//将原数据放入到Buffer里面 String line=new String(oldCryptBytes); IBossCryptLog cryptLog=null; if(line==null||line.trim().length()==0) cryptLog=new IBossCryptLog(); else cryptLog=new IBossCryptLog(line); cryptLog.setDATAINDEX(dataIndex); cryptLog.setFILECOUNT(currentCount); cryptLog.setLASTRECORDTIME(currentRecordTime); mbbo.clear(); mbbo.put((cryptLog.toString()+″\n″).getBytes());//将新数据写回文件 }catch(IOException e){ e.printStackTrace(); throw e; }catch(Exception ex){ /**@todo Handle this exception*/ }finally{ try{ if(fco!=null)fco.close(); }catch(IOException e){ //TODO Auto-generated catch block e.printStackTrace(); throw e; } randomAccessFile.close(); } } 本发明发送数据采用Socket方式进行远程加密,其过程为 public class ConnectionToCryptMachine{/***应用的根路径*/ public static String INTF_WLS_HOME=null; public static final int NOTCONNECTED=0;//连接状态 public static final int CONNECTED=1;//未连接状态 protected int mystate ;//状态 private String peerip;//加密机IP地址 private int peerport;//加密机端口号 private Socket mysocket ;//客户端socket DataInputStream mydatainputstream; DataOutputStream mydataoutputstream; private Properties pro;//持久属性集 private File config_file=null;//配置文件 /*配置加密机参数*/ private String crypt_comd; //加密命令 private String calculate_method_symbol;//加密算法标志 private String crpt_symbol;//加密/解密标志 //private String key_length;//密钥长度 private String edk_length_symbol; //密钥长度标志 private String key_index; //密钥索引号 //private String edk;//密钥,一年更换一次 private String init_vector;//初始向量 //private Logger logger; //获取日志记录器 /***构造连接对象*@param ip*@param port*/ public ConnectionToCryptMachine(String ip,int port){ INTF_WLS_HOME=System.getProperties().getProperty(″INTF_WLS_HOME″); String configFileName=new StringBuffer() .append(ConnectionToCryptMachine.INTF_WLS_HOME) .append(File.separator) .append(″conf″) .append(File.separator) .append(″XG_Config.propertities″) .toString(); config_file=new File(configFileName); mystate=NOTCONNECTED; peerip=ip; peerport=port; System.out.println(″ip=″+peerip); System.out.println(″port=″+peerport); //加载配置文件 try{ pro=new Properties(); pro.load(new FileInputStream(config_file)); initConfig(pro); }catch(FileNotFoundException e){ System.out.println(″not found the config file!″); e.printStackTrace(); //logger.error(″dsfasdfs″); }catch(IOException e){ System.out.println(″error in load config file″); e.printStackTrace(); }catch(Exception e){ e.printStackTrace(); } } /***发送数据到加密机*@param senddata待发送的数据*@return加密机处理后的结果*@throws CryptMachineException*@throws Exception*/ public synchronized String cryptMachineHandlc(String send_data)throws CryptMachineException,Exception{ if(send_data==null||″″.equals(send_data)){ throw new CryptMachineException(″To CryptMachine data is null!″); } if(mystate==NOTCONNECTED){ throw new CryptMachineException(″CryptMachine connection isnull!″); } String data=this.getPackage(send_data); System.out.println(″data=″+new String(data)); int datalen=data.length(); byte[]sendData=new byte[datalen+2]; System.out.println(datalen+2); sendData
=(byte)(((datalen)/255)& 0xff); sendData[1]=(byte)(((datalen)%255)& 0xff); System.out.println(byteToHex(sendData
)); System.out.println(byteToHex(sendData[1])); System.out.println(sendData[1]); for(int j=2;j<sendData.length;j++){ sendData[j]=data.getBytes()[j-2]; } System.out.println(″senddata.length is″+sendData.length); System.out.println(″sendData=″+new String(sendData)); String recvstr=″″; byte[]byterecv=new byte[300]; try{ try{ //mydataoutputstream.flush(); mydataoutputstream.write(sendData); mydataoutputstream.flush(); System.out.println(″client wirte data success!!!!″); mydatainputstream.read(byterecv); System.out.println(″client read data success!!!!″); if(byterecv==null){ throw new CryptMachineException( ″error in synchronize receive from cryptmachine l!″); } }catch(IOException ioe){ ioe.printStackTrace(); throw new CryptMachineException( ″IOExeception for this EncryptMachie!″); } }catch(Exception e){ c.printStackTrace(); throw e; } StringBuffer sb=new StringBuffer(); for(int i=6;i<38;i++){//byterecv.length sb.append(byteToHex(byterecv[i])); //sb.append(Integer.toHexString(byterecv[i])); } System.out.println(″**************加密后的数据为::″+ sb.toString().toUpperCase().trim()); return sb.toString().toUpperCase().trim();//返回服务端加密后的信息 } private String byteToHex(byte b){ //Returns hex String representation of byte b char hexDigit[]={’0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’a’,’b’,’c’,’d’,’e’,’f’ }; char[]array={hexDigit[(b>>4)& 0x0f],hexDigit[b & 0x0f]}; return new String(array); } /***包装加密字符串,返回十六进制码*@param vipInfo*@return*@throws CryptMachineException*@throws Exception*/ private String getPackage(String vipInfo)throws CryptMachineException, Exception{ //加密机配置设置组合 //加密命令+加密算法标志+加密/解密标志+密钥长度标志+密钥索引号+初始向量 String strVipInfo=crypt_comd+calculate_method_symbol+ crpt_symbol+edk_length_symbol+ key_index+init_vector; Stringstr DataLength= getStrDataLength(String.valueOf(vipInfo.length())); System.out.println(″strVipInfo:″+strVipInfo.trim()); System.out.println(″strDataLength:″+strDataLength.trim()); System.out.println(″vipInfo:″+vipInfo.trim()); System.out.println(″组合后的字符串为″+strVipInfo+strDataLength+vipInfo); return(strVipInfo+strDataLength+vipInfo); } /***将字符串前补0,并取后四位*@param str*@return*/ private String getStrDataLength(String str){ str=″0000″+str; int len=str.length(); str=str.substring(len-4,len); System.out.println(″vip的长度组合后的字符串″+str); return str.trim(); } /***建立与加密机的连接**@throws IOException*/ public synchronized void connect()throws IOException{ disconnect(); System.out.println(″===========in the connect===============″); mysocket=new Socket(peerip,peerport); mysocket.setSoTimeout(2000);//设置与此Socket关联的InputStream上调用read()将只阻塞此时间长度,超时将异常 mysoeket.setSoLinger(true,0);//启用具有指定逗留时间(以秒为单位)的SO_LINGER。最大超时值是特定于平台的。该设置仅影响套接字关闭。
mysocket.setTcpNoDelay(true);//启用TCP_NODELAY mydatainputstream=new DataInputStream(mysocket.getInputStream()); mydataoutputstream =newDataOutputStream(mysocket.getOutputStream()); mystate=CONNECTED; } /***与加密机断开连接**/ public synchronized void disconnect(){ mystate=NOTCONNECTED; try{ if(mydataoutputstream!=null){ mydataoutputstream.close(); } }catch(Exception e){ e.printStackTrace(); } try{ if(mydatainputstream!=null){ mydatainputstream.close(); } }catch(Exception e){ e.printStackTrace(); } try{ if(mysocket!=null){ mysocket.close(); } }catch(Exception e){ e.printStackTrace(); } mydataoutputstream=null; mydatainputstream=null; mysocket=null; } public String getIP(){ return peerip; } public int getPort(){ return peerport; } //初始化加密机配置参数 private void initConfig(Properties p){ try{ crypt_comd=p.getProperty(″crypt.command″).trim(); calculate_method_symbol=p.getProperty( ″crypt.calculate_method_symbol″).trim(); crpt_symbol=p.getProperty(″crypt.symbol″).trim(); //key_length=p.getProperty(″crypt.key_length″).trim(); key_index=p.getProperty(″crypt.key_index″).trim(); edk_length_symbol= p.getProperty(″crypt.edk_length_symbol″).trim(); //edk=p.getProperty(″crypt.edk″).trim(); init_vector=p.getProperty(″crypt.init_vector″).trim(); }catch(Exception e){ e.printStackTrace(); } } }
权利要求
1.大量业务的并发请求的电子数据处理的方法,其特征是系统处理不依靠数据库,记录数据,查询统计等通过文件的方式进行,并发写文件,快速进行文件索引操作,外部系统请求接入时,由HTTP获取数据模块接收请求,经逻辑处理模块处理,再由FTP发送数据模块将处理后的数据发到外部发卡平台,具体为
(1)HTTP获取数据模块采用Apache+WebLogic的集群策略来进行控制处理,Apache架于前端,配置Apache将请求分发到后端的WebLogic集群上,并配置Apache的请求分发权重;
(2)逻辑处理模块采用分步式Cache的方式来进行WebLogic系统的文件保存,对于同一文件进行局部映射,实现文件的同时写操作,文件读取采用缓存读取;
(3)FTP发送数据模块采用Socket方式进行远程加密,用池模式来进行连接池管理,首先从池里面去获取可用连接,来和远程通讯。
2.根据权利要求1所述的大量业务的并发请求的电子数据处理的方法,其特征是采用多线程处理模式,封装生产者,消费者线程来进行业务调用,生产者线程采集对象放入共享队列中,启动多个消费者线程,消费者线程从共享队列里面获取数据,来进行快速处理。
3.根据权利要求1所述的大量业务的并发请求的电子数据处理的方法,其特征是使用两台WebLogic系统。
全文摘要
大量业务的并发请求的电子数据处理的方法,系统处理不依靠数据库,记录数据,查询统计等通过文件的方式进行,并发写文件,快速进行文件索引操作,外部系统请求接入时,由HTTP获取数据模块接收请求,经逻辑处理模块处理,再由FTP发送数据模块将处理后的数据发到外部发卡平台。本发明不采用数据库,大大减少了系统的成本,并且提高了系统的稳定性。分布式Cache可以整合数据,局部映射提供了文件的并发处理。Socket池进行快速TCP/IP访问,生产、消费者多线程的处理方式大大提高了业务的处理速度。
文档编号H04L12/56GK101123620SQ20071013142
公开日2008年2月13日 申请日期2007年8月28日 优先权日2007年8月28日
发明者诰 林, 杭国民, 徐中仁, 朱奇峰 申请人:南京联创科技股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1