如何每隔 'x' 小时向 Slack 发送消息?
How to send message to Slack every 'x' number of hours?
我有一个配置页面,用户可以在其中 select 在什么时间从我的 API 接收某些信息,例如他们可以 select 每天在下午 5 点或每周五下午 5 点。设置后,用户应该在他们定义的时间收到一条 Slack 消息,例如,每天下午 5 点他们会收到一条消息...
我保存了用户的时区,以便我可以在正确的时间在 Slack 中向他们发送消息。
话虽这么说,我怎样才能安排这条消息从我的 node.js 应用发送出去?我会在系统中有几个用户,所有这些用户可能会选择不同的时间,所以我需要每个用户一个计时器?
我唯一能想到的就是扫描系统中的所有用户,获取他们的 selected 时间,然后将消息发送给他们...但这似乎无法扩展。
我不是在为此寻找完整的解决方案,只是寻找一些有关如何设计此类功能的指示。
我还查看了 Slack 预定消息,但这并不是我要找的。注:我已经可以给Slack发消息了,我更感兴趣的是如何搭建定时器机制
提前致谢!
编辑:
做了更多研究,看起来 node-schedule 可能是安排作业的一个选项:https://github.com/node-schedule/node-schedule#readme
通过使用这个包,我在比方说每天午夜扫描我数据库中的所有用户并根据他们的设置安排作业的方法......然后这些作业在他们安排的时间执行并且用户收到消息在松弛。这是一个好方法吗?
这是常规任务吗?换句话说,它每天都在同一时间为用户X执行?如果是这样,node-schedule
看起来很好,它可以定期 运行 相同的工作,你只需要通过 cron-like 字符串正确设置它(参见 README 中的说明)。如果用户更改了他们的设置,则您将修改之前的作业。 node-schedule
的缺点是每次加载应用程序时都需要对其进行设置,如果用户太多,这可能需要一段时间并消耗大量资源。
或者,如果用户数量很大或者您希望让您的应用程序保持无状态,您可以设置多个槽来发送这些消息(并且 运行 在与您的主应用程序不同的进程中).比方说,每 30 分钟一个时段。然后为这些时间段设置计时器(如果你愿意,可以使用 node-schedule
,它将只有 48 个计时器),从数据库中获取该时间段的用户列表,然后发送消息。
总的来说,NodeJS/JavaScript 这种 timer-based 调度非常有效。如果您想 in-depth 深入了解原因,请参阅:https://nodejs.org/de/docs/guides/event-loop-timers-and-nexttick/
您还需要考虑如果您的应用程序出现停机会发生什么情况。是否应该保证用户收到这些消息,即使他们迟到了?但那是另一个故事:-)
对于核心逻辑,我建议如下:
- 在您的数据库中存储每个用户的递送时间(例如每周五早上 5 点)
- 然后有一个定期 运行ning 的工作进程,例如
每 5 分钟
- 当它 运行 时,它会检查是否有任何到期的消息要传递
- 如果是,它将包含您的 API 信息的消息发送给用户并为用户存储上次发送的时间
这种方法可以适应停机时间。一旦工作进程在停机后再次 运行ning ,它将恢复发送到期消息。
它也是可扩展的:如果需要,您可以 运行 多个工作进程(确保将您的工作进程设计为支持并发处理,例如事务处理)
需要考虑的一些其他事项:
- 将限制每个 运行 发送的消息数量,避免超时和并行 运行 宁宁
的工作人员过多
- 如果向 Slack 发送消息失败,您需要一些错误处理
- 为了避免时区复杂性,我建议将所有时间转换为 UTC 以便在您的应用程序中进行处理
我有一个配置页面,用户可以在其中 select 在什么时间从我的 API 接收某些信息,例如他们可以 select 每天在下午 5 点或每周五下午 5 点。设置后,用户应该在他们定义的时间收到一条 Slack 消息,例如,每天下午 5 点他们会收到一条消息...
我保存了用户的时区,以便我可以在正确的时间在 Slack 中向他们发送消息。
话虽这么说,我怎样才能安排这条消息从我的 node.js 应用发送出去?我会在系统中有几个用户,所有这些用户可能会选择不同的时间,所以我需要每个用户一个计时器?
我唯一能想到的就是扫描系统中的所有用户,获取他们的 selected 时间,然后将消息发送给他们...但这似乎无法扩展。
我不是在为此寻找完整的解决方案,只是寻找一些有关如何设计此类功能的指示。
我还查看了 Slack 预定消息,但这并不是我要找的。注:我已经可以给Slack发消息了,我更感兴趣的是如何搭建定时器机制
提前致谢!
编辑:
做了更多研究,看起来 node-schedule 可能是安排作业的一个选项:https://github.com/node-schedule/node-schedule#readme
通过使用这个包,我在比方说每天午夜扫描我数据库中的所有用户并根据他们的设置安排作业的方法......然后这些作业在他们安排的时间执行并且用户收到消息在松弛。这是一个好方法吗?
这是常规任务吗?换句话说,它每天都在同一时间为用户X执行?如果是这样,node-schedule
看起来很好,它可以定期 运行 相同的工作,你只需要通过 cron-like 字符串正确设置它(参见 README 中的说明)。如果用户更改了他们的设置,则您将修改之前的作业。 node-schedule
的缺点是每次加载应用程序时都需要对其进行设置,如果用户太多,这可能需要一段时间并消耗大量资源。
或者,如果用户数量很大或者您希望让您的应用程序保持无状态,您可以设置多个槽来发送这些消息(并且 运行 在与您的主应用程序不同的进程中).比方说,每 30 分钟一个时段。然后为这些时间段设置计时器(如果你愿意,可以使用 node-schedule
,它将只有 48 个计时器),从数据库中获取该时间段的用户列表,然后发送消息。
总的来说,NodeJS/JavaScript 这种 timer-based 调度非常有效。如果您想 in-depth 深入了解原因,请参阅:https://nodejs.org/de/docs/guides/event-loop-timers-and-nexttick/
您还需要考虑如果您的应用程序出现停机会发生什么情况。是否应该保证用户收到这些消息,即使他们迟到了?但那是另一个故事:-)
对于核心逻辑,我建议如下:
- 在您的数据库中存储每个用户的递送时间(例如每周五早上 5 点)
- 然后有一个定期 运行ning 的工作进程,例如 每 5 分钟
- 当它 运行 时,它会检查是否有任何到期的消息要传递
- 如果是,它将包含您的 API 信息的消息发送给用户并为用户存储上次发送的时间
这种方法可以适应停机时间。一旦工作进程在停机后再次 运行ning ,它将恢复发送到期消息。
它也是可扩展的:如果需要,您可以 运行 多个工作进程(确保将您的工作进程设计为支持并发处理,例如事务处理)
需要考虑的一些其他事项:
- 将限制每个 运行 发送的消息数量,避免超时和并行 运行 宁宁 的工作人员过多
- 如果向 Slack 发送消息失败,您需要一些错误处理
- 为了避免时区复杂性,我建议将所有时间转换为 UTC 以便在您的应用程序中进行处理