如果您要在C#(。net 4)中设计透明的SMTP代理以满足以下初始要求
从广义上讲,考虑到这些因素,您的设计会如何?你会创建Listener,Sender和logger具体类或更抽象的东西吗?你会使用回调,线程或进程吗?为什么?
答案 0 :(得分:7)
这是一个非平凡的应用程序。一些应该有所帮助的想法:
SMTP可扩展性
通常,扩展网络应用程序意味着能够扩展(如在更多计算机中)而不是向上扩展(更昂贵的计算机)。这意味着能够让多个服务器能够处理SMTP请求。请注意,这可能需要在网络级别提供支持(可以将消息分发到“SMTP服务器场”的路由器)。
是的,要进行SMTP扩展和执行,您可能希望使用多个线程(可能来自某种线程池)。请注意,多线程套接字实现并非易事。
就流程而言,我认为每个SMTP服务器具有多个线程的一个进程(可能是Windows服务)是一个很好的方法。
数据库可伸缩性
请记住,数据库也可能是一个可伸缩性瓶颈。要设计大型负载,您还希望能够水平扩展数据层。这意味着能够写入多个数据库服务器。这导致能够从一组数据库服务器报告(这比报告一个数据库服务器复杂得多)。
SMTP可靠性
这是一个问题/要求吗?如果是这样,这是支持服务器场的另一个原因(好吧,如果我们有多个服务器用于可靠性,我们可以称之为集群)服务器而不是一个服务器。请注意,服务器场必须让集群知道它已经失败(通过某种心跳机制)。
数据库可靠性
为了使数据库可靠,您还必须进行一些群集。这既不便宜也不简单(但已经在许多数据库平台上进行了多次)。
<强>队列强>
处理服务器负载激增的一种方法是对消息进行排队。这样,服务器可以继续传递消息,但您不会等待可扩展模块链完成其处理。请注意,这会给系统增加另一层复杂性和失败点。
<强>扩展强>
添加功能(如数据库日志记录和附件扫描)的一种方法是添加“MessageInsepctors”或“MessageHandlers”链。您可能希望允许以特定顺序配置这些内容(例如,在记录之前进行病毒扫描,这样您就不会记录受感染的项目。)
要考虑的另一个方面是哪些插件可以阻止邮件通过(例如病毒扫描程序)和插件,可以在邮件通过后执行(日志记录)。
在添加插件支持方面,您可以使用MEF(托管扩展性框架)之类的东西。
重塑轮子
将所有这些功能放到位需要花费大量的开发时间。购买现成的解决方案可能更便宜/更快/更容易为您完成所有这些(此问题已经解决了很多次)。
答案 1 :(得分:0)
听起来我觉得你想要设计出面向未来的东西,但不要立即完成数据分区,聚类等的全部工作。
<强>分区强> 建议您考虑提前对数据加载进行分区的方法。最初,您可以应用分区逻辑,只需将所有内容路由到同一目的地,但这样可以在需要时轻松划分负载 - 并且能够提前验证其是否正常工作。
<强>队列强> 我强烈推荐一种排队解决方案,因为它允许您分离接收消息的工作量和实际发送消息。排队对于可靠的消息传递也很有用,因为您需要保证一次性交付。看看将MSMQ与Service Broker进行比较的一些问题,因为它们为不同的受众提供服务,并且两者都有各种警告。
<强> SMTP 强> 大多数电子邮件服务器允许您通过单个连接提供多个电子邮件(我不仅仅指具有多个收件人的相同邮件)。这可以大大增加您可以推送到远程邮件服务器的电子邮件数量,但取决于它的配置方式。如果您没有配置它们或者不知道值允许,我建议您采用探测策略,首先尝试传送两封邮件并记录远程服务器的结果。如果有效则下次尝试双倍,如果失败则减少到一半。类似于在可靠传输时TCP窗口的增加情况。
<强>扩展强> 我不会这么想。实现可扩展性和可靠性要困难得多,因此更加重要。可扩展性只是能够在整个过程中连接其他步骤,并且您可以在核心系统到位时添加接口,或者当您开始添加您认为应该是可选的内置功能时。