前言:我有一个web应用,后端是基于无服务器架构的。它基本上是一个托管在亚马逊网络服务上的放大应用程序,带有dynamoDB数据库。我了解到有可能创建一个排序more here的任务调度系统。这篇文章的简短总结是“可以创建一个任务调度表,利用TTL和dynamoDB流在特定时间执行lambda函数。TTL指定要删除的记录的设置时间,我们可以在dynamoDB流中捕获此删除事件,并根据流中的信息运行一些任务”。
问题:目标是向注册了我们服务的用户发送一系列电子邮件。每个注册的用户都会收到一系列的“入门”电子邮件。第一封电子邮件在用户注册24小时后发送,第二封在3天后发送,第三封恰好在注册7天后发送。
我知道cron工作在这里是如何合适的,但它对我来说似乎有点低效。我基本上必须在users表中搜索其注册时间落在特定24小时内的用户,并将电子邮件发送给用户,而使用任务计划器表,我可以向表中添加任务(类似于send first email to user300,其TTL为我想要发送它的时间),并侦听用于运行任务的删除事件。不需要每天运行cron作业,只需要一个函数来处理每个任务。
我认为这更像是性能与存储的问题。有一个任务计划器表将占用空间,如果我们将所有要发送给用户的电子邮件作为表上的任务(每个要发送给特定用户的电子邮件都是它自己的任务),那么每次用户注册时,我都会看到任务计划器表为每n个注册用户增加了3n条记录。但这可能不是问题,因为任务在运行后会被删除。我不知道使用cron作业来完成此特定任务的性能成本,因此我在这里。我也可能错了,运行和更新这个任务调度器表的成本可能比cron作业的成本更高。
我最初考虑建立一个虚拟用户表,同时运行cron和任务调度程序,并记录运行这两个程序的成本,但您可以想象这将花费多少时间和精力。
因此,我想我的问题是,在性能和成本方面,哪种解决方案更有效?
发布于 2021-01-09 17:48:41
这里没有完美的解决方案。请记住,Dynamodb TTL最多需要48小时才能调用,因此这可能是不可接受的。使用Lambda的CRON Job很便宜,而且很容易设置。您还可以使用SQS并使用daily CRON填充它。Yan Cui写了一篇关于这个问题的很棒的文章https://theburningmonk.com/2019/03/dynamodb-ttl-as-an-ad-hoc-scheduling-mechanism/
发布于 2021-01-09 15:58:48
这可能不是一个确切的答案。根据你链接的medium文章,这家伙有一个合理的理由,为什么TTL和dynamoDB流比你重申的cron工作更好。设置cron作业更容易,也更便宜(免费),我怀疑除非数据库很大,否则性能会变得更差。我没有做这样的事情的经验,所以我不知道数据库必须有多大才能有意义地切换。或者,您可以拥有任意数量的cron作业,所以我不明白您为什么不能在有人注册时设置特定于用户的cron作业。
发布于 2021-01-09 22:17:10
您可以设置一个CloudWatch事件来按常规计划触发Lambda函数。Lambda函数可以在数据库中搜索适用的结果集,并执行其他操作-发送电子邮件、文本消息等。
这是一个AWS教程,它涵盖了一个非常相似的用例,并提供了逐步说明。本教程是使用AWS Java API实现的(但您也可以使用其他受支持的编程语言实现它)。
从成本的角度来看- Lambda允许每月100万次免费请求。详情在此- https://aws.amazon.com/lambda/pricing/
https://stackoverflow.com/questions/65640091
复制相似问题