首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自我开发的Delphi SMTP中继服务器的高可用性?

问自我开发的Delphi SMTP中继服务器的高可用性?
EN

Stack Overflow用户
提问于 2012-10-01 08:55:45
回答 1查看 413关注 0票数 0

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

该服务器本质上所做的是与各种smtp客户端进行身份验证,然后中继到特定的邮件服务器并处理错误,例如邮件服务器不可用等。因此,需要一个队列来包含可以包含大附件的电子邮件消息。为了获得高可用性,系统应该支持群集,我可以将它用于主/次活动群集。

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

  1. 内存(此方法是出于明显的原因而退出的)。
  2. RDMS
  3. 文件(我相信这是IIS虚拟SMTP使用的?)
  4. 嵌入式DB (如SQLite )
  5. SQLite与文件的混合
  6. 一些幻想的第三方队列产品,需要安装和配置?

高可用性的通常方法是使用关系数据库管理系统(如MySQL ),但使用关系数据库管理系统作为消息队列将显著降低性能,除非我有一个功能强大的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没有集群,所以如果服务器崩溃,未发送的消息可能仍然会丢失。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-01 10:28:43

2和4是一回事-- RDBMS。这是一个糟糕的选择,因为RDBMS的目标是复杂的查询,并且必须及时维护自己。收集垃圾,重建索引,生长数据库文件..。任何时候,下一次插入都会很慢,甚至会被完全阻塞一段时间。甚至在基于版本的引擎中,如Firebird和Postgress。更多的是基于锁的,如MS和SQLite。

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

"Sink“工作人员应该将邮件接收到内存缓冲区,或者提取一些元数据头并将其存储到当前的接收队列中。因为Win32线程很昂贵,所以最好让一个线程同时使用多个套接字,这是Erlang/Scala的一个“参与者”框架。您甚至可以将一些线程移动到与qmail设计的exe不同的位置,从而使崩溃本地化。甚至在未来,甚至在整个计算机集群中。

"Dumper“会将一个孤立的队列和ump合并到一个连续的非SQL文件中(由于HDD破坏数据--文件系统-数据-文件系统-.),您不想要单独的文件,然后他会切换队列:将前面提到的接收队列隔离起来,然后用它刚刚清空的队列来替代它。“有两个队列并切换它们”是一种常见的“页面翻转”特性,例如在3D游戏中使用。TForm.DoubleBuffering是相似的,但缩小了概念。顺便说一句,您也应该有两个文件夹与这些文件,如上面的内存队列.

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

你必须在那些转换活动周围设置这些工人之间的沟通。每个队列要么接收,要么转储,以最小化并发访问(频率和寿命)。

您可能会读到关于mailinator设计的文章--它的维护人员在执行了一个或另一个瓶颈之后,对他的软件进行了多次重构,这也会给您一个估计,当这些瓶颈开始影响性能时。

但实际上,为什么不使用一些准备就绪和经过测试的服务器呢?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12670171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档