如何跨多个服务器实例保留 "counter" 变量?
How to preserve "counter" variable across multiple server instances?
我们正在为要连接的移动应用程序设置后端架构,但我们需要一些帮助。我们的应用程序旨在模仿您在熟食店或药店看到的 "take a number" 门票。用户将使用我们的移动应用程序向我们的节点控制器发送请求,我们的节点控制器将响应一个现场号码。
我们目前在 Amazon Elastic Beanstalk 上设置了节点控制器,并启用了负载平衡来处理任何请求激增。我们的问题是:我们如何在节点控制器的多个实例中持久化我们的 spotNumber
?我们现在将它构建为一个从 1 开始并随每个请求递增的局部变量,但是如果 AWS 启动我们的节点控制器的新实例来处理增加的流量,这种情况会持续存在吗?如果不是,那么在我们服务器的所有潜在实例中保留我们的 spotNumber
的最佳做法是什么?
提前致谢!
使用数据库。
很明显,您不能将值存储在节点应用程序中,这不仅是因为缩放,而且是为了防止应用程序意外关闭时数据丢失。
听起来您还没有数据库,因此 DynamoDB 可能是一个不错的选择,只要您的唯一用例是在应用程序之间共享一个计数器。你可以找到一个例子 here.
您也可以使用 Redis on Elasticache,但我认为这对于单个计数器来说太过分了。
在不同的比例下保持准确的计数器可能需要不同的实现。在小范围内,应用程序中的简单会话变量和锁定逻辑就足够了。但是,在更大范围内,会话同步和锁定可以通过数据库更好地管理。特别是对于您的情况,DynamoDB conditional writes or Redis counters seems useful. However, keep your requirements simple and clear, managing counters at scale may require algorithms and data structures with funny names, like the HyperLogLog。
我们正在为要连接的移动应用程序设置后端架构,但我们需要一些帮助。我们的应用程序旨在模仿您在熟食店或药店看到的 "take a number" 门票。用户将使用我们的移动应用程序向我们的节点控制器发送请求,我们的节点控制器将响应一个现场号码。
我们目前在 Amazon Elastic Beanstalk 上设置了节点控制器,并启用了负载平衡来处理任何请求激增。我们的问题是:我们如何在节点控制器的多个实例中持久化我们的 spotNumber
?我们现在将它构建为一个从 1 开始并随每个请求递增的局部变量,但是如果 AWS 启动我们的节点控制器的新实例来处理增加的流量,这种情况会持续存在吗?如果不是,那么在我们服务器的所有潜在实例中保留我们的 spotNumber
的最佳做法是什么?
提前致谢!
使用数据库。
很明显,您不能将值存储在节点应用程序中,这不仅是因为缩放,而且是为了防止应用程序意外关闭时数据丢失。
听起来您还没有数据库,因此 DynamoDB 可能是一个不错的选择,只要您的唯一用例是在应用程序之间共享一个计数器。你可以找到一个例子 here.
您也可以使用 Redis on Elasticache,但我认为这对于单个计数器来说太过分了。
在不同的比例下保持准确的计数器可能需要不同的实现。在小范围内,应用程序中的简单会话变量和锁定逻辑就足够了。但是,在更大范围内,会话同步和锁定可以通过数据库更好地管理。特别是对于您的情况,DynamoDB conditional writes or Redis counters seems useful. However, keep your requirements simple and clear, managing counters at scale may require algorithms and data structures with funny names, like the HyperLogLog。