10 Tips for Building Resilient Payment Systems
1. Lower Your Timeouts
デフォルトがあるだけましで、Goのhttp.ClientやNode.jsのhttp.requestにはデフォルトがない select @@MAX_EXECUTION_TIME;
show statement_timeout;
最適なタイムアウト時間はモニタリングによって決定すべきだが、5秒から始めるのは妥当 2. Install Circuit Breakers
成功しないリクエストがタイムアウトするのを待つ必要はない
3. Understand Capacity
リクエストの流量に適切な制限をかける必要がある
4. Add Monitoring and Alerting
1つの作業単位を処理するのにかかる時間
新しい仕事がシステムに入ってくる速度で、通常1分あたりのリクエスト数で表される
システムの総容量に対して、システムがどの程度の負荷を受けているか
システムのどのレイヤーにおいても、使用されるメモリと利用可能なメモリの量、またはスレッドプールのアクティブなスレッドと利用可能なスレッド総数の量に相当する
5. Implement Structured Logging
分散システムではcorrelation identifier (識別子)を使うと便利 複数のコンポーネントのログにIDが出るので関連するログを簡単に見つけられる
6. Use Idempotency Keys
決済処理中に信頼性の低いネットワークによる問題が発生する確率は100万分の1だが、Shopifyの規模ではこれは1日に何度も起きるレベル ShopifyではULIDを用いており、高スループットのシステムではUUIDv4からULIDにIdempotency Keyを変更することで、INSERT文の時間が50%短縮されたことが確認された 7. Be Consistent With Reconciliation
不一致があれば自動的に修正し、不可能な場合は調査して開発者が修正する
8. Incorporate Load testing
100%の飽和状態を達成できず、70~80%あたりでキューに溜まるサイズが大きくなり、キューでの待ち時間がクライアントのタイムアウトに至ると実質的にサービスはダウンしてることになる 9. Get on Top of Incident Management
障害は回避できないので備えておく
Slack botへのコマンドでインシデントプロセスを開始し、プロセスを機械的に説明・記録する 10. Organize Incident Retrospectives