ブログ
いくつかのCSのTipsを、障害の流れや見積もりの手順として1本につなげて深掘りします。
- 複合インデックスの順番はどう決める?PostgreSQLのEXPLAINで効かない原因を調べる
インデックスを作ったのにSQLが遅いとき、見るべきはWHERE・ORDER BY・実行計画の組み合わせ。等価条件と範囲条件、列の加工、深いOFFSET、外部キーの索引を、注文履歴APIの例で解説します。
- Webhookの二重処理を防ぐには?署名検証・冪等性・再送に強い受信設計
同じWebhookが2回届く、200を返したのに処理が消える、古い通知で状態が戻る。Stripeを例に、生の本文による署名検証、永続的なinbox、DB制約、条件付き更新、外部APIの冪等キーをつないで解説します。
- RAGの精度が上がらない原因は?検索・チャンク・評価を改善する手順
RAGの誤回答を、検索の取りこぼしと回答生成の誤りに分けて調べる。recall@kの計算、チャンク分割、ハイブリッド検索、権限フィルタ、pgvectorの件数不足、変更前後の評価を、社内ヘルプの例で解説します。
- キャッシュスタンピードとは?Redis・TTL・singleflightで防ぐDBへの集中
RedisのTTLが切れるたびにDBが重くなる原因と対策を解説。TTLのジッター、Goのsingleflight、古い値を返す更新方式、分散ロックの違いを、毎秒1万件の商品APIの計算例と実装例で比較します。
- 非機能要件からアーキテクチャを選ぶ:比較表とADRで設計判断を残す
「高可用で拡張しやすい」を、比較できる条件へ変える。受注システムの例で、SLO・障害時の容量・運用体制を整理し、必須条件と選好を分け、検証結果と見直す条件までADRに残します。
- モノリスかマイクロサービスか:変更・データ・運用からサービス境界を決める
サービス数を増やしても、変更の待ち時間が減るとは限りません。注文・在庫・通知の例で、モジュラーモノリスとサービス分割を比較し、トランザクション、契約テスト、運用責任まで一緒に設計します。
- 既存システムを段階移行する:データの正本・切り替え・戻す条件の設計
ストラングラーパターンで画面を切り替えても、データ移行は終わりません。受注システムの刷新を例に、既存挙動の記録、更新責任の移譲、業務単位の突合、書き込み後の復旧、旧系を廃止する条件まで整理します。
- N+1問題とは?SQLログでの見つけ方とJOIN・IN句による解決方法
一覧APIだけが遅いとき、SQL単体の実行時間では見えないN+1問題を疑う。クエリ数の測り方、JOINと一括取得の使い分け、Rails・Djangoの対策、ページングとインデックスまで、投稿一覧の例で解説します。
- 在庫が合わない、予約が重なる、送金が止まる
同時実行の不具合は、1件ずつ動かすテストでは起きない。セール当日のECサイトで5つの不具合を順に起こし、それぞれをどこで守るかを確かめる。
- デプロイのたびに502が出る
「すぐ収まるから」と放っておかれがちなデプロイ中のエラーは、たいてい原因が1つではない。1台のPodが入れ替わる順に、原因を1つずつつぶしていく。
- アカウントを止めたのに、トークンはまだ使える
退職者のアカウントを夕方に止めたのに、翌朝まで顧客データを読めた。トークンが発行されてから使えなくなるまでに通る6つの関門を、順に点検する。
- DBが少し遅くなっただけで、なぜ全体が止まるのか
始まりは、インデックスの外れたクエリ1本だった。そこから決済APIが止まるまでを追うと、タイムアウトや再試行の設定がどの順番で効いてくるかが見えてくる。
- 「CPUはまだ80%」は大丈夫なのか
容量の見積もりに要る式は4つで、どれも掛け算と割り算で済む。ピーク時に毎秒3,000件が届くAPIを例に、台数・余力・接続数を順に決めていく。
- 「保存してから送る」はなぜ壊れるのか
注文を保存して、イベントを送る。たった2行の間でプロセスが落ちるだけで、メールの来ない注文や二重の請求が生まれる。注文の流れに沿って、どこで何を守ればよいかを確かめる。