我有一个api,可以将文档插入到mongo集合中。根据插入文档的时间,我需要在插入时间后24小时发送电子邮件,并在插入时间后48小时发送短信。我打算用_id来查找插入时间。
我的问题是,解决这个问题的最佳方法是什么?我想到的一个解决方案是每分钟运行一个脚本并查找24小时和48小时前创建的文档。
我觉得这可能是一种矫枉过正,因为我一直在查询数据库,是否有更好的解决方案或者为此目的使用mongo从根本上是错误的?
答案 0 :(得分:0)
如果脚本失效一小时,您将不会发送您应该在60分钟内发送的邮件。你应该为邮件保留一个容错标记。
这可能是一个更好的主意:在每个文档中,都有名为isMailSent24
和isMailSent48
的字段。插入时,您将始终使用'isMailSent24': false
和'isMailSent48': false
插入。因为很明显,邮件还没有发送给这些文件。
您的脚本运行的每一分钟都应该遵循:
'isMailSent24': false
和now - creationTime > 24 hours
这将返回我们尚未发送邮件24小时的文件,并且在创建后超过24小时。这意味着是时候为他们发送邮件了。大多数情况下,now - creationTime
将是24小时1分钟,因为脚本每分钟运行一次。但是如果您的脚本失败了30分钟,它仍然会发送24小时30分钟前创建的文档的邮件。这是容错的,也是一种更好的做法
'isMailSent24': true
。 'isMailSent48'
的例行程序也是如此。
答案 1 :(得分:0)
为此,您可以使用TTL索引维护另一个25小时的集合。
当您将一个条目放入主集合时,将一个相应的文档插入到新集合中,其日期字段的TTL索引应为25小时。
现在每15分钟运行一次调度程序并检查24小时后创建的所有文档,验证是否没有为该文档发送邮件并尝试发送邮件,一旦您能够发送邮件,就更新文档您已发送邮件并使用TTL索引更新日期字段。现在在24之后,我们再次发送短信,但这次不更新日期字段,因此当目的填写时,文档将被自行删除。
它的好处是您的主要集合将免于每分钟繁重的查询调用和后续更新。第二个好处是邮件和短信都被发送后,文件将被自己删除,所以不用担心清理它。
现在有一些我必须提到的后备,一,因为你从每分钟变为15分钟会有一个滞后而且不会是24小时,我认为在邮件和短信的情况下这些滞后是可以接受的。或者您可以将频率更改为5分钟。其他的事情是我没有想到失败的情况,如果邮件发送不成功,也许你可以再次拿起,但无论如何你应该用TTL更新日期字段,否则在发送短信之前文件将被删除24小时后。