高并发量的数据处理方案

需求描述:

有5000台左右的设备,每台设备每隔一分钟就会向服务器端上报设备的信息(如设备所在位置经纬度等),现在需要服务端对这些上报请求传输的数据进行处理,并持久化到数据库中;

需求就这样简单,但服务端要处理的并发还是不小的,平均每秒种都会有将近100个请求过来,遇到这样的情况,你会怎么做呢?

我的解决方案是,使用了缓存+批处理操作,代码如下:

package com.jimu.data.servlet;

import org.apache.log4j.Logger;
import com.jimu.data.conn.JimuDataBakConn;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.HashMap;
import java.util.LinkedList;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class GpsRecordServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;
	//写日志操作
	private static final Logger logger = Logger.getLogger(GpsRecordServlet.class);
	//缓存大小
	private static int cacheSize = 2000;
	//(临界资源,需同步访问,确保线程安全)缓存链表开关标识
	private static int switchFlag = 1;

	//交替缓存数据,当存储的数据达到cacheSize时,向数据库中记录当前链表中的数据然后清空
	private static LinkedList<HashMap<String,Object>> cacheList1 = new LinkedList<HashMap<String,Object>>();
	private static LinkedList<HashMap<String,Object>> cacheList2 = new LinkedList<HashMap<String,Object>>();

	//127.0.0.1:8080/jimudata/recordgps.html?tsn=9303ZH201508080107&lng=23.175&lat=113.245&tim=1436756925668
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");

        String termSn = request.getParameter("tsn");		//设备序列号
        String longitude = request.getParameter("lng");		//经度
        String latitude = request.getParameter("lat");		//纬度
        String gpsTime = request.getParameter("tim");		//gps时间戳
        int size = 0;
        if(getSwitchFlag() == 1){
        	size = cacheRecord(termSn,longitude,latitude,gpsTime,getCacheList1());
        	if(size >= cacheSize){
        		setSwitchFlag(2);
        		saveCacheList(getCacheList1());
        		//清空缓存
        		getCacheList1().clear();
        	}
        }else if(getSwitchFlag() == 2){
        	size = cacheRecord(termSn,longitude,latitude,gpsTime,getCacheList2());
        	if(size >= cacheSize){
        		setSwitchFlag(1);
        		saveCacheList(getCacheList2());
        		//清空缓存
        		getCacheList2().clear();
        	}
        }
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

	public int cacheRecord(String ternSn,String longitude,String latitude,String gpsTime,LinkedList<HashMap<String,Object>> cacheList){
		HashMap<String,Object> itemMap = new HashMap<String, Object>();
		itemMap.put("ternSn",ternSn);
		itemMap.put("longitude",longitude);
		itemMap.put("latitude",latitude);
		itemMap.put("gpsTime",gpsTime);
		cacheList.add(itemMap);
		return cacheList.size();
	}

	public void saveCacheList(LinkedList<HashMap<String,Object>> cacheList){
		if(cacheList.size() == 0){
			return;
		}
		//数据源JimuBus 对应数据库jimubus,查询数据并返回json数据集
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try{
			conn = JimuDataBakConn.getConn();
			String sql = " INSERT INTO term_gps_record (term_sn,longitude,latitude,gps_time,create_time) VALUES(?,?,?,?,now()) ";
			ps = conn.prepareStatement(sql);
			//批处理大小
			final int batchSize = 500;
			int count = 0;
			for (HashMap<String,Object> itemMap: cacheList) {
				String termSn = itemMap.get("termSn") == null ? "":itemMap.get("termSn").toString();
				ps.setString(1,termSn);
				String longitude = itemMap.get("longitude") == null ? "":itemMap.get("longitude").toString();
				ps.setString(2,longitude);
				String latitude = itemMap.get("latitude") == null ? "":itemMap.get("latitude").toString();
				ps.setString(3,latitude);
				String gpsTime = itemMap.get("gpsTime") == null ? "":itemMap.get("gpsTime").toString();
				ps.setString(4,gpsTime);

				ps.addBatch();
			    if(++count % batchSize == 0) {
			        ps.executeBatch();		//达到批处理大小时,进行批处理操作
			        ps.clearBatch();		//清空stmt中积攒的sql
			    }
			}
			ps.executeBatch(); 				//insert remaining records

		}catch (Exception e) {
			e.printStackTrace();
			logger.info("批处理出现异常");
		}finally{
			try{rs.close();rs=null;}catch(Exception e){}
			try{ps.close();ps=null;}catch(Exception e){}
			try{conn.close();conn=null;}catch(Exception e){}
		}
	}

	//应用关闭时,把缓存中的数据保存到数据库
	public void destroy(){
		System.out.println("tomcat即将关闭,保存缓存中数据!");
		saveCacheList(getCacheList1());
		saveCacheList(getCacheList2());
	}

	private synchronized static int getSwitchFlag(){
		return switchFlag;
	}

	private synchronized static void setSwitchFlag(int flag){
		switchFlag = flag;
	}

	private synchronized static LinkedList<HashMap<String,Object>> getCacheList1(){
		return cacheList1;
	}

	private synchronized static LinkedList<HashMap<String,Object>> getCacheList2(){
		return cacheList2;
	}

}

如果有不足之处,欢迎指正,如果您有更好的解决方案,可以和大家探讨分享,共同完善!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-27 12:59:27

高并发量的数据处理方案的相关文章

大数据高并发系统架构实战方案

大数据高并发系统架构实战方案(LVS负载均衡.Nginx.共享存储.海量数据.队列缓存 ) 随着互联网的发展,高并发.大数据量的网站要求越来越高.而这些高要求都是基础的技术和细节组合而成的.本课程就从实际案例出发给大家原景重现高并发架构常用技术点及详细演练.通过该课程的学习,普通的技术人员就可以快速搭建起千万级的高并发大数据网站平台,课程涉及内容包括:LVS实现负载均衡.Nginx高级配置实战.共享存储实现动态内容静态化加速实战.缓存平台安装配置使用.mysql主从复制安装配置实战等.课程二十.

针对web高并发量的处理

针对web高并发量的处理 针对高并发量的处理 一个老生常谈的话题了 至于需要运维支持的那些cdn.负载均衡神马的就不赘述了 你们都懂的 虫子在此博文只讲一些从程序角度出发的一些不错的解决方案. 至于从数据库角度的性能方案.虫子另开博文. 1. 首推静态化 推荐指数五颗星 满星五颗 只要是大型互联网应用基本上离不开这个概念,IIS自带的伪静态化不谈,但是想做好静态化并不是一个容易的过程 动态和静态之间的取舍需要用一个平衡的战略眼光来看待 举个例子 当初在盛大游戏的时候 遭遇永恒之塔aion上线,悲

提升高并发量服务器性能解决思路

刚刚在网上淘了一个提升高并发量服务器性能解决思路,个人感觉非常不错,给大家分享出来,希望给您有所帮助. 提升高并发量服务器性能解决思路 一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很简单.随着互联网业务的不断丰富,网站相关的技术经过这些年的发展,已经细分到很细的方方面面,尤其对于大型网站来说,所采用的技术更是涉及面非常广,从硬件到软件.编程语言.数据库.WebServer.防火墙等各个领域都有

Java高并发的常见应对方案

Java高并发的常见应对方案 一.关于并发我们说的高并发是什么? 在互联网时代,高并发,通常是指,在某个时间点,有很多个访问同时到来. 高并发,通常关心的系统指标与业务指标? QPS:每秒钟查询量,广义的,通常指指每秒请求数 响应时间:从请求发出到收到响应花费的时间,例如:系统处理一个HTTP请求需要100ms,这个100ms就是系统的响应时间 带宽:计算带宽大小需关注两个指标,峰值流量和页面的平均大小 PV:综合浏览量(Page View),即页面浏览量或者点击量,通常关注在24小时内访问的页

大流量高并发量网站的之解决方案

一.对于网站访问速度影响的条件如下: 瓶颈主要有: 1.磁盘搜索 优化方法是:将数据分布在多个磁盘上 2.磁盘读/写 优化方法是:从多个磁盘并行读写. 3.CPU周期 优化方法:扩充内存 4.内存带宽 二.大流量高并发量网站的解决方案 1.确认服务器硬件是否足够支持当前的流量. 2.使用memcache缓存技术,将动态数据缓存到内存中,动态网页直接调用这些文件,而不必在访问数据库. 3.禁止外部的盗链. 4.外部网站的图片或者文件盗链往往会带来大量的负载压力,因此应该严格限制外部对自身图片或者文

高并发的常见应对方案

一.关于并发我们说的高并发是什么? 在互联网时代,高并发,通常是指,在某个时间点,有很多个访问同时到来. 高并发,通常关心的系统指标与业务指标? QPS:每秒钟查询量,广义的,通常指指每秒请求数 响应时间:从请求发出到收到响应花费的时间,例如:系统处理一个HTTP请求需要100ms,这个100ms就是系统的响应时间 带宽:计算带宽大小需关注两个指标,峰值流量和页面的平均大小 PV:综合浏览量(Page View),即页面浏览量或者点击量,通常关注在24小时内访问的页面数量,即"日PV"

高并发量网站解决方案

一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很简单.随着互联网业务的不断丰富,网站相关的技术经过这些年的发展,已经细分到很细的方方面面,尤其对于大型网站来说,所采用的技术更是涉及面非常广,从硬件到软件.编程语言.数据库.WebServer.防火墙等各个领域都有了很高的要求,已经不是原来简单的html静态网站所能比拟的. 大型网站,比如门户网站,在面对大量用户访问.高并发请求方面,基本的解决方案

大数据高并发系统架构实战方案视频教程

课程下载地址:http://pan.baidu.com/s/1dEyJiWL 密码:8bzy 随着互联网的发展,高并发.大数据量的网站要求越来越高.而这些高要求都是基础的技术和细节组合而成的.本课程就从实际案例出发给大家原景重现高并发架构常用技术点及详细演练.通过该课程的学习,普通的技术人员就可以快速搭建起千万级的高并发大数据网站平台. 01.大数据高并发架构实战案例分享-概述 02.Piranha安装快速搭建LVS负载均衡集群 03.LVS负载均衡DR模式安装调试介绍 04.LVS负载均衡深入

大数据高并发系统架构实战方案(LVS负载均衡、Nginx、共享存储、海量数据、队列缓存)

课程简介: 随着互联网的发展,高并发.大数据量的网站要求越来越高.而这些高要求都是基础的技术和细节组合而成的.本课程就从实际案例出发给大家原景重现高并发架构常用技术点及详细演练. 通过该课程的学习,普通的技术人员就可以快速搭建起千万级的高并发大数据网站平台. 亮点一:真实环境还原,课程采用了VM环境重现大网站集群服务器环境,真实环境还原再现. 亮点二:基础实用,细节决定成败,课程内容在演练过程中重点介绍各种细节,保证初级人员快速入门及高级进阶. 亮点三:讲师丰富的海量平台运作经验 讲师tom5多