/note/tech

メールのトランザクション設計

A.DBトランザクション後にメールを送る

同一トランザクションはあきらめ、データベースを先にコミットし、その後でメールを送る、という設計です。

メール送信でエラーになったら、データベースには書き込めているので、メールだけ再送するように仕組みを作ったりします。

B. 送信リクエストテーブルに書き出し、別プロセスで送る

一度メール送信要求をテーブルに書きだして、そこで同一トランザクションとし、別プロセスがその送信要求を取り出して、実際にメール送信するという設計です。

C. [現実解] A + ローカルキューに送る

さてここでSMTPのプロトコルについて考えてみます。もともとサーバをリレーして目的の宛先まで届く仕組みです。直接外部送信用のSMTPサーバに送ろうとするから、失敗の可能性が高まるわけです。ローカルに送ってスプーリングすればエラーの確率は、ほぼ考慮しなくても良くなります(プロセスの起動忘れか、ディスクフルのケースくらい、のレベルの違うトラブルだという点において)。さらに流量制御も比較的容易にできるようになります。

同じことがやはりキューイングの仕組みをもつアーキテクチャ全般に言えます。MQを使ってデータ送るときも、ローカルキューを作ってそこからリレーさせるのが定石のようです。

MEMO: