Проект

Общее

Профиль

互联网不存在的时候,邮局还在

Choose a language: RU | EN | ZH

Table of contents

"倒车是在死胡同里进行的。"

1965 年,互联网还不存在,但麻省理工学院的两名雇员 Noel Maurice 和 Tom Van Vleck 为 CTSS 操作系统编写了 MAIL 程序。

当时的用户各自在一台计算机上的终端工作(当时还没有个人计算机)。MAIL 程序用于在他们之间发送信息,具体方法如下:在信息接收用户的主文件夹中,创建或编辑一个 MAIL BOX(邮箱)文件,并将信息文本写入其中。

令人惊讶的是,mbox 格式一直沿用至今,并仍在使用(还有其更新版本 maildir)。

电子邮件的正式创建日期被认为是 1971 年 10 月 2 日。它的创造者是雷-汤姆林森(Ray Tomlinson),他为 APRANET 网络编写了自己的程序。

程序由两部分组成:READMAIL(读取信件)和 SNDMSG(发送信件)。为了区分不同的电脑,Ray 使用了“”的符号。@@ ",看起来像这样:from_me@@@my_computer => you@@@@your_computer(后来随着域的出现,地址中的计算机被域所取代)。这样,信息就可以发送到网络上的远程计算机。这种方法一直沿用至今。

电子邮件的历史比互联网还要悠久。

然而,在半个世纪的发展历程中,邮件服务器不禁积累了许多目前阻碍其工作的顽疾。让我们举例说明。

传统的邮件服务器由两部分组成:MTA - 传输代理和 MDA - 发送代理(存储)。如今,我们对这种方案已经习以为常,专家们甚至用这些术语进行推理。为了理解其中的原因,让我们回顾一下过去。今天,SMTP 已经赢得了整个互联网,并被认为是唯一的标准,但事实并非总是如此。不久前,有大量的电子邮件类型,每种类型都有自己的协议、自己的地址,当然还有自己的传输代理。当时的服务器可以为每种协议配备多个传输代理,但只有一个存储系统处理用户程序。这种架构在当时是合理的,但如今已成为阻碍性能提升的历史遗留问题。

最初,电子邮件存储在 MAIL 文件夹中,该文件夹位于每个用户的主目录(/home/user)中。结果产生了一种最简单的格式--*mbox*。mbox 格式的主要问题是文件锁定--如果有多个进程试图访问一个邮箱,就有可能导致邮箱损坏。但即使是单个进程,大量进程也会受到极大阻碍。这就是为什么 Mbox 格式现在被认为是过时的,主要是为了向后兼容(特别是在归档方面,因为 mbox 允许在一个文件中存储多封邮件)。

因此,2000 年,丹尼尔-伯恩斯坦(qmail 邮件服务器的作者)开发了一种新格式,即 maildir 。后来,Sam Warshawchik(Courier 邮件服务器的作者)编写了该格式的扩展--Maildir++(实现了嵌套文件夹和邮件配额)。Maildir 的主要区别在于每封邮件都存储在一个单独的文件中,从而降低了与文件锁定相关的进程冲突风险。这种格式已经获得了相当大的普及,目前已成为流行格式。

不过,maildir 也不是没有严重的缺点。尤其是

在没有联锁的情况下运行时状态不正确。 Maildir 的设计使多个进程可以安全地并行写入文件,即使在使用 NFS 时也是如此。在读取目录结构时,任何在第一次和最后一次 readdir() 系统调用之间重命名的文件可能不会出现在文件列表中。这将导致读取进程认为报文已被删除,而实际上只是其标志发生了变化。当进程再次读取报文列表时,“已删除 ”的报文就会突然重新出现。这就是某些程序使用自己的非标准锁定方法的原因。

与文件系统兼容。 Maildir 标准无法在不支持在文件名中使用冒号的系统上实施。这包括 Microsoft Windows 和 Novell Storage Services。

但主要缺点是*扩展问题*。更新目录时,文件系统会使用隐式锁。非集群文件系统通常只允许一个内核执行线程在同一时间更新目录中的内容,因此rename()系统调用将提供必要的锁定。Maildir 不是无锁系统,只是显式无锁。对于许多中小型邮件系统来说,即使在 NFS 上也能充分扩展,但当系统变大并处理许多并发交付时,在同一时间不断更改许多目录的内容将导致不同 NFS 客户端的缓存不断失效,因此需要对 READDIR 重复执行远程过程调用 (RPC),这并不能很好地扩展。

因此,许多开发者都在努力开发自己的格式。

Dovecot 自己的 dbox 格式就是一个例子。dbox 格式将邮件信息存储在一个或多个文件中,每个文件可能包含一个或多个邮件信息。

下一种专有格式是 exim 创建的 Mailstore。每封邮件都以 .env 和 .msg 结尾的两个唯一文件名写入。.env 文件包含邮件封套,.msg 文件包含邮件本身。邮件发送时,邮件头的后缀名为 .tmp,邮件内容的后缀名为 .msg。当 .msg 文件完成后,.tmp 文件将重命名为 env。希望访问电子邮件的程序必须等到这两个文件都存在或 .tmp 文件不存在时才能访问。

还可以提及 Cydir、MH、Cyrus 等格式,但*它们都受到所有基于文件的电子邮件存储系统的传统扩展限制*。

因此,我们向相对较小的系统(最多 1-2 千个用户)推荐我们的 maildir 存储版本 Tegu FrewareTegu Professional。它们很方便,因为它们部署在单个节点上,既可计算,又可存储在自己的(或 NFS)磁盘上。

但是,对于用户数量较多(超过 2,000 个用户)的系统,我们推荐旗舰版本*Tegu Enterprise*,在该版本中,我们完全放弃了文件存储,转而使用*PostgreSQL DBMS*。

我们选择Postgres(以下简称PG)作为数据库管理系统。这并非偶然。关键在于,PostgreSQL的Vanilla版本是在PostgreSQL许可下发布的,这是一种类似于BSD或MIT的许可。然而,PostgreSQL 七大开发中心之一位于俄罗斯--这家公司就是 PostgreSQL Professional https://postgrespro.ru/ 。该公司由产品开发的元老级人物领导。这一事实使人们对产品的质量、可靠性和国产化充满信心,这在选择战略合作伙伴时非常重要。

Postgres 的功能值得称赞--正因为如此,Tegu 才拥有众多与众不同的竞争优势和独一无二的特性。现在是时候向我们的同事表示感谢了。

因此,我们的团队决定与顽固不化作斗争,为此必须从头开始编写产品,收集以前所有服务器的经验,总结其成功之处,改正其不足之处。Tegu 的创新性归功于我们在创建邮件服务器过程中积累的所有经验,以及我们在反思过程中做出的微薄贡献。