无需分片的高并发计数器

2023-11-27

这个问题涉及计数器的两种实现,它们旨在在不进行分片的情况下进行扩展(在某些情况下它们可能会低估计数):

  1. http://appengine-cookbook.appspot.com/recipe/high-concurrency-counters-without-sharding/(代码在评论里)
  2. http://blog.notdot.net/2010/04/High-concurrency-counters-without-sharding

我的问题:

  • 关于#1:跑步memcache.decr()在延迟的事务性任务中似乎有点矫枉过正。如果memcache.decr()是在交易之外完成的,我认为最糟糕的情况是交易失败,并且我们错过了计算我们减少的任何内容。我是否忽略了这样做可能会出现的其他问题?
  • 两种实现之间的重要权衡是什么?

以下是我看到的权衡:

  • 2 不需要数据存储事务。

  • 为了获取计数器的值,#2 需要获取数据存储,而 #1通常只需要执行memcache.get() and memcache.add().
  • 当增加计数器时,两者都会调用memcache.incr()。 #2 定期将任务添加到任务队列,而 #1 以事务方式执行数据存储获取和放入。 #1也总是表现memcache.add()(测试是否需要将计数器持久保存到数据存储中)。

结论

(没有实际运行任何性能测试):

  • 1 通常应该更快地检索计数器(#1 内存缓存 vs #2 数据存储)。虽然 #1 必须执行额外的操作memcache.add() too.

  • 然而,#2 在更新计数器时应该更快(#1 数据存储 get+put 与 #2 排队任务)。
  • 另一方面,对于 #1,您必须更加小心更新间隔,因为任务队列配额几乎比数据存储或 memcached API 小 100 倍。

访问数据存储可能比访问内存缓存更昂贵。否则,memcache 一开始就不会那么有用:-)

我推荐第一个选项。

如果你有一个合理的请求率,你实际上可以更简单地实现它:

1) update the value in memcache
2) if the returned updated value is evenly divisible by N
2.1) add N to the datastore counter
2.2) decrement memcache by N

这假设您可以在内存缓存上设置足够长的超时以在连续事件之间生存,但如果事件如此稀疏以至于您的内存缓存超时,那么您很可能不需要“高并发”计数器:-)

对于较大的站点,依靠单个内存缓存来执行诸如计算总页面点击次数之类的操作可能会给您带来麻烦;在这种情况下,您确实想要对内存缓存进行分片,并更新随机计数器实例;计数器的聚合将通过数据库更新进行。

不过,在使用 memcache 时,请注意某些客户端 API 会假设一秒超时意味着该值不存在。如果发送到 memcache 实例的 TCP SYN 数据包被丢弃,这意味着您的请求将错误地认为数据不存在。 (对于 memcache 的 UDP 可能会发生类似的问题)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无需分片的高并发计数器 的相关文章

随机推荐

  • 函数内的“static”关键字?

    我正在查看 Drupal 7 的源代码 发现了一些我以前没有见过的东西 我在 php 手册中做了一些初步的查找 但它没有解释这些示例 关键字是什么static对函数内的变量做什么 function module load all boots
  • Vb.net随机数生成器多次生成相同的数字

    我有这个程序从文件中生成名字和姓氏 当我运行该程序时 我在三个文本框中输入信息 前两个是工资低和高 salary1 text salary2 text 最后一个是我想要的 份数 copies text 当我在文本中输入诸如10之类的数字时它
  • 属性-maven-插件:加载属性文件时出错

    我想将 pom xml 中的所有属性提取到属性文件中 这些是常见的属性 如依赖版本 插件版本和目录 我正在使用properties maven plugin 但它没有按照我想要的方式工作 我的 pom xml 的重要部分
  • match 如何在其怀抱中使用 `continue` 进行编译?

    我正在阅读 Rust 编程语言 一书 我偶然发现了一个简单的表达式 let guess u32 match guess trim parse Ok num gt num Err gt continue 如何match手臂上有不同的表情 例如
  • 如何在 Xcode 中查找 print() 或 NSLog() 控制台输出的来源

    我不确定这是否可能 下面是一个示例情况 有些东西正在打印到我的控制台 但我不知道它来自代码中的哪里 我使用 Xcode 中的 Finder 对 NSLog 和 print 等术语进行了快速搜索 没有出现任何相关的内容 Xcode 有什么快速
  • 如何为谷歌MapView制作具有视差滚动效果的自定义CoordinatorLayout.Behavior?

    我尝试为谷歌制作视差滚动效果MapView and RecycleView using CoordinatorLayour 因此 根据在网上找到的一些教程 我编写了以下代码 布局
  • 如何在 github 主页中删除“您贡献的存储库”

    我已向存储库提交了一个新问题 之后 我的 github 主页中始终会出现一个通知选项卡 我只是不想删除这个烦人的存储库 但我无法弄清楚 你有没有尝试过https docs github com en github setting up an
  • 如何猴子修补`__call__`方法?

    我似乎无法猴子修补 call 类实例的方法 是的 我只想修补单个实例 而不是全部 以下代码 class A object def test self return TEST def call self return EXAMPLE a A
  • dataAdapter .Fill 和 .Update 的比较

    我已经阅读了 MSDN 资源和几个论坛 但仍然不明白这两者之间有什么区别dataAdapter Fill and dataAdapter Update 我尝试使用它们从我的程序中更新数据库并且它有效 但是当我尝试删除update 功能 它仍
  • Zend 和 .htaccess

    我的默认 zend 应用程序具有此默认结构 zend webroot application config library public htaccess index php 默认 htaccess 通过 public index php
  • Android上不确定水平进度条的样式

    确定进度条的样式很容易 有很多教程可以实现这一点 这是我正在使用的
  • 通过 Google App Engine 的 Google Drive API

    我正在尝试通过以下方式使用 Google Drive API应用程序身份Google App Engine 提供的界面 这基本上允许我的网络应用程序与 Google 的 API 进行通信从服务器到服务器 我不需要我的用户登录 我只需要显示我
  • MapReduce 的随机播放和排序

    我通读了权威指南和网络上的其他一些链接 包括here 我的问题是 洗牌和排序到底发生在哪里 根据我的理解 它们发生在映射器和减速器上 但一些链接提到改组发生在映射器上 排序发生在减速器上 有人可以确认我的理解是否正确吗 如果没有 他们可以提
  • Android 应用程序中的 ExceptionInInitializerError?

    在我的 Android 应用程序中 WebView 活动类具有以下行 webView addJavascriptInterface new JSInterface this Android 在 JSInterface 类中 我正在初始化 G
  • 视图以模态视图动画显示,而不是显示(推送)动画

    我最近将我的应用程序从 iOS 8 3 更新到了 iOS 9 在修复了代码的各种错误后 当我注意到以下问题时 我设法编译应用程序并运行它 当我执行segue单击时 例如 UIButton 加载了segue的视图会出现模态视图的动画 从底部滑
  • C 语言中的 deflate 和 inflate (zlib.h)

    我正在尝试实现 zlib h deflate 和 inflate 函数来压缩和解压缩 char 数组 而不是文件 我想知道以下语法是否正确 我是否遗漏了某些内容或错误地定义了某些内容 char a 50 Hello World char b
  • NPM版本中如何表示内部版本号?

    我想在 package json 中将内部版本号附加到我的项目 我正在寻找最好的方法来做到这一点 我发现如果前面有 node semver 会将字符串识别为内部版本号 例如 这将是构建 123 1 0 0 123 但是 NPM 版本模块也接
  • 通过属性值选择元素的 XPath

    我有以下 XML
  • 将 MuPDF 集成为库项目 (Android)

    所以我基于pdf阅读器 MuPDF 构建了这个项目 我为此使用了 ndk build 该项目的名称是 ChoosePDFActivity 我知道它已正确构建 因为我可以在我的内部看到一个 so 文件libs armrabi v7a THIS
  • 无需分片的高并发计数器

    这个问题涉及计数器的两种实现 它们旨在在不进行分片的情况下进行扩展 在某些情况下它们可能会低估计数 http appengine cookbook appspot com recipe high concurrency counters w