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

    在做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邮件通信系统的数据同步程序采用了“正文发送数据”的模式,不过该模式太过“非主流”,以至于得不到领导的认可,但这不失为“突破附件大小限制”的一个方案。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android自学

301和302重定向

15550
来自专栏blackheart的专栏

[解读REST] 4.基于网络应用的架构风格

衔接上文[解读REST] 3.基于网络应用的架构,上文介绍了一组自洽的术语来描述和解释软件架构;如何利用架构属性评估一个架构风格;以及对于基于网络的应用架构来说...

19450
来自专栏java一日一条

服务端 I/O 性能大比拼:Node、PHP、Java 和 Go

理解应用程序的输入/输出(I/O)模型,意味着其在计划处理负载与残酷的实际使用场景之间的差异。若应用程序比较小,也没有服务于很高的负载,也许它影响甚微。但随着应...

53740
来自专栏纯洁的微笑

构建高可用网关之容错实践

自从微服务概念以来,众多的软件架构在践行着这一优秀的设计理念。各自的系统在这一指导思想下收获了优雅的可维护性,但一方面也给接口调用提出了新的要求。比如众多的AP...

41670
来自专栏向治洪

android系统分层

  Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。也就是说,把对硬件的支持分成了两层,一层放在用户...

242100
来自专栏IT技术精选文摘

聊聊C10K问题及解决方案

1 C10K问题 大家都知道互联网的基础就是网络通信,早期的互联网可以说是一个小群体的集合。互联网还不够普及,用户也不多。一台服务器同时在线100个用户估计在当...

66390
来自专栏lestat's blog

油猴的简单使用

关于greasemonkey(油猴)的安装和一些实用脚本推荐 步骤 准备工作:确保你的电脑可以科学上网 以本人的chrome浏览器为例 1. 打开一个新标签页 ...

72280
来自专栏抠抠空间

漫谈单点登录(SSO)

SSO这一概念由来已久,网络上对应不同场景的成熟SSO解决方案比比皆是,从简单到复杂,各式各样应有尽有!开源的有OpenSSO、CAS ,微软的AD SSO,及...

36030
来自专栏企鹅号快讯

使用Jest测试原生TypeScript项目

问题:我怎么才能收到你们公众号平台的推送文章呢? 最近写了一个wechat-colorpicker小项目。 主要是为了练习下TS。既然写了一个小库,我就想着顺便...

42560
来自专栏逍遥剑客的游戏开发

游戏配置序列化

31640

扫码关注云+社区

领取腾讯云代金券