Cron Jobs与任务调度程序表的计划电子邮件



前言:我有一个web应用程序,后端基于无服务器架构。它基本上是一个在AWS上托管的带有dynamoDB数据库的放大应用程序。我学到了在这里创建一个任务调度系统的可能性。文章的简要总结是";可以创建一个任务调度表,利用TTL和dynamoDB流在特定时间执行lambda函数。TTL指定了要删除的记录的设置时间,我们可以在dynamoDB流中捕获这个删除事件,并基于来自流的信息运行一些任务";

问题:我们的目标是向注册我们服务的用户发送一系列电子邮件。每个注册的用户都会得到一系列的";入门;电子邮件。第一封电子邮件在用户注册后24小时发送,第二封在3天后发送,第三封在注册后7天发送。

我知道cron工作在这里是多么合适,但对我来说,这似乎有点低效。基本上,我必须在用户表中搜索注册时间在特定24小时内的用户,并将电子邮件发送给用户,而使用任务调度程序表,我可以向表中添加一个任务(类似于send first email to user300,TTL为我希望发送的时间(,并侦听删除事件以运行任务。不需要每天运行cron作业,只需要一个函数来处理每个任务。

我认为这更像是性能与存储的问题。有一个任务调度器表会占用空间,如果我们每次用户注册时都将发送给用户的所有电子邮件作为任务添加到表中(发送给特定用户的每封电子邮件都是它自己的任务(,那么我会看到任务调度器表为每注册n个用户增加3n条记录。但这可能不是真正的问题,因为任务在运行后会被删除。我不知道为这个特定任务使用cron作业的性能成本,所以我在这里。我也可能错了,运行和更新这个任务调度程序表的成本可能比cron作业的成本更高。

我最初考虑建立一个虚拟用户表,同时运行cron和任务调度程序,并记录运行这两个程序的成本,但您可以想象这需要花费多少时间和精力。

所以我想我的问题是,就性能和成本而言,哪种解决方案更有效?

这里没有完美的解决方案。请记住,Dynamodb TTL需要长达48小时才能调用,因此这可能是不可接受的。CRON Lambda的工作很便宜,而且很容易设定。您还可以使用SQS并用每日CRON填充它。严翠写了一篇关于这个问题的伟大文章https://theburningmonk.com/2019/03/dynamodb-ttl-as-an-ad-hoc-scheduling-mechanism/

这可能不是一个确切的答案。根据你联系的媒体文章,这家伙有一个合理的理由,为什么TTL和dynamoDB流会比你重申的cron工作更好。设置cron作业更容易、更便宜(免费(,我怀疑除非数据库很大,否则性能会差得多。我没有任何这样做的经验,所以我不知道数据库必须有多大才能切换。或者,你可以拥有你想要的任意多个cron作业,所以我不明白你为什么不能在有人注册时只设置一个特定于用户的cron作业。

您可以设置CloudWatch事件以定期触发Lambda函数。Lambda功能可以在数据库中搜索适用的结果集,并执行其他操作-发送电子邮件、短信等。

这里有一个AWS教程,它涵盖了一个非常相似的用例,并提供了分步说明。本教程通过使用AWS Java API实现(但您可以使用其他支持的编程语言实现(。

https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javav2/usecases/creating_scheduled_events

从成本角度来看,Lambda每月允许100万次免费请求。详情如下-https://aws.amazon.com/lambda/pricing/

最新更新