ミドルウェア開発におけるさまざまな疑問について語り合おう
――ミドルウェアの開発時にどれだけスケーラビリティを考えるか。
久保氏 ミドルウェアはアプリケーションでカバーできない領域を扱うため、パフォーマンスやスケーラビリティの問題を考えなければならない。ミドルウェアを開発するメリットを得るには、例えばアプリケーションサーバーがさばくリクエスト量に対して、10倍以上の処理能力をミドルウェアに持たせる必要がある。Gaurunを使った配信システムでは、数台のGaurunにより1時間で数千万単位のプッシュ通知を扱うが、それ以上処理を速くすると逆にアプリケーションサーバーに負荷がかかってしまう。
坪内氏 Diamondの場合、データベースなので蓄積データ総量が重要になる。もともと扱うデータ量を100倍にすることが開発の理由だ。AWSのマネージドサービスをベースとしているため、AWSのサポートする範囲でスケールすることは可能だが、その分コストがかかる。また、Diamondではマルチコアでスケールするために、開発言語にGoを使用している。
田籠氏 データ量の増大に対応するには、マルチコアでのスケールが必要になる。ディスクやネットワークの入出力速度は向上しているが、シリアライズ/デシリアライズなどの処理が重い。ミドルウェア開発では、CPUコアをきちんと活用することを意識してコードを書くことが必要かもしれない。
――ミドルウェアの寿命をどのように見積もるか。
藤原氏 Katsubushiは機能が少ないため、バイナリが動き続ければよいと考えている。寿命を延ばすなら、OSS化という方法もある。OSS化すれば、仮に自分が今の会社を辞めてもメンテナンスができるし、引き継ぎも容易になる。
田籠氏 OSS化すると、メンテナンスが難しい。Bigdam-poolについては、プロジェクト全体をデプロイするCIの作成を検討している。CIがあれば変更が容易になり、プロジェクトの寿命を延ばせるかもしれない。OSS化については、所属部門の理解が必要。独自にミドルウェアを開発しても、数年後にはより機能性の高いOSSが出てくる場合がある。
坪内氏 サービスが成長すると、要件が厳しくなる。成長しなくなった後は、コストをかけられないが、維持は必要という状況になってしまう。海外企業はソフトウェアを団体に寄贈しているが、これはソフトウェアの寿命を延ばすという側面がある。
久保氏 「ミドルウェアの寿命=開発者の在職期間」ということもある。そのようなことが起きないために、ミドルウェア専門のエンジニアという職種を設けている。
――ミドルウェアと他のソフトウェアとの違いは?
坪内氏 パフォーマンス要求が厳しいことが多い。Webアプリは仕様変更が多く、柔軟に変更できる冗長さがある。ミドルウェアはそういった妥協が許されず、開発時にデータ構造などをしっかり決めないと、要求するパフォーマンスが得られない。
久保氏 いろいろなところで使われる可能性があるので、互換性にかなり気を遣う。
藤原氏 社内で利用する場合、サービスに合わせて機能を実装したり変更したりすると、後々メンテナンスが大変になる。
田籠氏 ミドルウェアはサービス横断的に使用されることが多い。特殊なデータ構造やプロトコルを使わず、一般化した設計を心掛けることが必要だと思う。
藤原氏 メモリリークに気をつける必要がある。Webアプリは最悪入れ替えればよいが、ミドルウェアは簡単には入れ替えられないため、長時間稼働してもメモリリークが発生しないようにする。
田籠氏 レースコンディションも同様。ミドルウェアはスループットが上がると、レースが発生しがち。レースコンディションを作らないためにどうすべきかを考えなければならない。
藤原氏 ミドルウェア内部の情報を外部からモニタリングできるようにして、運用時に何が起きているかが分かるようにすることも重要だと思う。
――OSS化した場合、利用者を増やすために布教活動は行うか?
久保氏 汎用性が高く、広く使われそうなミドルウェアであれば、OSS化する場合もある。Gaurunはすでに他社でも使われている。機会があれば紹介するが、積極的な布教活動まではいかない。
藤原氏 自社で必要になり作成したミドルウェアをOSS化すると、汎用性が向上し、自社の宣伝にもなる。ただ、布教活動は積極的に行わず、使いたい人は使ってくださいというスタンス。
田籠氏 弊社はミドルウェアを開発しており、OSSを好む。社内事情が許せば、基本的にOSS化する。Bigdam-poolも汎用性の高い機能をOSS化する予定。「Fluentd」のように、社内でも利用するが、社外にも積極的に公開していきたい。OSS化すれば、布教活動も業務の一部となる。
――ミドルウェア開発に必要な技術はどのように身に付けられるか。
藤原氏 ミドルウェアはWebアプリの延長のように見えるが、実際はそうじゃない。WebアプリはHTTPリクエストをさばいて終わりだが、ミドルウェアはHTTPリクエストをさばきながら、内部でデータを保持するなどの処理を行う。最初からミドルウェアを開発するのは難しいかもしれないが、Webアプリの開発経験を積んでいけば、ミドルウェア開発に必要な技術力につながる。
久保氏 自分は組み込みや広告配信などの開発経験があるが、そういったパッケージ製品の開発の考え方は非常に参考になる。Webアプリ以外の開発経験も重要。仕事柄、ネットワークのデバッグを行うが、telnetでHTTPリクエストを調べたりといった経験が技術力に結び付いていくと思う。
田籠氏 ミドルウェアは、途中で根本から作り直すことが難しいため、設計をきちんと行わなければならない。そのため、アプリケーションなどの高レベルからネットワークなどの低レベルまで、データ構造やプロトコルを意識する必要がある。
ミドルウェア専門のエンジニアはそう多くない。ぜひ、この分野に参入してミドルウェアを開発してほしい。