「Elixirは、2年間ほったらかしても安定して動き続けていた…
ヤマップの実践Phoenix API運用と新プロダクト」
「あたらしい山をつくろう。」を理念に掲げ、自然×IT分野のパイオニア企業を目指す、株式会社ヤマップ。
登山をする方に向けたWebサービスやスマートフォンアプリの開発を行なっています。
福岡の中でも、イチ早くElixirプロダクトを導入・運用した実績を持つ「山岳エンジニア」の松本さんにお話を伺いました。
――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シャツやステッカー、久留米絣の登山ズボンなど、リアルなモノづくりをしていることも、ヤマップの特徴です。
もし、ピンと来るエンジニアがいたら、ぜひご応募ください。