在探讨了文件传输事件通知的重要性之后,本文将着重阐述镭速技术如何通过策略优化来增强企业处理大规模文件传输任务的能力。
大规模文件传输的挑战
在初期设计事件通知功能时,为了迅速适应市场需求,并未充分考虑各种可能性,而是采用了单一的生产者与消费者模式。镭速(私有化部署方案,也可接入公有云,企业、社会组织用户可申请免费试用)在文件传输服务和web应用服务中实现了功能叠加,其中文件传输服务负责生成事件,而web应用服务则负责接收和处理这些事件。服务间通过http协议发布事件任务,如下图所示:
大规模文件传输事件流程
这种设计在文件传输量较小、事件稀少时,由于web应用服务的请求负载较低,服务能够稳定运行。然而,在持续的大量文件上传,尤其是众多小文件的上传/下载场景中,镭速传输服务在8C16G的配置下能处理每秒5000+文件的传输,这导致瞬时上报请求激增,事件处理进程任务繁重,web服务器负载过高,甚至影响到web服务对实时请求的响应速度,事件处理速度减缓。
例如,在大量小文件通知的场景下,每秒需进行数百次通知,单个事件处理服务的并发处理能力有限,处理缓慢可能导致事件积压,内存占用增大,影响整个web应用服务的正常运作。经过深入分析,我们识别出以下五个主要问题:
事件请求的单次数据结构冗余,上报并发请求过于频繁,给事件接收web服务带来较大压力;
事件接收的web服务与用户前台的所有请求接口位于同一web应用服务器上,共享线程池,在高并发环境下处理响应缓慢;
http请求采用短连接方式,在高并发情况下频繁建立和断开连接,消耗较多资源和处理时间,增加了web服务的负载;
Python本身的并发处理能力较弱,事件处理占用大量线程资源,导致其他接口请求处理速度下降;
使用sqlite数据库时,频繁的读写操作容易导致全局锁表,使得部分应用请求处理异常。
针对这些问题,我们对事件功能的设计进行了全面优化,具体改进措施如下:
事件生产端:
对事件生成(文件服务)的请求频率进行优化,对非实时事件请求进行合并处理,将多次请求合并为一次,减少了事件发布的请求次数。
事件接收/事件处理:
将事件接收和处理从web应用服务中分离出来,创建独立进程(event程序),并设置独立端口,通过服务分离减轻web应用服务的负载压力。
减少事件接口的直接操作,将待处理的事件数据入队,转移到后台进行处理,以提高接口响应速度。
采用长连接方式,减少连接建立和断开的开销,以提升性能和效率。
利用多消费者模式,在linux环境下通过多进程启动多个event程序,显著提升接口和事件处理的效率。采用协程方式处理大量事件操作,增强单进程的处理能力。
将上报数据的提交方式从即时提交改为定时批量提交至数据库,避免频繁的数据提交,减少数据库并发。
优化后的流程如下图所示:
通过实施上述方案,测试结果表明,系统现在能够每秒处理数千条事件响应,优化效果显著,大幅提升了事件处理能力,有效应对了大规模文件传输事件的处理需求,同时也改善了用户体验。企业用户可以更有效地利用事件通知功能来完成自定义的自动化任务。
总结
优化企业处理大规模文件传输事件的策略对于提高企业运营效率至关重要。通过全面的技术优化和流程改进,企业能够更好地适应数据量的增长,确保文件传输的安全性和高效率。这不仅有助于保护数据安全,还能提升企业的整体运营效率,为企业的持续发展打下坚实的基础。