我想知道什么是实现自我开发的SMTP中继服务器高可用性的最佳方法,它需要每秒处理30-100封电子邮件。
该服务器本质上所做的是与各种smtp客户端进行身份验证,然后中继到特定的邮件服务器并处理错误,例如邮件服务器不可用等。因此,需要一个队列来包含可以包含大附件的电子邮件消息。为了获得高可用性,系统应该支持群集,我可以将它用于主/次活动群集。
我认为电子邮件队列可以驻留在:
高可用性的通常方法是使用关系数据库管理系统(如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没有集群,所以如果服务器崩溃,未发送的消息可能仍然会丢失。
发布于 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设计的文章--它的维护人员在执行了一个或另一个瓶颈之后,对他的软件进行了多次重构,这也会给您一个估计,当这些瓶颈开始影响性能时。
但实际上,为什么不使用一些准备就绪和经过测试的服务器呢?
https://stackoverflow.com/questions/12670171
复制相似问题