検証用にfluent-plugin-dynamodb-altを作った

検証用にfluent-plugin-dynamodb-altというのを作りました。

検証用なので、RubyGems.orgには未登録。積極的にメンテナンスする気はないです。諸事情により割と積極的にメンテしてます

fluent-plugin-dynamodbの微妙な点

fluent-plugin-dynamodb-altの特徴

  • PutItemを使う
  • Expectedを使える
  • 並列実行できる
  • リクエストを投げるときにPKで集約して最新のタイムスタンプのレコードだけ投げる

Expectedの使い方

以下のように設定すると、

expected id NULL,time LT ${time}
conditional_operator OR

次のようなExpectedになります。

{
  :expected=>{
    "id"=>{:comparison_operator=>"NULL"},
    "time"=>{:comparison_operator=>"LT", :attribute_value_list=>["2014-08-17T16:57:45Z"]}
  },
  :conditional_operator=>"OR"
}

${time}のattribute_value_listは{}内のキーでレコードから取得します。

misc

  • aws-sdk 1.0系だとExpectedでcomparison_operatorが使えないようにみえます(ソースは追ってないです)
  • aws-sdk 2.0系でput_itemのリクエストの記述が間違ってます。item: {"key" => {s: "value"}}ではなくitem: {"key" => "value"}と書く必要があります
  • BatchWriteItemでExpectedを使えないのは厳しいですねぇ

もやもや

DynamoDBはなんだかんだで結構高いですよね。特にWriteが。 10,000w/sで$6,000/月ぐらいになるので普通のKVS感覚で使うと破産しそう。

BatchWriteItemつかってもお値段は下がりそうにないので、非同期でキーを集約して極力Writeを減らす・オートスケールをがんばる・低いスループットでリトライしまくる、みたいな小細工が必要そうですがみなさんどうしているんだろう…

宣伝

ddbcli、便利ですよ〜