我需要在云上实现一个原子计数器,以从并发连接中生成一个串行整数。背后的业务是跟踪服务器。
优先级要求:
- (必须)耐用- 确保一旦客户获得号码,其他客户将永远不会获得相同的号码。没有重复...
- (必须)可扩展- 当前负载为 10K/秒,未来 1M/秒,来自 200-1000 个并发客户端连接。以 100 递增的可扩展性功能
- (必须)< +-15ms 平均(postgres/mysql/redis 很棒,像 DynamoDB 这样的 http 延迟是不可能的)这只是为了过滤掉缓慢的解决方案
- (很高兴) increment by这是一种可伸缩性,客户端以一个块(例如 100)递增并管理应用程序内存中的增量。
- (很高兴拥有)5k/s 的票价 < 150 美元,并且预计价格将进一步增长。
- (很高兴拥有)HA(高可用性) ——我可以处理 0.01% 的故障,但持久性很重要,我不需要重复的数字。
我的替代方案是:
- postgres 序列
CREATE SEQUENCE serial CACHE 100; SELECT nextval(sequence)
- 140 美元/m MultiAZ AWS RDS db.m3.medium 不如 redis 快,但我认为平均 < 7 毫秒。“缓存”是一个强大的功能,应该可以提高性能。 - Redis INCR 与Redis Sentinel /RDS MultiAZ - cache.m3.medium MultiAZ - 120$/m - 耐用性有问题。
redis 具有 INCRBY,而 postgres 仅具有需要往返数据库的序列的“缓存”功能。
有输入吗?关于这两种选择或其他选择?
相关参考:
- 原子计数器 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