Carpe Diem

備忘録

設計

二重サブミットを防ぐ方法

背景 支払い処理などで問題になりがちな二重サブミット問題(Double Posting Problem)ですが、主に以下のようなケースで発生します。 ボタンのダブルクリック ユーザが間違えて2回ボタンを触ってしまう(ときには遅さにイライラして何度もクリック) リク…

関連と集約と合成集約の違い

概要 UML図における 関連 (Association) 集約 (Aggregation) 合成集約 (Composition) の違いをまとめます。 関係図 まずそれぞれを集合で表現すると以下のようになります。

gRPCでエラー詳細を渡す方法

概要 以前 christina04.hatenablog.com こちらの記事で、アプリケーション内でのレイヤ間のエラーハンドリングについてまとめました。 ではマイクロサービス間でそのエラーコードを伝播していくのはどうすれば良いのか、というのが今回の主題です。 課題 gRP…

Go言語でプラグイン機構【RPC編】

概要 オブジェクト指向についてClean Architectureでは OOとは「ポリモーフィズムを使用することで、システムにあるすべてのソースコードの依存関係を絶対的に制御する能力」である。 これにより、アーキテクトは「プラグインアーキテクチャ」を作成できる。…

Goの実プロジェクトでのエラーハンドリングの悩みどころと解決案

概要 Go言語に限らずではありますが レイヤ間のエラー伝搬 外部APIを叩いた時のエラーコードハンドリング HTTPやgRPCとしてレスポンスを返す時のエラーハンドリング で悩むことは多いと思います。 今回はそれの1つの方針を紹介します。 課題 レイヤ間のエラ…

Clean Architecture で実装するときに知っておきたかったこと

概要 developers.cyberagent.co.jp こちらで 課金システムをマイクロサービス化した サービス自体の設計をDDDにした という対応をしました。 当時は試行錯誤の連続でしたが対応から1年程経ち、ある程度設計もfixされてきたので知見をまとめます。

Goのcontext.Contextはいつ使うべきか

概要 go 1.7からcontextパッケージが標準パッケージになりました。 タイムアウト、キャンセルなどのハンドリングができることから、ブロッキングする処理や外部APIリクエストなどを扱う時は基本的に第一引数に置くべきです。 またAPIやプロセス間通信のリク…

データ毎に実行スケジュールが異なる場合の実装方法を考えてみる

概要 Stripeの定期購読を使っていると、各ユーザの定期購読の更新タイミングでWebhook eventがちゃんと飛んできます。 ほぼリアルタイムで届くのでこのwebhookを使う側としては非常に助かる機能ですが、提供する立場から考えるとどうやるんだろう?と悩んだ…

ECSのオートスケール戦略

概要 ECSはコンテナのスケールアウトとインスタンスのスケールアウトのタイミングが重要です。 よく起きる問題としては インスタンスのスケールアウトが遅くてコンテナのスケールアウトも遅くなってしまう しきい値が不適切でインスタンスがスケールアウトせ…

GoでDependency Injection

概要 「Dependency Injection=依存性の注入」と言われますが、依存したオブジェクトを外部から入れることで何がメリットなのかを感じ取るのは実際に書いてみて分かると思うので、勉強としてまとめてみました。 Dependency Injectionとは デザインパターン …