开发者社区> 问答> 正文

关于数据传输和进行写库的非常紧急的问题请教大家!:报错

我自己开发的后台系统基本完成,目前进行压力测试,遇到几个很严重的问题: 先介绍一下系统的结构: 后台是C++开发的基于windows的平台,用于数据的收敛,业务处理和存库。 数据库是使用ORACLE标准版的11g2。 数据采集器是一个嵌入式的系统,专门采集各种数据,上送到后台。 我们可以把它看成:后台就是QQ的服务器,一个嵌入式的系统就是一个QQ客户端(只是用于形象描述,规模和技术完全不是一个档次)。 问题来了: 1.目前,后台注释掉大量数据存储和调用复杂存储过程的功能,经测试可以轻松接入1W个嵌入设备(后台和设备之间有注册、心跳和各种检测连接和其他通讯,但是纯粹是内存操作),由于测试工具局限,不能测1W以上的规模。但已远远超过需求,这部分是没问题的。但是,由于后台和嵌入式设备之间有非常多的重要数据要存入数据库,直接导致了性能的直线下降,若打开存库功能,大约只能支持到100个嵌入式设备。 2. 后台的数据总入口是一个双缓冲队列,此外有一组工作线程在队列中进行获取数据并进行存库,计算等操作。如果加入存库和调用存储过程,缓冲区在一定时间后就被塞满了。也就是说,数据进入的速度远远大于处理的速度。而且数据中有有效时间,直接导致工作线程获取该数据包后发现是超时数据包,导致有效数据失效了。 3. 曾经想到过,把需要调用存库过程和存库的逻辑丢到另一个队列里由新的一组线程进行操作,但是由于数据量太大,多线程处理存库时很多都是操作同一张表,导致产生很多锁表问题,也造成性能直线下降。 不知道大家有没有好的解决方法,比较紧急!先谢谢大家了!

展开
收起
kun坤 2020-06-09 11:56:29 983 0
1 条回答
写回答
取消 提交回答
  • 更换服务器~100个是单服务器最大的负荷了你用的是镶嵌式的,要选择服务器机组的那种~刀片式服务器~然后oracl数据库支持分开安装。同步处理~ 你肯定买的是架式服务器~######装ORACLE服务器是刀片式的,6核至强 24G的内存 应该不是服务器瓶颈######oracl装在独立的一台服务器上的话,只支持小形企业和地、市级企业运行 你说的情况,可以理解你的数据量非常庞大,,有可能是省、国家级的数据量了~~ 让你单位给你单独开个服务器房间,更换服务器机柜然后购买刀片式服务器做服务器阵列机组~######数据量倒不会太大,一天1G不到,问题是很多存储过程的逻辑很复杂,一条线程调用存储过程,要等待很久才会返回,直接导致工作线程速度很慢,数据进入速度太快,工作异常状态频繁出现。######必须要实时的存入数据库吗?不能先缓存到服务器,然后让服务器慢慢去处理吗?或者直接将数据记入日志,然后sqlload?######回复 @xinzaibing : 我想到一个蛋疼的方式:数据写文件,文件内容定期入库,程序定期读取数据库计算的结果缓存到内存中。不知道你具体需求,瞎琢磨一个。######回复 @asdfsx : 公司领导一致认为内存不可靠,断电、程序异常什么的...存在内存的数据就没了...真是蛋疼啊######回复 @xinzaibing : 如果数据量不大的话,还有一个方案就是都保存在内存里,然后定时把内存里的结果同步到数据库里。数据库的逻辑挪到程序里..........这个方案比较累啊。另外就是缓存可以加个优先级高低的判断。######目前要求是必须要实时入库,采取写日志文件的方法也可以。 这些数据有一个特点,在某一个时刻会有一个突然出现的峰值,然后又慢慢变少,但是这个时间是不固定的,由于只实用了一条双缓冲队列,所有需要紧急处理的数据和非紧急处理的数据都在队列里,而如果遇到非紧急数据,处理了很长的时间,就直接导致后面的紧急数据失效了...或者导致嵌入式程序判断服务端未收到数据,进而采取重发,导致一条队列里有非常多重复的数据。######我可能会使用数据写入日志文件,然后定时将日志入库的办法操作######大概意思可能是多线程对数据库表的操作导致数据表锁定,性能损失在内耗上了。。那数据表采用行级锁呢?(这样会增大系统开销)我是菜鸟,求教  ######回复 @xinzaibing : 这个应该是属于最初的设计问题,hohoho######回复 @asdfsx : 目前我也在往这方面考虑,如果数据分类处理。那就得大改结构了...唉######回复 @xinzaibing : 建议根据上传的不同数据进行不同的处理,不要一股脑的都放在缓存中,如果是心跳的话,应该立即响应,如果是要处理的数据的话,才需要进行缓存等待处理######ORACLE默认就是行级锁的应该.. 主要是数据的写入速度远远小于数据上传的速度,导致了缓存溢出,紧急数据不能得到及时处理,大量数据出现超时失效,无法对嵌入式的采集器程序作出及时的心跳相应和其他回复(因为都在队列中,无法处理,无心跳的话嵌入式采集器会误认为服务器断线)。最终导致单台服务器接入数据的嵌入式设备的数量太少,不满足需求。######去年刚毕业,由于公司小,一个人搞后台,压力太大啊...大家指指招呗~ @中山野鬼######今天到图书馆看了一本书《让Orcale跑的更快点》,上面说可以从如下几个方面优化: 数据库方面:建适当的索引,固定长度;查询条件比较尽量简化;不同的表放在不同的磁盘里…… 服务层:增大缓存,(有没有数据库连接池不知道你能用上不) 软件层:对Java使用PaperStatement 囫囵吞枣就记得这么多了。。。哭~~######非常感谢...我去看看这本书 :)######我不清楚你的数据采集的内容是什么。不过看的出,对实时性要求高。换我,基本上就一个思路。 1、做个前段服务器,什么事情都不干,只进行数据的压缩。然后所有数据库和计算操作,放到后端。 至于并发,你这种 1W=100台服务器的方式治标不治本。######@中山野鬼 是说对数据进行预处理,提取有效内容?还是就是zip?######回复 @asdfsx : 不一样的。而是数据压缩。采样数据中间,信息密度不会太大的。######老鬼的思路有点像我说的那个数据写日志文件,或者内存缓存定时入库...........都被否定了啊######@xinzaibing 还有一个建议,上传的数据加一个验证,如果上传的数据已经插入缓存,就不要再次插入了。无脑插入插到崩也不是什么好主意啊######回复 @asdfsx : 要回复的,要处理成功后才回复,存库失败或者某些异常导致服务端崩溃重启,就不进行回复,客户端会持续地进行重发,重发到一定次数后,存本地,等恢复正常后发送存本地的数据

    2020-06-09 11:56:38
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
蚂蚁聚宝虫洞项目技术方案介绍 ——云与端之间数据传输的桥梁 立即下载
金融异构报文处理和分发 立即下载
探索连接的最后十秒”落时”的网关 立即下载