基于Web的IMAP客户端是否应该拥有自己的数据库?

9 imap web

在构建基于Web的IMAP客户端时,是否应该让Web服务器直接与IMAP服务器通信,或者我是否应该在需要时同步中间的数据库?

And*_*ock 7

您提出问题这一事实意味着您担心网络邮件前端无法有效地与IMAP后端一起使用.我可以想到几个原因,如果我错了,请纠正我:

  1. 无状态的webmail客户端将在IMAP服务器上进行大量调用,并且其中很多将基本上重复(例如,当用户刷新屏幕时).您担心呼叫的数量以及大多数呼叫的严格不必要性将:
    1. 压倒IMAP服务器,或
    2. 与第三方IMAP提供商一起处理大型网络/数据/ SLA账单,或
    3. 比直接数据库访问慢得多
  2. IMAP服务器是外部的,有时可能无法用于您的数据中心,您需要确保Webmail客户端继续为您的客户提供服务.

需要做出关键决策点,但我认为这取决于您需要连接的IMAP服务器是组织内部还是外部.

  • 内部:
    1. Webmail组件的性能可能会延迟到IMAP服务器
  • 外部:
    1. 网络带宽IMAP使用是昂贵的
    2. 表现如上
    3. 您需要在主IMAP服务器脱机时镜像邮件数据.

在这种背景下,您正在考虑是否可以在没有数据库的情况下离开,因为您知道添加此图层将是:

  1. 昂贵
  2. 大大增加项目时间表(用于设计,开发和测试)
  3. 为项目增加技术和交付风险
  4. 添加一个您可能没有的主要架构组件.

内部IMAP服务器 - 性能

首先,对系统进行基准测试以确定是否确实存在性能损失可能是一个好主意.我的直觉说没有必要,因为那里有许多高度响应的网络邮件系统.

首先,有许多非常好的IMAP代理服务器可以使IMAP连接保持活跃,从而显着降低延迟.例子包括:

其次,如果您将IMAP服务器和Webmail Web应用程序视为一个系统,那么您可能不会将IMAP数据缓存在另一个数据库中.您将从IMAP服务器向数据库引入数据延迟,导致数据和数据库管理问题,并引入具有许多新故障点的系统复杂性.

相反,您可以优化您的IMAP服务器以使用webmail应用程序吗?这可能涉及购买额外的服务器或升级您当前的服务器 - 但与此同时,您的Webmail服务器将会小得多,您不必购买数据库服务器.

IMAP服务器几乎肯定具有内部缓存以提高性能,并且几乎肯定使用数据库(具有自己的缓存等) - 多年来经过多年的调整和调试.您可以利用这种经验和成熟度.

让我们想象一个假设的问题 - 系统变大并开始遇到性能问题.使用自定义数据库表调整和扩展自定义应用程序是否更容易,或者是否更容易扩展广泛使用的商业或开源IMAP服务器,并提供商业支持和良好的测试文档?

外部IMAP服务器 - 最小化流量并最大限度地提高性能

考虑到这一点,目标是最小化IMAP协议呼叫,因为它们的时间(网络延迟)或金钱都很昂贵.

首先,您可以使用IMAPProxy(如上所述)来确保连接保持活动状态并且用户已登录.

另外,我认为你需要使用数据库但是在缓存模式而不是完整的数据模型.例如,您可以使用NoSQL DB(键值或对象db)而不是SQL DB:

  • 存储对象(消息,文件夹元数据,附件等)而不是非规范化数据
  • 可能不需要ACID行为 - 它是一个缓存
  • 大多数按对象id或类查找,而不是由复杂的WHERE子句查找

以这种方式实现将使任务非常具体用例或用户故事,降低成本和风险并使系统更易于测试.如果您的实现中存在严重问题,则可以刷新整个缓存并恢复服务.

数据和数据库管理也将更加容易,并且不会存储完整用户的邮箱.

外部IMAP服务器 - 断开连接的模型

这预示着您正在为外部IMAP服务提供Webmail客户端,并且您知道外部IMAP服务会定期脱机,但您仍需要向用户提供电子邮件.

在这里,您显然需要在本地数据库中镜像用户的电子邮件.我建议您查看一个架构解决方案,其中您有一个本地IMAP服务器,并且您使用许多开源IMAP同步工具中的任何一个来镜像第三方IMAP服务器.这里的好处是:

  1. 对于您的webmail应用程序,本地IMAP服务器看起来与任何其他IMAP服务器完全相同,从而简化了Webmail客户端
  2. 对于许多边缘情况,同步是一个棘手的问题; 所有这些都已经解决过了
  3. 通过拥有完整的本地IMAP服务器,您可以获得具有可选支持的完全可管理的组件,而无需开发成本
  4. 您可以让一些用户直接连接到外部IMAP服务器,有些用户可以使用这种架构连接到缓存的用户 - 它只是一个URL

缺点是:

  • 存储重复电子邮件可能会产生巨大成本
  • 用户查看新电子邮件的滞后时间,因为必须先在外部IMAP服务器上检测,然后再在本地检测.

您可以在本地使用许多IMAP服务器之一,并且为了同步,以下是一些可能性:

(免责声明:我自己没有使用过这些工具)