しがないエンジニア頑張る

弱々だけどこの界隈でなんとか食らいついていきたい人

offsetを提供しているAPIの裏側がDynamoDBだった時の絶望感

DynamoDBって言ってますが、DynamoDBに限った話ではないです。
よくAPIの設計でページングのためにlimit/offsetを提供することがあると思いますが、これを読んだ方に伝えたい。
その設計は次からやめましょう止めましょう。

is 何故

ページングのためにlimit/offsetをとるAPIはよく見ます。
一般的なRDBでは、OFFSET関数が提供されており、それを利用すれば簡単に実装できますしそれに依存したIFと言ってもいいでしょう。
でも、DynamoDBのようなキーバリューストアのみ場合は実現が困難なため避けましょう。

解決策

RDBを使う。

一番幸せになれます。
しかし、謎の力でDynamoDBから逃れられない時があると思います。
じゃあどうするかというと、、

別案

ロジックで頑張る

Lambdaなどと組み合わせてロジックで解決する。
多分これで解決することになると思います。私もそうでした。
もちろんQueryの利用を前提に、メモリ効率とかを考える必要はありますが。。

Athenaを使う

AthenaもOFFSET関数を提供しているんです。 要件によってはDynamoDBからS3にデータを置いてクエリをかけることで実現できます。
また、コネクタも提供されているのでこちらで直接クエリもかけられるんじゃないかなと思っています。(未検証) Amazon Athena DynamoDB コネクタ - Amazon Athena

IFを変える

limit/offsetの提供をやめちゃいましょう。
具体的には、トークンとページサイズを構えるIFにします。 そうすることで、OFFSET関数に依存したIFを隠蔽することができ、DynamoDBでも所謂カーソル処理的な感じで実現可能です。
ただし、以下のようなトレードオフもありますので注意しましょう。

  • 双方向ページングができない
  • 任意のページの要求に答えられない

この辺りの話は、この本が参考になります。 APIデザイン・パターン | マイナビブックス