「Elixirは、2年間ほったらかしても安定して動き続けていた…
 ヤマップの実践Phoenix API運用と新プロダクト」

「あたらしい山をつくろう。」を理念に掲げ、自然×IT分野のパイオニア企業を目指す、株式会社ヤマップ。

登山をする方に向けたWebサービスやスマートフォンアプリの開発を行なっています。

福岡の中でも、イチ早くElixirプロダクトを導入・運用した実績を持つ「山岳エンジニア」の松本さんにお話を伺いました。

https://yamap.co.jp/


――Elixirを知ったきっかけは何でしたか?

2年ほど前に、サジェストAPIを作ろうとしていました。「F」と入力すると、「F」で始まる山が検索される、といった感じの。

その技術を選定しているとき、mixiに勤めている友人からElixirの話を聞き、良さそうだったので試してみたことがきっかけです。

ElixirのWebフレームワーク「Phoenix」がとても良くできていて、なんとなく作ってみたらすぐにできました。

一番難しかったのは、バックエンド側の検索システムで利用していたElasticsearchへの接続で、当時は、Amazon Elasticsearch ServiceがVPCをサポートしていませんでした。

そのため、認証等を手作りで頑張る必要がありましたが、その辺は、Qiitaに先人が書いている情報を参考にしました。


――Elixirのどのような部分が決め手となりましたか?

「速度」と「リクエストが集中しても処理が可能なところ」です。

まず、サジェストAPIの要件として、「レスポンスの速さ」が求められます。ユーザーが入力する前に、「これじゃないですか?」と提案しなければいけないため、速度が必要でした。

また、ユーザが1文字入力したり、キーを触ったりする度にリクエストが来るため、どのくらいのリクエスト数が発生するのか予想つかず、集中の発生は避けられませんでしたので、一時的にリクエストが集中しても問題ない仕組みが必要でした。

同時に、サジェストAPI以外の既存Ruby API群は、安定させたままにしておかないといけないのですが、リクエストが一気に来たとき、これらAPIが遅くなったり、落ちる懸念も避ける必要があったため、低レイテンシな別の言語との併存を考えました。

その結果、リクエスト集中があってもレスポンスが低下せず、全てのリクエストを素早く返せるElixirの特性が決め手となり、サジェストAPIをElixirで実装することになりました。


――実際にElixirを使用してみての感触は?

触った時の感触は、割と良かったです。

元々、Rubyと似た文法を使用しますし、頭で考えたことをそのまま書けるパイプ演算子を使えば、一時変数に代入して他のメソッドに渡す必要も無いため、書き味が非常に良かったです。

性能面でも全く問題なく、リクエストが来て、Elasticsearchに問い合わせて返すまで60~80ミリ秒です。

このクオリティを達成するのは、他の言語では、なかなか難しいと思います。

現在、Elixirで組んだサジェストAPIをリリースしてから、2年くらい経ちますが、特にメンテナンスはしていません。

ほったらかしにしていても、安定して動き続けているので、手が掛からずに助かっています。

本体のRuby APIの方は、プロセスが生きていく時間が長ければ長いほど、メモリを消費していくため、どうしても挙動が不安定になってしまうことがあります。

そのため、夜間、誰もいない時にこっそり再起動して凌いだりしていますが、Elixirに関しては、そういったことはありません。

詳しいメカニズムは分からないので、一概に良いとは言えないかもしれませんが、運用が落ちないことは、いいことだと思います。


――社内でElixirをどのくらい使用していますか?

要件によって言語を使い分けていますが、メインはRubyですね。

1年半ほど前、弊社のWebリニューアルを行う際、エンジニアの中で、技術選定の話になりましたが、そのときは、みんなRubyが書ける状況でしたし、そのときRailsに詳しい方も入社したばかりでした。

一方、Elixirは、自分しか使ったことが無いという状況でしたので、開発スピードに優先順位を置き、Rubyをメインにする、という選択をしました。

弊社の場合、サジェストAPIのような特殊ケースを除いて、リクエストがそこまで集中することは無いので、Ruby中心で構築し、負荷が発生したときは、サーバを並べて解決する、という判断でやっています。

ただし、サジェストAPIのような、特別な用途には、Elixirをはじめとする、要件に適した言語を使っていけばいいとも考えています。

Elixirは、上から順番に見ていけば、何が書いているか分かるので、コードは読みやすいと思いますが、Rubyで書いた経験が長い方は、関数型で処理することに違和感を覚えるかも知れません。


――Elixirに向いている使い方は?

データサイズが小さなリクエストや、突発的なリクエスト増大、もしくは、ハイパフォーマンスを求められている時に有効だと思います。

あとは、サーバにお金をかけかけられない時にも有効だと思っています。

今、サジェストAPIで使っているサーバーは、AWSのt2.smallと、かなり小さいものを使用しています。

これは本来、テスト環境で使うような小ささですが、にも関わらず、CPUは1桁台しか使っていないし、メモリも充分余っていますので、Elixirを使ったことで、結果的にサーバ費用を大幅に抑えられています。

現在、もう1つ、Elixirで作っているのが、「画像アップロードシステム」です。

これまで、本体のRubyで画像をアップロードするシステムを作っていたのですが、ユーザがたくさんの画像をアップロードすると、極端に負荷が上がってしまいます。

そこをElixirでリビルドし、現在、本番に出ているのですが、まだ多くの人数が使っていない状況のため、βテストのような状態です。

みんなが使うようになったとき、またElixirの秘めたパフォーマンスが見れると思うので、楽しみにしています。


――最後に一言!

実は、Elixirの実績が、弊社におけるエンジニア採用に繋がっていたりします。

バックエンド、インフラ、フロントなど…全て募集しています(笑)。

アウトドアや山が好きなエンジニアには、もってこいの職場というのも、他社には無い魅力です。

全く山登りに興味が無かったエンジニアも、入社後に社内のイベントに参加して、山登りやアウトドアに目覚めたということもあります。

今年の夏は、4泊5日で長野県の北アルプスに行きました。

また、オンラインを中心に、Tシャツやステッカー、久留米絣の登山ズボンなど、リアルなモノづくりをしていることも、ヤマップの特徴です。

もし、ピンと来るエンジニアがいたら、ぜひご応募ください。