高速リレーサーバ「Cuenote SR-S」の魅力
顧客向けの案内メールなどのように一度に大量のメール配信を行う場合、正しく配信されなかったり、遅れて配信されたりするケースが多々ある。代表的な原因としては、配信先の増加によってメール配信システムの時間辺りの配信数の上限を超えてしまうケースや、無効なアドレスを正しく管理できていないケースなどが挙げられる。また携帯電話向けに配信する場合などには、同じドメインから同時に大量のメールを送るとキャリア側の制限によって配信が中断されてしまうことも多い。
リレーサーバであるCuenote SR-Sの魅力は、これらの問題を既存の配信システムに改修を加えることなく導入できるという点である。簡単に説明すると、Cuenote SR-Sはメール配信のためのネットワーク経路上に配置し、他のメールサーバやメール配信システムからメールの文面を受け取って、登録された配信先に転送する。このとき、配信先ごとに配信する速度や時間帯を制御したり、エラーアドレスやバウンスメールの管理を適切に行うなど、さまざまな視点に基づく対策によって前述のような問題を回避し、遅配や不達のない安定したメールの配信を可能にする。
「メール配信の場合、すでに自前のシステムで運用されているというお客様が少なくありません。その場合、既存システムの資産を活かしたい、使い勝手を変えたくないという声も多く聞かれます。Cuenote SR-Sであれば、既存のシステムはそのまま利用しながら、配信速度の向上や配信遅延の解消などを実現し、大規模配信に対応させることができます」(佐野氏)
単にリレー配信するだけでなく、Cuenote SR-Sにはメール文書の生成機能も備えられており、テンプレート機能や文字列の差込機能、ブロック単位での差し替え機能などによって、配信先一通ごとにカスタマイズされたメールを送ることができる。携帯電話の絵文字やデコメールに対応しているため、キャリアごとに適したフォーマットに変換して送ることもできるようになっている。
標準でAPI機能を備えており、外部システムと柔軟に連携できる点も大きな特長。APIを利用することで、サーバの状態や配信状況の確認、ログデータの取得、各種の取得や変更、メールテンプレートの作成やメール送信指示などを外部から行うことができる。
Erlangの採用により、3か月で実装
多くの機能を備えたCuenote SR-Sだが、その特筆すべき点の一つとして、これがErlangを使用して実装されているということが挙げられる。Erlangはエリクソン社によって開発された関数型プログラミング言語であり、ネットワーク通信処理や複数プロセスの並列・並行処理に優れているという特長がある。Erlangを採用するに至った経緯について、佐野氏は次のように語っている。
「最初のきっかけは、Rubyの開発者であるまつもとゆきひろさんが『Rubyistのための多言語探訪』という連載の中でErlangを紹介されていたことです。ネットワーク性能が高く、業務で活用されている実績もあるということで興味を持ち、まずはプライベートな時間に自分で試してみました。そこで意外と使い物になりそうだという感触があり、通信コードを使ったベンチマークでもある程度の性能が出たので、製品開発にも耐えられると判断して会社に提案しました」
実際に製品開発に使ってみた実感として、「とにかくネットワーク処理を実装するのが楽。並列処理について何も考えなくてもいいという点も大きな魅力」と同氏は語る。メール配信システムの場合、高速な送信を実現するためには通信の多重化が必要になってくる。従来製品ではこの多重化処理をC言語で記述していたが、リソース消費量を抑えるためにシングルプロセス・シングルスレッドでのI/O多重化方式を使用していたため、並列制御が容易ではなかった。
その点Erlangの軽量プロセスであれば、プロセス間の状態遷移を意識しなくても、仮想マシンがうまくI/Oの並列化を行なってくれる。1つの軽量プロセスは極めて少ないメモリで動作するため、数万プロセスの並列処理でも問題なく実行することができる。
初めて使う言語だったが、「C言語で記述するよりはるかに楽に実装できた」と佐野氏は言う。開発にかかった期間はおよそ3か月。C言語で実装した既存製品に比べて格段に短期間での開発だったとのことだ。
同氏は、上記の他に、無停止でパッチを反映させられる点や、実行中のVM内部の情報をリモートシェル機能で参照できる点などもErlangの魅力として挙げている。
課題だった実行速度は、入念なプロファイリングとC言語化で解決へ
ネットワーク処理に強みを見せる一方で、Erlangの使用には大きな課題もあったという。その一つが言語の処理系そのものの実行速度だ。ネットワーク処理や並列処理は高速だが、その他の通常の処理に関してはC言語に比べるとはるかに低速で、全体としてのパフォーマンスが確保できないのだ。
そのため、ボトルネックになっている箇所はC言語で実装しなおすという方針をとった。ところがここにも大きな問題が立ちはだかっていた。当時、Erlangから外部のC関数を呼び出すための主な手段としてポートドライバを利用する方法があったが、オーバーヘッドが大きくて性能が悪かった。そこで佐野氏は、C言語化したい部分をBIF(Built In Function)として実装し、Erlangから呼び出せるようにしたとのこと。BIFはErlangに備わっている組み込み関数群である。これを自前で用意するということはErlang言語そのものを拡張するのに等しく、大きな手間がかかったという。もっとも、現在はNIFs(Native Implemented Functions)と呼ばれる外部のC関数を呼び出す新しい機構が追加されたため、より手軽にC言語による拡張が行えるようになっているとのことだ。
このように、処理速度のボトルネックはC言語化で乗り越えるという方針を取ったものの、そもそもどこでボトルネックが発生しているのかを突き止めることも容易ではなかったそうである。Erlangにはプロファイリングツールが用意されているが、当時はこのツール自体がパフォーマンスが悪くて使い物にならなかった。そこでユミルリンクでは、独自にプロファイリングツールを開発して解析を行い、入念にボトルネックを解消していくことでパフォーマンスの改善を進めていったという。
「もともと既存製品のメール配信エンジンはC言語で作っていましたから、C言語には慣れ親しんでいましたし、どの部分がネックになりそうかという勘所も心得ていました。言語は違ってもメール処理のロジックなどに関するノウハウは活かせるので、それがErlangでの開発でも活かせたと思います」(佐野氏)
自社開発で培ってきた技術力
ユミルリンクでは、現在約15人が製品開発に携わっており、そのうちの半数ほどがErlangを使いこなしているという。メイン言語はPerlとC言語だが、Erlangも徐々に浸透してその仲間入りをしつつあるようだ。佐野氏は、自社の技術陣について次のように語って自信を覗かせている。
「弊社では2003年以来メール配信のエンジン自体を独自で開発してきたので、システムの基幹部分をソースコードのレベルからチューニングできるという強みを持っています。パケットダンプの解析なども日常的に行っていますし、必要が生じればその都度専用のツールを作ってシステム内部の状態を可視化するという対策を取ることもあります。自社開発によってノウハウを積み重ねながら高いパフォーマンスを実現してきました」
同社では独自のフレームワークやライブラリの開発も積極的に進めており、その一部は外部向けにも公開されている。10年以上に渡って培ってきたノウハウに、Erlangという新しい武器を加え、今後もメール配信システムのパフォーマンスと安定性の向上に努めていくとのことだ。