“批量少次”还是“少量多次”--邮件通信系统效率浅谈

简介:
  在做Web开发的时候,相信很多人都看过一个“ 批量少次 ”原则:
    Web服务器采用HTTP协议,它是一个非持久连接的协议,是无状态的(虽然可以采用多种方式来模拟Web会话状态,但本质上Web是无状态的),由于每一次连接都要耗费相当的资源,所以尽量减少连接的次数,每次连接发送尽量多的数据也是顺理成章,这样它能够提供极大的吞吐量,可以提高Web应用系统的处理效率,这便是著名的“批量少次”原则。
    这个原则在很多情况下都适用,比如ADO.NET相比原来的ADO数据访问,由于采用了断开式连接,极大地提高了系统的处理能力,又比如商业贸易中的“批发”模式,分销商每次从批发商那里批量进货,可以得到更高的价格折扣。因此,在实际工作中,“批量少次”原则,也是我极力推崇的一个原则。
    我们通常情况下手工收发邮件,如果有很多文件或者内容,也是希望对方一次发过来的,这也符合“批量少次”的原则。但是我们使用的邮件系统都有限制,即每次发送的附件数量和大小有一定的限制,比如4M,所以有更大的文件,就必须分割多次发送了,因此“批量少次”的原则也有不适用的场景。为什么会有这样的问题?发送超过1M大小的邮件,对于现在的网络系统和大多数邮件系统而言,发送速度都有点慢了,我测试使用FoxMail发送4M以上的邮件,大概有10%-40%的失败率,要么我这边的网络速度太慢,邮件服务器提示处理超时,要么对方邮件服务器拒绝接收或者接收很慢。
 
    每次发送多大的邮件速度和成功率最高?经过很多次试验,我发现如果内容在1M内成功率接近100% ,2M以内有95%左右,3.5M以后成功率大幅下降,只有60%左右。看来,要发送大量的邮件,必须采用 另外一个原则:“少量多次”,每次发送成功率最高的最大容量(少量)的邮件,分多次连续发送。这样做还有一个好处,每个“任务”可以发送远大于邮箱容量的邮件,比如发送上G大小的邮件。
 
    WCF邮件通信系统之文件同步程序采用了“少量多次”的原则,来处理将整站文件同步到远程服务器的任务,发送的文件大小没有限制,它会自动切割大文件,每次发送一个分部文件,多次发送邮件,从而完成文件同步任务。
    对于数据同步的应用该采用那种模式?如果每个任务要同步多个表的数据,而且某个表的数据可能很大,“批量少次”的处理方式有可能增加处理的复杂度和消耗更多的资源,比如将数据打包成压缩文件,对方接收到压缩文件并解压缩,然后将内容很大的数据载入内存,再慢慢导入数据库,处理的最终结果,要等这个操作完成之后才能知道。如果采用“少量多次”的处理方式,每次只发送一个表的数据,如果表比较大分页发送,接收端处理后及时反馈处理结果,而不是等到全部处理完成后。由于每次发送的数据相对较少,所以系统通信的成功率很高,而且处理效率也很好。
 
    下面是数据同步程序处理“大数据量”的一个测试结果:
========================
网络情况:
测试环境:一个外网263邮箱,一个外网Notes邮箱,源数据库在外网,目标数据库在内网;
 
数据情况:
待同步的表:XX净资产值表;
记录数量:57万条;
记录大小:每2万条约4M(非压缩),总共约 1032M;
单次发送邮件的记录条数:2万条(数据经过自定义压缩);
 
测试结果:
自开始发送到全部导入的时间:6分钟左右(受网络环境影响);
 
===========================================================
6分钟处理50多万条记录的邮件通信系统,可以跟“批量少次”模式对比一下,相信这个速度还是令人满意的。
而且, 采用“少量多次”的方案,提高了方案的灵活性,比如上面测试的这个表,如果一开始就发现对方数据库无法使用或者目标表结构不一致,从而及时终止这个表的同步,是不是比一次把所有数据发过去(姑且认为你有办法),然后在发送端傻等要好得多?
 
总结一下“少量多次”在邮件通信系统中的意义:
  • 可以处理超过邮箱容量的数据;
  • 可以适时了解接收端的工作状态;
  • 可以应对网络状况不好的问题,提高系统的稳定性。
 
小技巧:
很多邮箱只是限制了“附件”的大小,但不会限制邮件正文的大小,所以WCF邮件通信系统的数据同步程序采用了“ 正文发送数据”的模式,不过该模式太过“非主流”,以至于得不到领导的认可,但这不失为“ 突破附件大小限制”的一个方案。


    本文转自深蓝医生博客园博客,原文链接:http://www.cnblogs.com/bluedoctor/archive/2011/02/16/1956309.html,如需转载请自行联系原作者


相关文章
|
存储 人工智能 数据可视化
阿里云服务器的十二种典型应用场景
阿里云还提供了数据可视化服务DataV,帮助用户通过图形化的界面轻松搭建专业水准的可视化应用。用户可以利用DataV进行数据监控、调度和会展演示等工作,提高数据分析和决策的效率。
|
12月前
|
前端开发 JavaScript UED
axios取消请求CancelToken的原理解析及用法示例
axios取消请求CancelToken的原理解析及用法示例
736 0
|
Java 关系型数据库 数据库连接
MyBatis-Plus整合SpringBoot及使用
务必记住,随着MyBatis-Plus版本的更新,一些具体的配置和使用方式可能会有所变动。在实际开发过程中,建议参考MyBatis-Plus的官方文档,以获取最新和详细的指导。
657 1
|
存储 缓存 监控
干货 | Elasticsearch 8.X 性能优化实战
干货 | Elasticsearch 8.X 性能优化实战
|
运维 开发者 Docker
Docker容器化技术在运维中的应用实践
【8月更文挑战第27天】本文旨在探讨Docker容器化技术如何在现代运维工作中发挥核心作用,通过深入浅出的方式介绍Docker的基本概念、优势以及实际应用场景。文章将结合具体案例,展示如何利用Docker简化部署流程、提高资源利用率和加强应用的可移植性。读者将获得对Docker容器技术在实际运维中应用的全面认识,并能够理解其在提升运维效率与质量方面的重要性。
|
数据采集 自然语言处理 计算机视觉
豆包大模型团队发布全新Detail Image Caption评估基准,提升VLM Caption评测可靠性
【7月更文挑战第30天】豆包大模型团队推出Detail Image Caption评估基准,旨在提高视觉语言模型(VLM)图像标题生成任务的评测可靠性。该基准采用高质量数据集及CAPTURE评价指标,通过提取图像中的核心信息进行多阶段匹配,有效提升了评测准确性。[论文](https://arxiv.org/abs/2405.19092)
333 1
|
缓存 Linux
阿里云服务器出现不流畅的情况可能有多种原因
【1月更文挑战第10天】【1月更文挑战第50篇】阿里云服务器出现不流畅的情况可能有多种原因
426 1
|
缓存 Oracle Java
Java中间件(1)--分布式系统&中间件从入门到精通(五)
Java中间件(1)--分布式系统&中间件从入门到精通(五)
|
分布式计算 资源调度 Hadoop
【大数据】Hadoop高可用集群搭建
【大数据】Hadoop高可用集群搭建
422 0
|
Kubernetes Cloud Native 开发工具
带你读《云原生应用开发:Operator原理与实践》——1.2.3 主流 Operator 开发工具介绍
带你读《云原生应用开发:Operator原理与实践》——1.2.3 主流 Operator 开发工具介绍