1

好的,我在处理每封电子邮件时做了大量的工作。假设我在为系统制作人工智能,他会自动回复他收到的电子邮件,但我仍然不知道从哪里开始。

这就是我的想法

架构 1 在此处输入图像描述

问题 :

  1. 假设我们每秒有 1000 封电子邮件,邮件服务器、exim 或 sendmail、davecot 等究竟是如何工作的?

  2. parseandsavetomysql.py 可以通过管道在一秒钟内处理 1000 封电子邮件吗?这也是如何工作的?顺便说一句,目前它工作正常,但我需要知道这一点。

  3. 我对工人的逻辑是否正确?还是排队系统?我试图看到 resque 和朋友,但我仍然不明白我们如何锁定会话让我们在这个问题中说“嘿,我正在处理这个文件不适用于 email1.rawemail 工作在其他”我们怎样才能做到正确或更简单的方法?

架构 2

在此处输入图像描述

问题?

  1. 如书面
  2. pop/stmp 服务器如何每秒接收 1000 封电子邮件?
  3. 我们可以通过 imap 和 pop 获取电子邮件吗?因为我们只是在处理 pop3 是选择性能的正确方法吗?我目前正在使用的 php 上有一个 imap_open

添加在

  1. 有没有很好的链接或博客文章可以解决与我相同的问题?
  2. 请给我解决我的问题的项目、应用程序或第三方的链接?
  3. 如果有什么想法,请写下来。

感谢您的帮助,亚当·拉马丹

编辑了我当前的架构

在此处输入图像描述

4

1 回答 1

2

就像许多“大图”架构问题一样,最好的解决方案确实是其中之一……这取决于。你能控制部署环境吗?也就是说...您可以使用任何您喜欢的电子邮件服务器,还是只能使用已经安装和托管的电子邮件服务器?您可以在与 SMTP 服务相同的机器上运行代码吗?应该考虑这些问题以及许多其他问题来提出(接近)最佳架构。

鉴于此,我将做一些假设并提供一些我认为值得探索的想法......

您应该研究一个高性能的消息传递系统。具体来说,看看RabbitMQ。RabbitMQ 可靠且高效,基于异步传入事件的工作负载分配是他们在他们的(在我看来,非常好的)教程中专门讨论的一种模式。

使用这样的消息传递服务器,您有一个接收传入电子邮件的进程。最好这是作为 SMTP 过程的一部分完成,或者至少非常接近它 - 特别是在您提到的工作负载下。如果您别无选择,那么您关于使用 cron 通过 POP 或 IMAP 收集消息的想法现在必须奏效。

然后,电子邮件收集过程会将消息推送到 RabbitMQ 队列中。(也许不是字面上的电子邮件本身,虽然这是一种可能性,但我认为更像是对电子邮件有效存储位置的引用)。然后,您运行多个订阅了命名消息队列的工作进程。RabbitMQ(或您决定的任何消息传递服务)然后将以循环方式将这些消息分发给各个订阅者。如果已经加载,工作进程可以 NACK 消息,或者将自己的控制流消息发送回服务。对于非常高的工作量(再次,就像您提出的那样),我强烈推荐某种管理过程来密切关注分布式系统的整体健康状况。经理将收集运行时统计数据(对于整个系统的未来增长计划、优化和重构非常有用),并且能够启动和关闭新的工作进程。在您达到如此高的工作量之前,并假设您的工作进程是稳定的并且可以在没有内存碎片等的情况下存活很长时间,那么仅使用消息服务器来分配工作就足够了。

对于它的价值,我有一些编写电子邮件处理器的经验(特别是xmail - 如果您刚刚开始您的项目并且对它的早期阶段有很多控制,我会推荐它)。另外,我目前正在使用 RabbitMQ 为主要的科学计算网格构建多代理结果缓存系统。

无论如何......祝你的项目好运!

于 2012-05-11T16:16:32.650 回答