[PR]Erlangも活用 月13億通、1時間で300万通のメール配信を実現する技術とは

(※この記事はユミルリンク株式会社提供によるPR記事です。)

ユミルリンクは、3種のメール配信関連システムを運用し、サービスとして提供中である。サービスの名称はそれぞれ「Cuenote FC」「Cuenote MR」「Cuenote SR-S」。これらのシステムには、同社が2002年にメール配信サービスを始めて以来、蓄積してきたノウハウが投入されている。

まず3種類のシステムの位置づけを簡単に説明しておこう。(1)Cuenote FCは独自開発のMTA(メール転送エージェント)と並列サーバーにより300万件/時の性能を備え、大量のメール配信を短時間に処理する。(2)Cuenote MRは、マーケティング向けの統計機能(コンバージョン測定機能)を備え、Cuenote FCの経験を踏まえてエンジンを新たに設計したメール配信システムである。(3)Cuenote SR-Sは、メールの遅延・未達を防ぐために用いるリレーサーバーで、実装にプログラミング言語Erlangを用いた点が特徴である。

これらのCuenoteシリーズは、サッポロビールや、TSUTAYAを展開するカルチュア・コンビニエンス・クラブ、ソースネクスト、フィナンテック、Edyを運営するビットワレット、朝日新聞社/テレビ朝日/KDDIによる「EZニュース」など、多くの顧客企業がメール配信に利用している。全顧客を合わせたメールの配信量は月に13億件である。

以下では、各製品の特徴と、技術的なトピックを紹介する。

Cuenote FC:並列性を追求して大量配信、MTAがメール本文を加工する

Cuenote FCは、大量のメールを一斉配信する目的に適するメール配信システムである。このシステムには、同社による10年近いメール配信システム運用のノウハウが注ぎ込まれている。

同社は、2002年にメール配信サービスを開始している。この時点ではMTA(メール転送エージェント)としてqmailを用いていた。qmailを利用した場合の性能は、ハードウエアのスペックや、送信先などの条件によるが、5万件/時~50万件/時の範囲だった。現在のCuenote FCは、独自開発したMTAにより、300万件/時と、当時の6~60倍の性能を実現した。主な性能向上策は、I/Oの多重化による並列・並行処理の追求である。1プロセスあたり最大4000並列セッションを実現し、さらに複数のプロセス、複数のサーバーに処理を分散させている。

ユミルリンクの蓮沼正好氏

Cuenote FCの独自開発MTAは、メール1件ごとに一部のテキストを変更する「差し込み」の機能を備えている。メール1件ごとに異なる顧客名やメールアドレスなどの差し込みに利用できる。加えて、ユーザーの属性ごとに異なる内容のPR文面を選び表示する使い方も可能だ。MTAが文書生成の一部の役割を引き受けることで、メール送出時の本文テキストを共通にすることができ、MTAに対して転送するデータ量を削減できる。携帯電話向けメールの絵文字も利用可能である。

Cuenote FCの販売形態は、顧客企業に導入する形のライセンス販売と、ASP(Application Service Provider)として月額課金により提供する形態の2種類。これらのシステムの運用に基づく経験は、同社にとってノウハウの蓄積に結び付いているという。「毎月13億通以上のメールを配信していると、PC向けのメール配信ではISPごとの特性、携帯電話向けメール配信ではキャリアごとの特性がわかってくる。これらは配信サーバーのパラメータの制御に反映させています」(ユミルリンク 開発本部 開発グループマネージャー 蓮沼正好氏)。Cuenoteファミリのほかのシステムにも、このノウハウは反映されている。


Cuenote MR:ユーザーニーズに対応してMTAを新規設計

Cuenote MRは、Cuenote FCの後継として「まったく新しい視点から」(蓮沼氏)再設計したメール配信システムである。今までのCuenote FCの経験から、随所に新たな設計を取り入れている。MTAエンジンは新たに実装した。「アドレス帳」機能も新たに設計した。大量メール配信のさいの「差し込み」部分の扱いに柔軟性を持たせた。また、コンバージョン(ユーザーがメールのURLから特定のページに到達したかどうかの指標)測定の機能も備える。

Cuenote MRで見直しを加えた機能には、まず「アドレス帳」がある。メール配信先となる顧客データベースの扱いが、Cuenote FCに比べより柔軟になった。データベースを作成したあとでも、カラム(属性項目)を追加できるようにした。また「同じメールアドレスを重複して登録できる」設計にした。Cuenote FCでは、メールアドレスがデータベースのキーとなるため、同じメールアドレスで複数のユーザーが登録することはできない。ただ、実際のメール配信では、例えば家族で同じメールアドレスを使い回すような場合がある。このような場合にも対応できるようにした。

Cuenote FCの特徴の一つはMTAが「文書作成機能」を備えることだったが、この実装も見直した。Cuenote FCでは「差し込み」の全内容をメモリー上に保持する設計だった。差し込み内容、例えばデータベースから取得した「顧客の注文情報」などの情報のサイズが大きくなると、メモリー上に保持することが難しくなる。そこでCuenote MRでは、直近で必要になるメールへの差し込みデータを、通信スレッドとは別のスレッドでメモリー上に読み込むようにした。これにより「差し込み」のためのデータ量が増大しても、少ないメモリーで高速な配信処理が可能となった。

ユミルリンクの高橋淳一氏

MySQL(データベース管理システム)の利用方法も見直した。Cuenote FCの場合は、データベース管理システムと密に結び付いた設計だった。データベースからデータを読み出し、ログを書き込みながらメール配信処理を実行する。このため、データベース管理システムが障害を起こすとサービスが止まってしまう。そこで「Cuenote MRでは、送信処理はDB(データベース)に依存しない設計にしました」(カスタマーサービス本部 カスタマーサービスグループ 技術サポートチーム 高橋淳一氏)。Cuenote MRでは、情報をいったんファイルに格納する形とし、データベース管理システムの挙動がサービスに影響を与えないようにした。

このように、Cuenote MRは、Cuenote FCの機能を引き継ぎながら再設計、再実装を施したシステムである。現時点では、同社はCuenote FCとCuenote MRの両方を並行して提供している。

先行するCuenote FCでは複数サーバーによる分散処理を実現しているのに対して、後から開発したCuenote MRが対応するのは1台のサーバーまでである。また、Cuenote MRではアドレス帳データベースの構造を柔軟になった一方、データベースへのインポート処理性能はCuenote FCにくらべて劣る。アドレスリストを都度登録して配信する目的では、Cuenote FCの方が性能上のメリットがある。

使い分けのおおまかな目安として、1台のサーバーで500万通以上の大量のメール配信を行いたい場合はCuenote MRが適しており、分散サーバー構成で300万通/時の処理性能を求める場合にはCuenote FCが適しているという。


Cuenote SR-S:セッション制御でメールの遅延・未達を防ぐ

Cuenote SR-Sは、メール配信システムで未達や遅延などトラブルが発生している場合に、それらを改善するリレーサーバーである。

リレーサーバーが有効になるのは、例えば次のような場合だ。携帯電話向けメールを送る場合、1個のIPアドレスからあまり多数のセッションが張られているとキャリアによる制限が加わり配信が中断されてしまう。これはメールの未達、遅延の原因となる。

このような事態を防ぐためには、1個のIPアドレスから5~10といった比較的少数のセッションを張る形でメール送信処理を実施し、メール送信が止まらないようにする。リレーサーバーでは「セッション制御が命」(開発本部 プロダクト開発グループ スペシャリスト 佐野拓氏)となる。

SR-Sの機能は、ほかにもある。Cuenote FC/Cuenote MRにあった「文書生成機能」を備えており、SR-S側でテキストの一部や、携帯電話向けメールの「デコメ絵文字」などを差し込むことができる。携帯電話キャリアごとに異なる絵文字を変換する処理をSR-Sに担当させることも可能だ。


実装ではErlangを採用、「結構いける」と採用を決断

SR-Sは、その実装方法に大きな特徴がある。並列・並行処理の記述を考慮したプログラミング言語Erlangを採用したのだ。

ユミルリンクの佐野拓氏

なぜ同社はErlangに注目したのだろうか。きっかけは「(Ruby言語作者の)まつもとゆきひろさんによる『Rubyistのための多言語探訪』でErlangが紹介されているのを読んだこと」と佐野氏は言う。当初、佐野氏は個人として、自分の時間でErlangを試した。「最初は趣味として触っていました。そこで『結構いけるんじゃないか』という感触を持ちました。通信コードを作ってベンチマークを取ったところ、性能がちゃんと出た。そこで製品開発に使えるんじゃないかと提案しました」(佐野氏)。

今までのCuenote FCとCuenote MRでは、MTAエンジンなど中核部分はC言語、Webインタフェースの部分はPerlで開発していた。高速な送信処理を実現するには、複数のプロセスや、複数のスレッドを使う方法では限界があった。多数の並列処理を実現するために適した手法として、C言語でI/Oを多重化する処理を記述していた。並行処理の制御のためのコードは書くのも読むのも大変だ。挙動を理解するには状態遷移を常に意識しなければならない。

Cuenote MRのMTAではI/O多重化による複雑さを軽減するために、DNSとSMTPの通信をそれぞれ別モジュールとして1スレッドずつ割り当て、モジュール間はメッセージ通信で情報を交換するようにした。加えて、ほかの動作をブロックする処理を実行しないように、すべてのファイルI/Oを別のスレッドに分離する必要があり、状態遷移を意識しながらコードを書く必要があった。難易度が高い分、開発期間も長くなる。

「ところがErlangなら、何も考えずに済む」と佐野氏は言う。Erlang言語には言語が実装する軽量プロセスがあり、複数プロセスそれぞれが通信処理をするコードを書くと、言語の仮想マシンがI/O多重化を使って実行してくれる。軽量プロセスは通常のプロセスと違い省メモリで、数万プロセスを超えても問題なく処理できる。今までC言語で状態遷移を管理しながら通信処理を記述していたが、軽量プロセスを利用することで状態遷移を意識する必要がなくなった。実行速度はC言語には及ばないものの、開発期間を大幅に短縮できる。

Cuenote SR-Sの開発期間はおよそ3カ月だった。前述のCuenote MRの開発では、C言語を使い1年強をかけている。「先にわかっていたら、以前のシステムもErlangで開発したかもしれません」と佐野氏は言う。同社の社風が、Erlang言語の採用という決断を下しやすい雰囲気だったことも幸いした。「技術はかなり自由です」と開発グループマネージャーの蓮沼氏は言う。今では、Cuenote製品の開発チームのメンバー全員がErlangを操る。


月間10億件以上の配信実績から生むノウハウ、そしてErlangによる生産性の向上──これらを武器として、ユミルリンクのエンジニア達は今日もメール配信システムの開発に取り組んでいる。

[PR]企画・制作:はてな
写真:佐藤麻紀