gpt4 book ai didi

java - 使用并发、线程、静态变量实现 GAE/Java 计数器

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:54:20 25 4
gpt4 key购买 nike

我已经阅读了很多关于计数器的 GAE 文章以及 GAE 中这个讨厌的写限制。我已经看到了分片、cron 任务、内存缓存等解决方案。然后我对 java 线程有了足够的了解,可以提出这个问题:

Q: Can we implement a counter in servlet threads using concurrency / servlet static varibales?

这会有一个额外的好处,即减少对数据存储和内存缓存的写入(成本相同 $)​​,并消除 cron 要求,因为一系列快速计数器命中中的最后一个 servlet 将更新数据存储。

我对并发编程知之甚少,无法提出解决方案,但我想象一些带有静态 servlet 变量的东西,可能是“atomic-integers”和一个 last-update 标志,以启用检查 THIS servlet 是否是最后一个 servlet在最后 200 毫秒内更新静态变量,从而触发对数据存储的保存。

// Servlet gets a hit
// static var counter++
// Checks last datastore save time of the static var, if longer than 200ms
// save to datastore & save "last update time"
// If shorter than 200 ms ago, let the next servlet call update the datastore

这能做到吗?有什么建议吗?非常感谢您的想法。

最佳答案

只是详细说明我的评论:

您可能已经知道,只要您的应用程序达到一些流量阈值,App Engine 就会启动一个新的应用程序实例。鉴于新实例可以在完全不同的服务器上运行,您的静态计数器将变得无效。

现在澄清一下,在 App Engine 中实现计数器的正确方法是使用 Sharding并将其拆分到多个实体。

现在假设您希望尽量减少对数据存储的调用,您可以改为使用内存缓存来存储计数器数据,并以指定的频率(比如通过 cron)将其写入数据存储。您的内存缓存数据将在应用的所有实例中保持一致。

如果内存缓存出现故障,您当然会冒着丢失内存缓存计数器的风险,但这就是将其写入数据存储区的原因。同样,这不是 100% 万无一失的解决方案,分片是;但这是最大限度地减少数据存储调用的一种方法。

关于java - 使用并发、线程、静态变量实现 GAE/Java 计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9536176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com