javascript - 如何每'x'小时向Slack发送消息?
问题描述
我有一个配置页面,用户可以选择在什么时间从我的 API 接收某些信息,例如他们可以选择每天下午 5 点或每个星期五下午 5 点获取信息。设置好之后,用户应该在他们定义的时间收到一条 Slack 消息,例如,每天下午 5 点他们会收到一条消息...
我保存了用户的时区,以便我可以在正确的时间在 Slack 中将消息发送给他们。
话虽如此,我如何安排此消息从我的 node.js 应用程序发送出去?我将在系统中有几个用户,所有这些用户都可能选择不同的时间,所以我需要每个用户一个计时器?
我唯一能想到的就是扫描系统中的所有用户,获取他们选择的时间,然后将消息发送给他们……但这似乎不可扩展。
我不是在寻找一个完整的解决方案,只是关于如何设计这种功能的一些指示。
我还查看了 Slack 预定消息,但这并不是我想要的。注意:我已经可以向 Slack 发送消息了,我对如何构建计时器机制更感兴趣。
提前致谢!
编辑:
做了更多的研究,看起来 node-schedule 可能是安排作业的一个选项:https ://github.com/node-schedule/node-schedule#readme
通过使用这个包,我可以在每天午夜扫描数据库中的所有用户并根据他们的设置安排作业……然后这些作业在预定时间执行,用户在 Slack 中接收消息。这是一个好方法吗?
解决方案
这是常规任务吗?换句话说,对于用户 X,它每天在同一时间执行?如果是这样,node-schedule
看起来不错,并且它可以定期运行相同的作业,您只需通过类似 cron 的字符串正确设置它(请参阅自述文件中的说明)。如果用户更改了他们的设置,那么您就可以修改之前的作业。缺点node-schedule
是每次加载应用程序时都需要设置它,如果用户太多,这可能需要一段时间并消耗大量资源。
或者,如果用户数量很大,或者您希望让应用程序保持无状态,您可以设置多个插槽来发送这些消息(并在与主应用程序不同的进程中运行)。比方说,每 30 分钟一个插槽。然后为这些时隙设置定时器(node-schedule
如果你愿意,可以使用,它只有 48 个定时器),从数据库中获取该时隙的用户列表,然后发送消息。
总的来说,NodeJS/JavaScript 对于这种基于计时器的调度非常有效。如果您想深入了解原因,请参阅:https ://nodejs.org/de/docs/guides/event-loop-timers-and-nexttick/
您还需要考虑如果您的应用程序出现停机会发生什么。是否应该保证用户即使迟到也能收到这些消息?但这是另一个故事:-)
推荐阅读
- javascript - JavaScript preventDefault 影响孩子
- python - 类型字符变化的 DataError 值太长(100)
- spring - How can I secure Spring controller to not accept wrong type of path variables passes in URL?
- ruby-on-rails - ruby aasm gem:事件名称更改,但允许的方法仍然要求旧事件名称
- aws-glue - 如何使用 AWS Glue 访问和分析本地数据存储
- android - configuration.setLocale(locale) 不适用于 AppCompatDelegate.setDefaultNightMode
- python - 通过合并两列重新索引 pandas 数据帧
- c - skb_header_pointer 和 skb_transport_header 的区别?
- awk - 在多行匹配后追加文本行并在第一个多行匹配时停止
- sql - 使用 SQL Server:如何在父子关系中显示数据