并发电子邮件处理(不发送垃圾邮件)

时间:2014-08-06 07:08:38

标签: java multithreading akka

我有一个场景,我需要处理包含设备中某些模拟数据的csv文件。每行是表示某个时间点的设备状态的输出。在处理每一行时,检查特定列的方差/异常。 如果存在异常,则必须将电子邮件发送给具有检测到的异常的一群人。然而,为了避免垃圾邮件(csv有时可能是几十万行),我必须保持X秒的阈值。如果从同一条件(来自正在模拟的同一设备)发送相同异常的邮件< X秒回来,我必须忽略发送邮件。

目前我使用的解决方案对我来说似乎很笨,

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

2)创建一个"警告"每个电子邮件ID,带有创建时间戳,发送时间戳,消息ID(来自步骤1)和设备ID,状态为"新"。

3)在发送每封邮件之前,我会进行数据库阅读,以查看最后一封状态为' SENT'有一个超过要忽略的阈值的时间戳。 (现在 - 发送时间戳>阈值) 如果是,那么我使用message-id获取所有警报并将其发送出去并将其所有状态更新为SENT-否则忽略。

我从一个线程池执行器开始,并且一旦有多个线程试图发送电子邮件并更新发送时间戳,读取发送条件可能会失败。所以现在我已经将线程池大小设置为1 - 这超过了执行程序的目的。 (因为我使用Mongo作为支持db,所以我没有行级别锁定)。后备数据存储区必须是一个nosql存储区,因为字段可能会发生很大变化,并且不适合计算机的磁盘,因为更多的模拟设备会被传输。

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

Akka是否适合这种过程?任何有关实施此操作的经验的见解或经验教训都是受欢迎的(我必须坚持使用JVM)。

2 个答案:

答案 0 :(得分:1)

你可以使用分布式Akka作为替代品(参见这里的好教程http://www.addthis.com/blog/2013/04/16/building-a-distributed-system-with-akka-remote-actors/#.U-HWzvmSzy4),但为什么呢?只是稍微更新已经有效的内容:

1)完全删除Executor,这里不需要,逐个发送电子邮件(我想你不是一次性发送数百万封邮件,对吗?)

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

答案 1 :(得分:1)

如果您使用Akka Cluster,Akka可以帮助您分发。这为您的节点提供了一个动态的点对点集群,如果您需要它,非常好。从那里开始,Akka基于消息工作,这听起来像是一个很好的匹配模型你的域。

但是,请注意,Akka基于actor编程模型,这很好但与java中的多线程程序完全不同。所以有一个学习曲线。如果您需要快速解决方案,它可能不是最佳匹配。如果你愿意花一些时间来了解Akka的意思,那可能是一个很好的匹配。

相关问题