gpt4 book ai didi

mysql - Delphi自主开发的SMTP中继服务器的高可用性?

转载 作者:行者123 更新时间:2023-11-29 14:15:56 25 4
gpt4 key购买 nike

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

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

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

  1. 内存(由于显而易见的原因,该方法已被淘汰。)
  2. RDMS
  3. 文件(我相信这就是 IIS 虚拟 SMTP 使用的内容?)
  4. 嵌入式数据库,例如 SQLite
  5. SQLite 和文件的混合
  6. 需要安装和配置一些奇特的第 3 方队列产品?

实现高可用性的常用方法是使用 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 的目标是复杂的查询,并且必须及时维护自身。收集垃圾、重建索引、增加数据库文件...任何时候下一次插入都会很慢,甚至会完全阻塞一段时间。即使在像 Firebird 和 Postgress 这样基于版本的引擎中也是如此。对于基于锁的 MS SQL 和 SQLite 来说更是如此。

如果您希望它可靠,那么您可能会将其实现为多个窄任务工作人员,这也将使您受益于使用 OmniThreaLibrary 或 AsyncCalls 的多线程处理。

“Sink”工作人员应该将邮件接收到内存缓冲区中,也许从 header 中提取一些元数据并将其存储到当前接收队列中。由于 Win32 线程非常昂贵,因此最好让一个线程同时与多个套接字一起工作,这是 Erlang/Scala 的“actors”框架。您甚至可以将一些线程移动到单独的 exe 文件(如 qmail 设计)中,以使崩溃本地化。将来甚至可以跨计算机集群。

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

“dbkeeper”同样会获取其中一个文件转储,将其移动到 RDBMS 中,然后进行切换。

您必须围绕这些切换事件在这些工作人员之间设置通信。每个队列要么接收,要么转储,最大限度地减少并发访问(频率和生命周期)。

您可能会阅读有关邮件发送器设计的内容 - 它的维护者在解决一个或另一个瓶颈后重构了他的软件几次,这也可以让您估计这些瓶颈何时开始影响性能。

<小时/>

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com