Ruby on rails 在Rails应用程序中保存/更新一次性时间戳的正确方法

Ruby on rails 在Rails应用程序中保存/更新一次性时间戳的正确方法,ruby-on-rails,Ruby On Rails,刚接触Rails,正在寻找一种“正确”的方式来做一些看似简单的事情,但我所读到的任何东西听起来都不太正确 我在Heroku上有一个Rails应用程序,我添加了一个对依赖于外部系统的端点的调用。如果该呼叫不成功,则需要进行一些后续操作,因此我将详细信息保存到错误日志中。我已经添加了一封通知电子邮件(对于这类事情,发送到一个空闲的房间)来提示我检查日志,并在发生这种情况时进行跟踪 如果端点陷入困境并反复失败,我希望能够限制slack警报,这样我就不会向所有人发送垃圾邮件(例如,如果slack roo

刚接触Rails,正在寻找一种“正确”的方式来做一些看似简单的事情,但我所读到的任何东西听起来都不太正确

我在Heroku上有一个Rails应用程序,我添加了一个对依赖于外部系统的端点的调用。如果该呼叫不成功,则需要进行一些后续操作,因此我将详细信息保存到错误日志中。我已经添加了一封通知电子邮件(对于这类事情,发送到一个空闲的房间)来提示我检查日志,并在发生这种情况时进行跟踪

如果端点陷入困境并反复失败,我希望能够限制slack警报,这样我就不会向所有人发送垃圾邮件(例如,如果slack room自上次发出警报以来已过去30分钟,则仅向其发送电子邮件)

为此,我想我需要:

  • 保存错误的最后一封电子邮件通知的时间戳
  • 每当发生错误时,与该时间戳进行比较,如果30分钟的时间窗口已经过去,则只发送电子邮件给空闲空间。然后用新值更新时间戳
保存这种时间戳值的合适位置是什么?我已经读到全局变量是魔鬼(在这种情况下实际上不起作用),但是其他选项(添加数据库字段,尝试simpleconfig gem)对于我甚至不知道会发生一次的内部事件来说似乎太多/不正确,更不用说频繁发生了


有没有一种轻量级的方法来完成这个任务

一个流行的选择是将其存储在Redis商店中——特别是如果您已经为其他东西设置了一个,比如缓存。因为这本身就是短暂的数据,所以您甚至可以使用
Rails.cache
API来提取细节,并让代码相信它存储在某个地方

失败了,最直接的解决方法可能是创建一个小的单行表并将其存储在那里:它是过度的,但不涉及任何异常,或者在Rails应用程序中间看起来不合适。


不过,作为一个快速而简单的解决方案,全局变量并非不可能:它有很强的局限性,比如它不会在多个服务器进程之间共享,并且它会在进程重新启动时消失。。。但是,如果这些加起来就有风险,比如说,你会在一个错误严重的30分钟内收到4-6个通知——也许这就足够了?(它还将免费为您提供“部署时重置”功能,以便您在认为已修复问题后立即知道问题是否仍在发生。)

谢谢,@matthewd!我喜欢你关于“部署时重置”的观点:)再看看周围,我想知道我是否可以不使用类变量。我在Heroku上只运行了一个web dyno,我相信它在应用程序虚拟机中运行一个进程,所以我认为这意味着我的变量将保持不变,并在多个用户使用应用程序时正确更新/共享。。。