【问题标题】:How to maintain API Keys between service instances?如何维护服务实例之间的 API Keys?
【发布时间】:2014-07-14 15:38:09
【问题描述】:

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

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

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

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

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

所以,这似乎已经解决了很多次,但我只是没有找到正确的答案。我确信我可以把一些东西放在一起来完成它,但我想确保我不会让事情变得比他们应该做的更困难,或者给我们制造任何不必要的维护问题。对此的任何建议将不胜感激!

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我们计划实施 Windows Server AppFabric,但还没有。我们确实有适用于 Windows Server 的服务总线,因此可以满足消息队列选项的要求。数据库是 SQL Server 2008。我希望避免创建额外的服务来处理密钥更新,但现在没有分布式缓存选项,我不确定是否可以避免。我可能需要对 SQL Server 中的锁定提示进行一些实验,因为我还没有找到一个好的解决方案,并且已经看到了各种不同的方法,但大多数都被报告为不成功。
    • 我认为缓存解决方案的另一个问题是,虽然在许多情况下,如果服务的两个实例同时检查缓存并发现 API 密钥会很好不存在(已被缓存过期),然后两者都去数据库并更新了缓存,在我的情况下这不是一件好事。通过向 3rd 方服务发出新密钥请求,他们将更改密钥,其中一个最终可能会使用无效密钥调用该 3rd 方服务。
    猜你喜欢
    • 2019-05-18
    • 1970-01-01
    • 2011-04-12
    • 2016-01-31
    • 2012-05-22
    • 2023-03-22
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多