如何维护服务实例之间的API key



我正在创建一个WCF服务,它将利用第三方服务,该服务要求我们在请求中传递几个API密钥。其中一个密钥必须每30天更新一次,另一个密钥必须每24小时更新一次。这将导致发出一个新密钥。由于我将运行此服务的多个负载均衡实例,因此需要某种方法来保持这些实例之间的键更新和同步。我希望在到期前提前续借(至少提前几个小时)。

我已经寻找了这个问题的解决方案,但是除了发现一些没有真正解决问题的行锁讨论之外,我还没有找到很多解决问题的方法。我可能只是没有使用正确的搜索词。

我有一些想法,但它们都有缺点,我想知道是否有更好的方法或模式(或模式组合),我不知道,这将提供一个更好的解决方案。

一个问题是如何以及何时更新密钥。续订过程很简单,因为我将存储密钥最初被检索的日期时间,所以我将知道它何时需要续订。如果需要,我可以让服务尝试在每天的特定时间更新它,但是所有服务实例都将在同一时间尝试这样做。我可以将它们配置为在不同的时间进行尝试,但这样我就必须确保配置总是在不同的时间进行设置。我可以看到,如果他们部署了一个更新,并为所有这些设备提供相同的配置,这在某些时候会成为一个问题。

我考虑过让每个web服务在数据库中注册自己,并让其中一个作为主服务。然后,当更新时间滚动时,只有指定为master的实例会尝试更新,并且它可以在更新密钥后调用其他已注册实例上的方法来同步它们。我认为我需要让每个服务相当频繁地更新其在数据库中的状态。它们还需要检查主服务,以确保它最近也进行了更新,否则就需要另一个实例接管该角色。这看起来可能会变得很混乱,而且我目前不知道服务实例如何知道它所运行的服务器当前是否在轮换中。如果我这样做的话,会有很多情况需要处理,所以如果有更好的方法,我不会急于尝试这样的方法。

所以,这个问题似乎已经解决了很多次,但我只是没有找到正确的答案。我确信我可以把一些东西放在一起完成它,但我想确保我没有把事情复杂化,或者给我们制造任何不必要的维护问题。对此任何建议都将不胜感激!

这听起来像是一个缓存过期问题,您需要将密钥缓存一段有限的时间,然后在缓存中的密钥过期后去刷新这些值。当您获取新密钥时,您需要锁定该值,以便一次只有一个服务将获得新密钥。如何做到这一点取决于您使用的存储和缓存技术。

或者您可以使用消息队列来启动密钥刷新过程,然后每个服务可以在密钥需要刷新时向队列添加消息,当队列被处理时,您可以检查密钥过期时间并仅在需要时刷新。这样做的好处是将获取新密钥的工作卸载到后台进程中,而不是依赖于您的服务来为您完成这项工作,但您需要某种消息传递技术来实现这一点。

最新更新