好的,我正在处理每封电子邮件的繁重过程。假设我正在为一个系统制作一个人工智能,他会自动回复他收到的电子邮件,但我仍然不知道从哪里开始。
这是我的想法
架构 1
问题:
假设我们有 1000 封电子邮件/秒邮件服务器、exim 或 sendmail、davecot 等到底是如何工作的?
parseandsavetomysql.py 能否通过管道在一秒钟内处理 1000 封电子邮件?那又如何工作?顺便说一句,目前它工作正常,但我需要了解这一点。
关于 worker ,我的逻辑正确吗?或排队系统?我已经尝试查看 resque 和 friend ,但我仍然不明白我们如何锁定 session 让我们在这个问题中说“嘿,我正在处理这个文件,不能在 email1 上工作。rawemail 可以在其他上工作”我们如何正确地做到这一点还是更简单的方法?
架构二
有问题吗?
- 书面
- pop/stmp 服务器如何能够每秒接收 1000 封电子邮件?
- 我们可以通过 imap 和 pop 接收电子邮件吗?因为我们只是处理 pop3 是选择性能的正确方法吗? 我目前正在使用的 php 上有一个 imap_open
插件
- 是否有解决与我相同问题的好链接或博客文章?
- 请给我解决我问题的项目、应用程序或第 3 方的链接?
- 如果有什么想法,请写下来。
感谢您的帮助,Adam Ramadhan
编辑我当前的架构
最佳答案
就像很多“大局”架构问题一样,最好的解决方案确实是其中之一......这取决于。你能控制部署环境吗?也就是说...您可以使用任何您喜欢的电子邮件服务器,还是只能使用已经安装和托管的电子邮件服务器?您可以在与 SMTP 服务相同的机器上运行代码吗?应考虑这些问题以及许多其他问题,以提出(接近)最佳架构。
鉴于此,我将做出一些假设并提供一些我认为值得探索的想法...
您应该研究一个高性能消息传递系统。具体看RabbitMQ . RabbitMQ 可靠且高效,基于异步传入事件的工作负载分配是他们在(我认为非常好的)教程中专门讨论的一种模式。
有了这样的消息服务器,您就有了一个接收传入电子邮件的进程。这最好作为 SMTP 流程的一部分完成,或者至少非常接近它 - 特别是对于您提到的工作负载。如果您别无选择,那么您关于使用 cron 通过 POP 或 IMAP 收集消息的想法暂时必须奏效。
然后,电子邮件收集过程会将消息推送到 RabbitMQ 队列中。 (也许不是字面上的电子邮件本身,虽然这是可能的,但我认为更像是对电子邮件有效存储位置的引用)。然后运行多个订阅命名消息队列的工作进程。 RabbitMQ(或您决定使用的任何消息服务)然后将以循环方式将这些消息分发给各个订阅者。如果已加载,工作进程可以 NACK 消息,或将自己的控制流消息发送回服务。对于非常高的工作负载(同样,就像您所建议的那样),我强烈建议使用某种管理流程来密切关注分布式系统的整体健康状况。经理将收集运行时统计信息(对于 future 的增长规划、优化和重构整个系统非常有用),并有能力启动和关闭新的工作进程。在您达到非常高的工作负载之前,并假设您的工作进程稳定并且可以长时间存在而不会出现内存碎片等情况,那么只需使用消息服务器来分发工作就足够了。
对于它的值(value),我有一些编写电子邮件处理器的经验(特别是 xmail - 如果您刚刚开始您的项目并且对其早期有很多控制,我会推荐阶段)。此外,我目前正在使用 RabbitMQ 为一个主要的科学计算网格构建一个多代理结果缓存系统。
无论如何......祝你的项目好运!
关于php - 电子邮件解析和处理架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10554482/