java可扩展的电子邮件通知应用程序[关闭]
Posted
技术标签:
【中文标题】java可扩展的电子邮件通知应用程序[关闭]【英文标题】:java scalable email notification app [closed] 【发布时间】:2013-05-27 23:19:04 【问题描述】:我需要设计和开发一个在特定日期向用户发送电子邮件通知的 Java 应用程序。 信息存储在 Oracle 11g 数据库中。有一个包含通知记录的表,每条记录都有一个“截止日期”。 “到期日期”只是应该发送通知的日期 (dd/mm/yyyy)。
电子邮件服务器将可用于发送电子邮件。
该应用程序将来需要可扩展,因为它可能每天发送数千封电子邮件。该应用程序还需要 记录通知是否发送失败,以便稍后重试发送。
Java 应用程序将托管在 Oracle Weblogic 10 上
设计或思考解决此问题的最佳方法是什么?
我考虑过使用 JMS,但不确定我是否过度设计了问题(您如何处理失败的电子邮件?)。
当然,我可以编写一个简单的 Java 应用程序来读取 db 表,获取在该日期发送的所有通知,将它们存储在一个数组中,然后循环并开始在电子邮件中发送每个通知.感觉这种开发应用程序的方式非常原始,无法扩展。 我想关键在于该解决方案应该能够处理每天可能发送的数千封电子邮件。
【问题讨论】:
【参考方案1】:如果您希望在多个进程和/或线程上分配发送大量电子邮件的工作,那么使用 JMS 队列将是协调工作的一种潜在有效方式。如果有多个接收器正在处理工作,它可以均匀地分散负载,并且还可以提供容错能力。
然而,一些困难可能包括:
JMS 消息接收通常不保证是有序的。打算稍后发送的通知可能会在较早的通知之前发送。 可能难以保持数据库表和队列之间的协调。对表的每次插入/更新/删除也可能需要将消息发布到队列中。 可能不希望一次将所有未来请求发布到队列中。 可能需要一种机制来通过以下方式传播已取消的请求 进入队列。一种可能的解决方案:
让一个高效、灵活的前端进程每隔一段时间读取该表,并确定哪些通知即将到期。理想情况下,数据库表将被索引和/或分区以优化此查询。只有这些数据发布到 JMS 队列。队列中的消息包含对数据库行的引用。服务进程在执行通知之前检索数据库行,从而检测更改/取消。
这种方法的致命弱点是前端流程。必须努力确保它始终运行并且本身具有容错性。此外,前端必须有足够的吞吐量来处理任何给定时刻的整个负载。如果这不可能,则可能需要多个前端进程。这些可以轮流进行(例如,奇数分钟、偶数分钟等),也可以由另一个队列自行协调。
【讨论】:
如果您有 1 个 JMS 队列。您建议创建多少个侦听器/接收器来处理每天发送 10,000 封电子邮件的负载? 我认为不可能凭空说出来。如果通知在一天中均匀分布,10,000 条确实不是很多。我将从 2 个侦听器开始,并在增加负载时计算它的扩展方式。您的电子邮件服务器的功能也可能是一个因素。【参考方案2】:如果您添加一个额外的字段“EMAIL_SENT”并让电子邮件服务器处理重试,这几乎可以非常简单地处理。请注意,它需要是生产质量的 SMTP 服务器,例如 postfix 或 sendmail!
然后您只需使用 due_date
您很可能会发现现代硬件可以轻松处理这种负载。
【讨论】:
如果选择查询返回,比如说,10,000 条记录/通知要在当天发送,那么您将把这 10,000 条等待处理的记录存储在哪里?在数组列表中?这效率高吗? 只需遍历结果集。这将比您想象的要快。以上是关于java可扩展的电子邮件通知应用程序[关闭]的主要内容,如果未能解决你的问题,请参考以下文章