总结一个月前的记录:
我所在组是负责做中间件的(就是那个响应 前端应用层请求,然后处理一些必要的业务处理操作后再以2进制协议向低层发送业务请求的,再将数据传回应用层, So,不要把中间件这3个字想太大了)
新公司刚入2周,前1周无非就是熟悉现在系统的框架,通信协议,规范,以及本行业的一些基础知识等等。这周上峰安排任务下来了,文件打包下载速度太慢,要优化改造一下。好吧,我是新人,也就先别急着想要造新东西了,优化优化原来的老东西,不也挺那个嘛,Jobs不也管这叫作微创新来着,咱也是科技创新工作者,自我阿Q一把先。。。
接下来就是摸透这个功能的流程来龙去脉:
原有的流程:应用层向中间层请求,中间层再向低层请求批量下载,低层将所有文件打包成一个文件再通过Socket传送到中间层,中间层再用一个大数组接受然后封装在一个Bean对象里,再传回Servlet,调用一个统一的WriteFile方法向Response流输出给应用层。
好,为什么会有这么stupid形式呢?是原来中间层框架就是设计做成一个通用入口和出口的问题导致,所有请求都有一个对应的Operation类,实现各种业务操作并将从低层返回的数据都封装成一个对应的Bean,再送往出口方法操作输出。当然不是说这个设计就是不好,我感觉此处可以针对在大数据量处理的时候,变通一下,把批量下载改为在出口方法操作时再调用。还不用伤筋动骨,所以感觉这个框架设计还是Ok的。
针对上面的流程,有如下2个明显的缺陷:
1、压力大、数据量大时中间层可能会出现OOM。
2、响应速度太慢, 因为要等低层打完包了才能传给中间层。
针对上面2个问题,我在内存控制和速度控制两个方法的设计上一阵猛抠,想办法如何尽可能少的用内存,同时能可能快的传输数据,却忽略了异常及数据流的闭环!!!!
后来。。。我第一份设计解决方案通过了,而且上线了,可悲的是被因为该功能引起其他问题被用户投诉了。。。他娘滴。
原因是我在设计时,为了速度解放低层的打包工作,将打包工作移到中间层来做,中间层直接请求原始数据再打包,然后就是想到了Producer与Consumer模式, Socket的输入作为Producer,Response的输出作为Consumer,有块缓冲区进行写/读,剩下的你懂的。可是Response可能因前端取消请求或者他娘滴浏览器挂了但却没有notify通知Producer该醒醒退出了,我滴Socket娃还在那傻傻的wait,这就导致Socket一直没释放回池里,而2货的连接池一直紧紧地等待着这个可怜滴娃被释放回到他这个2货温暖滴家,所以就悲催了,随着越来越多这样恶意的请求,直到有天有其他的请求进来再要给个连接时, 2货的连接池告诉他说:俺滴娃都在外面紧张滴参加着伊拉克战争呢,一个都没回家,没有娃再让你征用了(应该给你个英雄Mother奖)。所以用户投诉就来了,因为他的其他业务因此受到影响了。
在这里我为什么会没考虑到这个问题呢,可能会问为什么不直接将Socket的InputStream往Respone.outputStream写,这是因为原始数据是受到保护,经过加密和编码的,所以在写出之前需要进行解码。
在这里我才发现了连接池这个2货有好几个弊端,为我日后优化之目标
第2个方案: 依然是Producer与Consumer,但是无限量缓冲区,因为Producer不受缓冲区满的限制,可以无限地拉出数据,而Consumer在遇到缓冲区数据不足以解码时会wait,等待Producer的呼唤。
1、增加了文件I/O的消耗,原来的内容缓冲区改变成用一个临时文件作为缓冲区,增加一个内存缓冲区提升RandomFileAccess性能,控制好读写的指针就OK。
2、增加控制下载速度因子: 下载速度快,Socket就慢释放(边写边下); Socket写得快,前端显示的下载的速度就慢点,但后劲十足
3、如果Response关闭,则立即通知Socket停止写,并直接关闭,因为后续数据未读完,不应该保留该Socket,防止Dirty。
总结:用文件作缓冲区,主要是可以控制Socket的写的速度不受缓冲区满的影响导致停顿,可以尽快的释放回连接池。
现在这个方案已经上线解决了问题,下一步就是优化连接池这个2货了。
分享到:
相关推荐
《Lotus Notes程序设计随笔》是作者李建壹与小路哥共同分享的关于Lotus Notes开发经验的集合,这本书籍深入浅出地探讨了这个在企业级应用中广泛使用的协作软件平台的编程技巧和实践经验。Lotus Notes,作为IBM开发的...
3. **装饰器模式**:装饰器模式允许在不修改对象的前提下,动态地为对象添加新的功能。在鸭子问题中,如果我们想让某只鸭子学会飞行,可以使用装饰器来给它添加飞行的能力,而不会影响其他鸭子。这提供了一种灵活的...
### Lotus Notes程序设计随笔知识点解析 #### 一、Lotus Notes简介与学习起点 **Lotus Notes**是一款由IBM开发的企业级协作平台,它集成了邮件服务、文档管理、数据库应用等多种功能于一体,在企业级协作软件领域...
### Lotus Notes程序设计随笔(精典):深入解析 #### 一、引言与学习方向 Lotus Notes,简称Notes,是一款集成了邮件服务、文档管理、协作工具及应用开发平台于一体的综合软件解决方案。作者李建壹(Louis Lee)在...
这篇博客文章“TT随笔三 前台公共功能猜想”可能探讨了在Web应用开发中,如何设计和实现前台公共功能的策略和思路。在Web应用的前端部分,公共功能通常指的是那些多个页面或模块共享的组件、服务或者交互逻辑,比如...
在开发“Android App_云随笔课程设计”项目时,我们面临的是构建一个移动应用程序,旨在帮助用户便捷地记录他们的日常生活、旅行体验、心情点滴以及学习笔记等。这个应用程序的关键特性在于其同步功能,它将用户的...
其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...
本项目是一款基于Java和跨平台技术的crostitch涂鸦随笔设计与实现源码,包含65个文件,其中包括30个Java源文件、16个PNG图片文件、7个JavaScript文件、2个XML文件、1个Git忽略文件、1个Markdown文件、1个Maven项目...
IDEA是为Java开发者设计的全功能集成开发环境,集成了源代码编写、编译、调试和运行等多种开发必备功能。下载IDEA可以从官方网站http://www.jetbrains.com/idea/获取最新版本。安装过程简单易懂,通常采用默认设置,...
【传统住宅与装配式住宅设计方法比较】 随着建筑业的不断发展,装配式住宅作为一种新型建筑模式,正逐渐改变着...然而,这也对设计师提出了更高的要求,需要他们在满足功能和美观的同时,兼顾预制构件的生产与安装。
通过上述步骤,我们不仅能够在Eclipse环境中成功安装VisualEditor插件,还能利用其强大的功能来简化GUI界面的设计过程。VisualEditor与其他相关插件(如EMF和GEF)的结合使用,为Java GUI开发提供了极大的便利。这...
小路哥的随笔可能涵盖如何设计动态视图,实现数据的多维度展示,以及如何利用视图进行数据过滤和搜索。 代理是Lotus Notes中的自动化工具,它可以按照预设的条件自动执行任务,如发送邮件、更新数据等。小路哥的...
总之,【Android随笔40K】项目虽然简单,但涵盖了Android开发的基本要素,如环境搭建、UI设计、数据存储和用户交互,对于初学者来说是一个很好的起点。通过这个项目,开发者可以逐步建立起对Android开发的整体认知,...
总之,【DCSweb随笔】这篇博文可能涵盖了DCS系统开发的多个方面,包括但不限于源码设计、工具应用以及数据库结构。对于想要了解DCS系统工作原理、开发流程或者寻求相关工具使用的读者来说,这将是一篇非常有价值的...
在描述中提到的“简单的随笔提示”,我们可以理解为一种基于JavaScript实现的交互式功能,可能是用户输入一个字或关键词,程序就能显示出与之相关的内容。这涉及到JavaScript中的事件监听、DOM操作以及可能的数据...
如Unity、Unreal Engine等,它们提供图形渲染、物理模拟、脚本系统等功能,需要根据项目需求进行适配和优化。 4. **数据存储与管理**:游戏数据的存储通常用到关系型数据库(如MySQL)或非关系型数据库(如MongoDB...
然后,报告详细介绍了程序的设计与实现,包括程序的总体架构、菜单栏和工具栏的设计、事件响应的处理、画图的基本功能的实现等。最后,报告对程序进行了测试和优化,提高了程序的可靠性和性能。 1. 设计要求 根据...
其次,Word具备协同编辑和评论功能,便于教师之间共享教学资源、讨论教学设计。在培训中,同行教师可以通过云同步或邮件分享Word文档,共同探讨、改进教学材料,实现教学经验的交流和共享。 再者,Word还有插入图表...
本篇随笔将深入探讨 Knife4j 的核心功能、应用场景以及如何将其集成到项目中,帮助你更好地理解和运用这一框架。 1. **Knife4j简介** Knife4j 是一个基于 Swagger 实现的Java web API 文档增强工具,其设计目标是...