我正在创建一个WCF服务,它将使用一个第三方服务,该服务需要我们通过一个请求传递几个API密钥。其中一个密钥必须每30天更新一次,另一个密钥必须每24小时更新一次。这会导致发布一个新的密钥。由于我将运行此服务的多个负载平衡实例,因此我需要一些方法来保持密钥在这些实例之间的更新和同步。我更喜欢在到期之前(至少在到期前几个小时)续费。
我一直在寻找这个问题的解决方案,但除了找到一些行锁定讨论并没有真正解决问题之外,我还没有找到太多解决问题的方法。我可能只是没有使用正确的搜索词。
我有几个想法,但它们都有缺点,我想知道是否有更好的方法,甚至是我不知道的模式(或模式的组合),可以提供更好的解决方案。
其中一个问题是如何以及何时更新密钥。更新过程很简单,因为我将存储最初检索密钥的日期时间,所以我将知道何时需要更新它。如果需要,我可以让服务尝试在每天的某个时间续订它,但随后所有服务实例都会同时尝试这样做。我可以配置它们在不同的时间尝试,但是我必须确保配置总是在不同的时间设置。我可以看到,如果他们部署一个更新,并为所有人提供相同的配置,那么在某个时候,这将成为一个问题。
我已经考虑过让每个web服务在数据库中注册自己,并让其中一个作为主服务。然后,当更新时间到来时,只有被指定为主实例的实例才会尝试续订,并且它可以在密钥更新后调用其他已注册实例上的方法来同步它们。我认为我需要让每个服务相当频繁地更新其在数据库中的状态。他们还需要检查主服务,以确保它最近也进行了更新,否则另一个实例将需要接管该角色。这看起来可能会变得混乱,我目前不知道服务实例如何知道它正在运行的服务器当前是否在轮换中。如果我这样做,会有很多场景需要覆盖,所以如果有更好的方法,我不会急于尝试这样的事情。
所以,这个问题似乎已经解决了无数次,但我就是找不到正确的答案。我确信我可以把一些东西组合在一起来完成它,但我想确保我没有让事情变得比应该的更困难,或者给我们带来任何不必要的维护问题。任何关于这方面的建议都将不胜感激!
发布于 2014-07-14 23:59:47
这听起来像是缓存过期的问题,你需要在有限的时间内缓存你的键,然后一旦缓存中的键过期,就去刷新值。当您获得新的密钥时,您需要锁定值,以便一次只有一个服务获得新的密钥。如何做到这一点将取决于您将哪种技术用于存储和缓存。
或者,您可以使用消息队列来启动密钥刷新过程,然后每个服务可以在密钥需要刷新时向队列添加一条消息,当队列被处理时,您可以检查密钥过期时间,并仅在需要时进行刷新。这样做的好处是将获取新密钥的工作卸载到后台进程,而不是依赖您的服务来为您完成此工作,但您需要某种消息传递技术来实现这一点。
https://stackoverflow.com/questions/24740325
复制相似问题