原子计数器 - redis vs postgres或其他? [关闭]

Posted

技术标签:

【中文标题】原子计数器 - redis vs postgres或其他? [关闭]【英文标题】:Atomic counter - redis vs postgres or other? [closed] 【发布时间】:2017-03-05 01:40:48 【问题描述】:

我需要在云上实现一个原子计数器,以从并发连接中生成一个串行整数。背后的业务是跟踪服务器。

优先级要求:

    (必须)耐用 - 确保一旦客户获得号码,其他客户将永远不会获得相同的号码。没有重复... (必须)可扩展 - 当前负载为 10K/秒,未来 1M/秒,来自 200-1000 个并发客户端连接。递增 100 的可扩展性功能 (必须)(postgres/mysql/redis 很棒,像 DynamoDB 这样的 http 延迟是不可能的)这只是为了过滤掉缓慢的解决方案 (很高兴)增量 这是一种可伸缩性,客户端增量为一个块(例如 100)并管理应用程序内存中的增量。 (很高兴拥有)5k/s 的票价 ,预计价格将进一步增长。 (很高兴拥有)HA(高可用性) - 我可以处理 0.01% 的故障,但持久性很重要,我需要没有重复的数字。

我的选择是:

    postgres 序列CREATE SEQUENCE serial CACHE 100; SELECT nextval(sequence) - 140$/m MultiAZ AWS RDS db.m3.medium 不如 redis 快,但我认为平均 Redis INCR 与 Redis Sentinel/RDS MultiAZ - cache.m3.medium MultiAZ - 120$/m - 耐用性存在问题。

redis有INCRBY,postgres只有sequence的“缓存”特性,需要往返DB。

任何输入?关于这两个替代方案或其他方案?

相关参考资料:

    Atomic counters Postgres vs MongoDB http://redis.io/topics/persistence https://www.quora.com/When-should-I-use-redis-as-my-primary-data-store https://muut.com/blog/technology/redis-as-primary-datastore-wtf.html https://discuss.elastic.co/t/replacing-redis-with-elasticsearch-get-query-speed-counters-and-lists/5609/2

【问题讨论】:

这需要在数据库中吗?您不能使用大多数编程平台中存在的同步原语来构建自己的“计数器服务”吗? 它需要像数据库一样持久耐用。并有类似延迟的 TCP Socket。因此,没有数据库就很难获得,内存将无法工作,高优先级、HA、零停机时间部署以及在没有数据库的情况下管理文件写入的高并发性也很困难。你实际上构建了许多数据库功能,我宁愿买它:) 也许您应该改用 GUID? 我认为单个 Redis 或 Postgres 实例无法处理 1M/s 的请求。您需要一些分布式方法来生成唯一 ID。看看推特的雪花。这可能会有所帮助。 您没有指定必须存储任何数据。如果您只需要维护计数器,那么您真的不应该在数据库中这样做(计数)。正如戴已经说过的那样,(实际上不是很复杂)服务确实是最好的方法(除了在协议栈中实现它)。不仅数据库了解锁定/事务。他们依靠底层系统来锁定。您的服务也可以使用它。对定价:很好,很高兴拥有。对于 1M/s,您可以轻松添加一个或两个 0。 (但成本压力可能会导致其他概念,例如客户获得 100(0) 的范围)。 【参考方案1】:

我认为您高估了 redis 故障导致其无法刷新到磁盘的风险,而低估了任何 RDBMS 这样做的风险。通过将写入同步到磁盘可以降低这两种风险。

在 redis 中,这意味着切换到 AOF(仅附加文件)模式,如您已链接到的持久性链接中所述。

没有必要做任何到期密钥的诡计。 incrincrby 的原子行为足以确保唯一性和持久性,尤其是与 AOF 持久性结合使用时。

Redis 非常适合这个用例。它足够快且可扩展。 Redis 已经存在了一段时间。对于 PostgreSQL 或 MySQL 来说,没有任何合理的持久性问题。

正如@Solarflare 所指出的,让应用程序一次抓取 ID 块更具成本效益和可扩展性。这可以在 redis 中使用 incrby 来完成。

【讨论】:

Carl,这只是我个人正在寻找的输入,我将接受这个答案,并提及 for_clack 和 Solaflare 的贡献。 redis 似乎是一个不错的候选者,这也是因为它在此场景和其他场景方面的可扩展性特性。 我还要感谢 for_slack 提到了针对 twitter 雪花等唯一 ID 的分布式解决方案,并感谢 Solflare 指出我的 100(0) 范围建议实际上是扩展时分布式解决方案的一种经济有效的替代方案起来。 做了一个小的更新来阐明如何在redis中做范围。

以上是关于原子计数器 - redis vs postgres或其他? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Redis原子计数器incr,防止并发请求

使用RedisAtomicLong和redisTemplate实现redis的计数器INCR原子加

redis计数器,怎么样保证取值正确

jedis连接池详解(Redis)

什么是程序的原子性

Redis通过getset和incr实现复位操作计数器