我想知道对于每秒需要处理30-100封电子邮件的自行开发的SMTP中继服务器实现高可用性的最佳方法是什么。

此服务器的主要作用是通过各种smtp客户端进行身份验证,然后中继到特定的邮件服务器并处理错误,例如邮件服务器不可用等。因此,需要一个队列来包含电子邮件,其中可能包含大附件。为了获得高可用性,系统应支持群集,我可以将Windows群集用于主要/辅助活动群集。

我认为电子邮件队列可以驻留在:


内存(此方法出于明显的原因而退出。)
数据管理系统
文件(我相信这是IIS Virtual SMTP所使用的吗?)
嵌入式数据库,例如SQLite
SQLite和文件的混合
需要安装和配置一些幻想的第三方队列产品吗?


通常的高可用性方法是使用RDBMS(例如MySQL),但是将RDBMS用于消息队列将大大降低性能,除非我拥有功能强大的MySQL服务器。最重要的是,我将必须实现不容易的MySQL集群。此外,我在某处读到没有人应该将MySQL用作队列-http://www.engineyard.com/blog/2011/5-subtle-ways-youre-using-mysql-as-a-queue-and-why-itll-bite-you/

另外,我可以使用SQLite + File,这可能是最快的(不是纯内存),也是最容易部署的方法(无需安装),但是SQLite没有群集,因此,如果服务器崩溃,未发送的消息可能仍然是丢失。

最佳答案

2和4是同一件事-RDBMS。由于RDBMS的目标是复杂的查询并且必须保持自身的时间关系,因此这是一个糟糕的选择。收集垃圾,重建索引,增长db文件...下次任何时候INSERT都会很慢,甚至有一段时间完全被阻止。即使在基于版本的引擎(如Firebird和Postgress)中也是如此。像MS SQL和SQLite这样的基于锁的方法更是如此。

如果您希望它可靠,那么您可能希望将其实现为几个窄任务工作器,这也将为您提供使用OmniThreaLibrary或AsyncCalls进行多线程处理的好处。

“接收器”工作程序应将邮件接收到内存缓冲区中,也许提取一些元数据形式的标头并将其存储到当前的接收队列中。由于Win32线程很昂贵,因此最好使一个线程同时使用多个套接字,这是Erlang / Scala的“ actor”框架。您甚至可以将某些线程移动到独立的exe文件(如qmail设计的)中,以使崩溃本地化。甚至将来甚至跨计算机集群。

“转储程序”将隔离的队列并将其合并到连续的非SQL文件中(由于HDD破坏了data-filesystem-data-filesystem -...,您不希望使用单独的文件),然后他将切换队列:隔离上述接收队列进行转储,然后将其替换为刚刚清空的队列。 “具有两个队列并切换它们”是一种常见的“页面翻转”特征,例如在3D游戏中使用。 TForm.DoubleBuffering是类似但简化的概念。顺便说一句,您还应该有两个包含这些文件的文件夹,例如上面的内存队列。

同样,“ dbkeeper”将采用其中一个文件转储,将其移至RDBMS,然后进行切换。

您将必须在那些工作人员之间围绕这些交换活动设置通信。每个队列将要接收或转储,以最小化并发访问(频率和寿命)。

您可能会读到有关mailinator设计的信息-它的维护者在克服一个或另一个瓶颈后几次重构了他的软件,这也可以为您估计这些瓶颈何时开始影响性能。



但实际上,为什么不使用一些经过测试的现成服务器呢?

关于mysql - 自行开发的Delphi SMTP中继服务器是否具有高可用性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12670171/

10-11 22:49
查看更多