babel-preset-es2015は必須なんですかとか言ってる
— t_ (@t_snzk) 2018年2月16日
普段TypeScript使ってるからなんとなくBabel+flowの構成にしてみたらぐったりした。
Amazon Cognitoってやつ使えばユーザー機能一瞬でつくれるんでしょと思って手出したらまたぐったりした。
babel-preset-es2015は必須なんですかとか言ってる
— t_ (@t_snzk) 2018年2月16日
普段TypeScript使ってるからなんとなくBabel+flowの構成にしてみたらぐったりした。
Amazon Cognitoってやつ使えばユーザー機能一瞬でつくれるんでしょと思って手出したらまたぐったりした。
トランザクションとは一般的な不可分な一連の処理という意味で使っているが、例えばS3に画像データをアップロードしMySQLにはそのキーを保存したいみたいな場合の話。
MySQLへの書き込みだけであればそれこそMySQL(ストレージエンジンか)に備わっているトランザクション機能を使えば良い。しかしながらS3のバケットの状態とも整合性を取りたいとなると少しむずかしい。S3へのアップロードは失敗するかもしれないし、失敗したのを検知して復帰処理を書いたとしてもそれが失敗するかもしれない。
簡単のためS3に画像をアップロードしテーブルに1レコード挿入することを考える。実際のアプリケーションでは非同期でやりたいこともあれば同期的に処理で十分な場合もあるが、簡単のため後者を考える。キーはuuid()とする。
このシチュエーションで考えられる作戦は
status
カラムを用意し状態を記録する
0
でinsertしS3の処理が終わったら1
を書き込む0
のままレコードが残ることになるが後処理は比較的簡単どう考えても前者の作戦は嫌な予感がするので後者が王道かなと思っていたが、本質的に採番がしたいだけならばSELECT UUID
で採番しS3へアップロード、成功したらinsertでどうかと同僚から教わった。確かに。(この場合、S3へアップロードが失敗したら欠番になりinsertに失敗したらS3にゴミが残ることになる)
結局はどこまでちゃんとしたいかや要件の問題であり
あたりのトレードオフの話なのかなと言う感じがした。S3は画像をおいておくだけならば安いので、ゴミが残っていても特に問題ない要件ならば放っておけば良いという選択肢は普通にありえる。ゴミが許せないならばやはりステータスカラムを作り定期実行の処理でゴミを処理すれば良い。その代わり見るべきカラムが増えるという感じ。カラム増やさずテープルを増やすというアイデアもありうる。
共通するのは採番がちゃんとできればよいということであり、あとは要件次第という結論となる。
これは猫を飼ったことある人間にしかわからないだろうけど、猫を掲げると元気が出るぞ!