同時接続からシリアル整数を生成するには、クラウド上にアトミック カウンターを実装する必要があります。背後にあるビジネスは追跡サーバーです。
優先度別の要件:
- (MUST) 耐久性- クライアントが番号を取得したら、他のクライアントが同じ番号を取得しないようにしてください。重複なし...
- (MUST) スケーラブル- 現在の負荷は 10K/秒で、将来的には 200 ~ 1000 の同時クライアント接続で 1M/秒になります。100 ずつインクリメントするスケーラビリティ機能
- (MUST) < +-15ms 平均(postgres/mysql/redis は優れています。DynamoDB のような HTTP レイテンシは問題外です)これは単に遅いソリューションを除外するためのものです
- (あると便利) 増分これは、クライアントがチャンク (たとえば 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 Sentinel /RDS MultiAZを使用した Redis INCR - cache.m3.medium MultiAZ - 120$/m - 耐久性が問題です。
redisにはINCRBYがあり、postgresにはDBへの往復を必要とするシーケンスの「キャッシュ」機能しかありません。
入力はありますか?それらの2つの代替案またはその他に関して?
関連資料:
- アトミックカウンター 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/replaceing-redis-with-elasticsearch-get-query-speed-counters-and-lists/5609/2