如何在服务实例之间维护API密钥?

时间:2014-07-14 15:38:10

标签: c# web-services wcf load-balancing api-key

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

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

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

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

我考虑过让每个Web服务在数据库中注册,并让其中一个服务作为主服务。然后,当更新时间到来时,只有指定为master的那个会尝试更新,并且它可以调用其他已注册实例上的方法,以便在更新密钥后同步它们。我想我需要让每个服务都经常在数据库中更新其状态。他们还需要检查主服务以确保它最近也已更新,否则另一个实例需要接管该角色。这似乎可能会变得混乱,我现在不知道服务实例如何知道它正在运行的服务器当前是否处于轮换状态。如果我这样做,会有很多场景需要报道,所以如果有更好的方法,我并不急于尝试这样的事情。

所以,这看起来好像很多次都已经解决了,但我却找不到合适的答案。我确信我可以将一些东西组合在一起以完成它,但我想确保我不会让事情变得更加困难,或者为我们造成任何不必要的维护问题。对此有任何建议将不胜感激!

1 个答案:

答案 0 :(得分:0)

这听起来像是缓存过期问题,您需要在有限的时间内缓存密钥,然后在缓存中的密钥到期后再刷新值。当您获得新密钥时,您需要锁定该值,以便一次只有一个服务可以获得新密钥。如何执行此操作取决于您用于存储和缓存的技术类型。

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