Java 并发电子邮件处理(无垃圾邮件)

Java 并发电子邮件处理(无垃圾邮件),java,multithreading,akka,Java,Multithreading,Akka,我有一个场景,我需要处理一个csv文件,其中包含来自设备的一些模拟数据。每一行都是一个输出,表示某一时间点的设备状态。在处理每一行时,检查特定列的差异/异常。 如果有异常,必须向一群检测到异常的人发送电子邮件。然而,为了避免垃圾邮件(csv有时可能是几十万行),我必须保持X秒的阈值。也就是说,如果在相同条件下(从模拟的同一设备)针对相同的异常情况发送邮件阈值) 如果是,那么我将使用消息id获取所有警报,并将它们发送出去,并将它们的所有状态更新为“已发送”-否则只需忽略 我从一个线程池执行器开始,

我有一个场景,我需要处理一个csv文件,其中包含来自设备的一些模拟数据。每一行都是一个输出,表示某一时间点的设备状态。在处理每一行时,检查特定列的差异/异常。 如果有异常,必须向一群检测到异常的人发送电子邮件。然而,为了避免垃圾邮件(csv有时可能是几十万行),我必须保持X秒的阈值。也就是说,如果在相同条件下(从模拟的同一设备)针对相同的异常情况发送邮件 目前我使用的解决方案对我来说似乎很笨拙,在哪里

1) 我用异常检测时间保存邮件消息和设备id

2) 每个电子邮件id创建一个“警报”,带有创建时间戳、发送时间戳、消息id(来自步骤1)和状态为“新建”的设备id

3) 在发送每封邮件之前,我都会读取数据库,看看最后一封状态为“已发送”的邮件是否有超过可忽略阈值的时间戳。(现在-发送的时间戳>阈值) 如果是,那么我将使用消息id获取所有警报,并将它们发送出去,并将它们的所有状态更新为“已发送”-否则只需忽略

我从一个线程池执行器开始,中途意识到,一旦有多个线程试图发送电子邮件并更新发送的时间戳,read-send条件可能会失败。所以现在我已经将线程池大小设置为1-这超出了执行器的用途。(我没有行级锁定,因为我使用Mongo作为后台数据库)。备份数据存储必须是一个nosql存储,因为字段可能会有很大的变化,并且随着越来越多的模拟输入,这些字段将不适合机器的磁盘

应用程序是分布式的,因此任何随机节点都可以选择csv文件进行处理和通知


阿克卡会是这种过程的一个很好的候选人吗?欢迎您从以前的实现经验中获得任何见解或教训(我必须坚持使用JVM)。

您可以使用分布式Akka作为替代(请参阅此处的良好教程),但为什么?只需稍微更新已起作用的内容:

1) 完全删除Executor,这里不需要它,一个接一个地发送电子邮件(我想你不会试图一次发送数百万封邮件,对吧?)


2) 清理应用程序上的旧邮件数据库开始解决磁盘空间问题。

如果您使用Akka群集,Akka可以帮助您进行分发。这在节点上为您提供了一个动态的对等集群,如果您需要的话,这非常好。除此之外,Akka还基于消息工作,这听起来很适合为您的域建模

但是,请注意,Akka基于actor编程模型,这很好,但实际上与java中的多线程程序不同。所以有一个学习曲线。如果您需要快速解决方案,它可能不是最佳匹配。如果你愿意花点时间在这件事上,并了解阿克卡是关于什么的,这可能是一个很好的匹配