週1でスープカレー食ってる佐野です。仕事ではトレタのインフラをあれこれしています。今回はメール配信の異変にいち早く気づき、カスタマーサポートのレスポンスを向上する取り組みについてです。 スマートフォンの普及、メッセンジャーの台頭などによって個人間でのメールでのやりとりは減っているかもしれませんが、通知の仕組みとしてまだまだメールは現役です。弊社ではお店への予約確定の通知、お店への予約一覧のPDF送信、お客様への来店日のリマインド...などにメールを活用しています。メールを使っていると、たまにお客様から弊社カスタマーサポートに「メールが届かない」「突然届かなくなった」という問い合わせをいただくことがあります。担当者は原因(トレタの障害?メール配信システムの障害?お客様のメールアドレス間違い?...etc)を即座に調べて回答する必要があります。今日はその仕組みについて。技術的には簡単な話です。
メール配信
トレタではSendGridを使っています。SendGrid自体の障害に備えて、コンフィグの変更/デプロイでAWS SESに切り替えられるようにもしてあります。SendGridには処理したメールの状況を通知できるEvent Notificationという仕組みが備わっていて、各種イベント(Processed(メール送信リクエスト受け付け)、Delivered(受信側メールサーバまで到達)、Deferred(遅延)、Bounces(拒否)、Drops...etc)とその理由を通知できるので、これを利用してメールの状況を取得/可視化します(SendGridのコンソールでも配信状況は見れるのですが直近数日分しか見ることができません)。ちなみに、SESでもSNSに通知が可能なので、SESでも似たような仕組みは簡単に作れるはずです。
仕組み
その図です。
AWS上で稼働するFluentdでEvent Notificationを受け付け、それをBigQueryに投入することでSQLで検索できるようにしてあります。またMackerelでグラフを描いて可視化しています。
https+basic認証でイベントを通知する(Event Notification)
こちらはSendGridのコンソールから簡単にできます。宛先のURLを入力するだけです。
SendGridからのEventの受信
拙著fluent-plugin-sendgrid-eventを利用しています。SendGridから飛んできたHTTP POSTをパースします。すでにプラグインがありそうだったけどなかったので書いてみました。SendGridのEvent NotificationはHTTP 503を返せばしばらく時間をおいてから同じイベントを再送してくれるので、このプラグインでは予期せぬエラーが発生した際は503を返すようにしてあります。
BigQueryへの投入
fluent-plugin-anonymizerとfluent-plugin-bigqueryを利用しています。データにはお客様のメールアドレスが含まれているためそれをfluent-plugin-anonymizerでハッシュしたうえで、BigQueryに転送します。お客様から問い合わせのあったら、そのメールアドレスをsaltとともにハッシュ関数に通してSQLを叩くことで確認できます(管理画面作らんと...)。
※ メアドはハッシュしているので問題はないはずですが、画像では一応マスクもしてあります。
Mackerelでの可視化
fluent-plugin-datacounterとfluent-plugin-mackerelを利用しています。次の画像は、ちょうど先日、SendGridで発生したメール配信遅延障害時の状況です。ある時間帯にdeffered(遅延:紫のグラフ)が大量に発生していることが確認できます。status.sendgrid.comに情報が出るよりも早く、遅延が発生していることに気づくことができました。
簡単ですが以上です。
おわり