java可伸缩电子邮件通知应用程序

java可伸缩电子邮件通知应用程序,java,email,notifications,push-notification,Java,Email,Notifications,Push Notification,我需要设计和开发一个Java应用程序,在特定日期向用户发送电子邮件通知。 该信息存储在Oracle 11g数据库中。有一个包含通知记录的表,每条记录都有一个“截止日期”。 “到期日”只是通知应发送的日期(dd/mm/yyyy) 电子邮件服务器将用于发送电子邮件 该应用程序将来需要具有可扩展性,因为它可能每天发送数千封电子邮件。该应用程序还需要 记录通知是否发送失败,以便稍后重试发送 Java应用程序将托管在Oracle Weblogic 10上 设计或思考这个问题的解决方案的最佳方式是什么 我考

我需要设计和开发一个Java应用程序,在特定日期向用户发送电子邮件通知。 该信息存储在Oracle 11g数据库中。有一个包含通知记录的表,每条记录都有一个“截止日期”。 “到期日”只是通知应发送的日期(dd/mm/yyyy)

电子邮件服务器将用于发送电子邮件

该应用程序将来需要具有可扩展性,因为它可能每天发送数千封电子邮件。该应用程序还需要 记录通知是否发送失败,以便稍后重试发送

Java应用程序将托管在Oracle Weblogic 10上

设计或思考这个问题的解决方案的最佳方式是什么

我考虑过使用JMS,但不确定我是否过度设计了这个问题(如何处理失败的电子邮件?)

当然,我可以编写一个简单的Java应用程序来读取db表,获取当天要发送的所有通知,将它们存储在一个数组中,然后循环并开始在电子邮件中发送每个通知。感觉这种开发应用程序的方法非常原始,无法扩展。
我想关键在于,该解决方案应该能够处理每天可能发送数千封电子邮件。

如果您希望将发送大量电子邮件的工作分散到多个进程和/或线程上,那么使用JMS队列将是协调工作的一种可能有效的方法。它将均匀分布负载,并且如果多个接收器处理工作,它还将提供容错能力

然而,一些困难可能包括以下方面:

  • JMS消息接收通常不保证是有序的。用于稍后时间的通知可能会在较早时间之前送达
  • 维护数据库表和队列之间的协调可能很困难。针对表的每次插入/更新/删除也可能需要将消息发布到队列
  • 可能不希望将所有未来的请求同时发布到队列
  • 可能需要一种机制通过 排队
一种可能的解决办法:

让一个高效、灵活的前端流程每隔一段时间读取一次该表,并确定哪些通知将很快到期。理想情况下,数据库表将被索引和/或分区以优化此查询。只有这些数据被发布到JMS队列。队列中的消息包含对数据库行的引用。服务进程在执行通知之前检索数据库行,从而检测更改/取消


这种方法的致命弱点是前端流程。必须努力确保它始终运行,并且本身具有容错性。此外,前端必须具有足够的吞吐量,以便在任何给定时刻处理整个负载。如果这是不可能的,那么可能需要多个前端进程。这些可以轮流进行(例如,奇数分钟、偶数分钟等),也可以由另一个队列自行协调。

如果您添加一个额外的字段“EMAIL\u SENT”并让电子邮件服务器处理重试,这几乎可以简单地处理。请注意,它需要是生产质量的SMTP服务器,如postfix或sendmail

然后,只需使用due_date
您很可能会发现,现代硬件可以轻松地处理此负载。

如果select查询返回(例如)10000条记录/当天要发送的通知,那么在等待处理的10000条记录中,您会将它们存储在哪里?在数组列表中?这有效吗?只需在结果集上循环。这将比您想象的要快。如果您有1个JMS队列。你建议创建多少听众/接收者来处理每天发送10000封电子邮件的工作量?我想,在真空中是不可能的。如果通知均匀地分布在一天中,那么1万条就不算多了。我将从两个侦听器开始,并根据您增加负载时它的伸缩性来确定计时。电子邮件服务器的功能也可能是一个因素。