FORCIA CUBEフォルシアの情報を多面的に発信するブログ

FORCIA Meetup #4 フォルシアにおけるPostgresの活用

2022.03.04

FORCIA Meetup PostgreSQL Spook エンジニア

こんにちは、広報の伊藤です。

本日はエンジニアがテーマに沿ってLT(ライトニングトーク: 10分程度の発表)を行うイベント「FORCIA Meetup」の内容をお届けいたします。

FORCIA Meetup #4 高速検索を支えるPostgreSQLのノウハウ

2月15日開催のLTのテーマは「高速検索を支えるPostgreSQLのノウハウ」

フォルシアでは、独自の技術基盤Spook®の開発にPostgreSQLを採用しています。Spook®はデータを様々な軸で高速に検索するための技術基盤です。(参考:フォルシアサイト テクノロジーページ)フォルシアは膨大で複雑なデータを持ったお客様にSpook®を提供しており、「独自の検索最適化技術」と「これまで培ってきたノウハウ」を駆使して高速なDB検索をすることがフォルシアエンジニアの仕事の一つとなっています。

そんなフォルシアから、PostgreSQLにまつわるトピックを4人のエンジニアが語ります。
イベントの詳細はこちらをご覧ください。

本記事ではフォルシアにおけるPostgresの活用についてご紹介します。イベントの雰囲気が少しでも伝わればと思いますので、ここから先は書き起こしスタイルにてお届けいたします。

フォルシアにおけるPostgresの活用

力石(司会):それでは、一人目は髙橋優樹(たかはし・ゆうき)さんから始めたいと思います。

髙橋:はい、ありがとうございます。

まずトップバッターとして私、髙橋の方から、フォルシアにおけるPostgreSQLの活用というタイトルで発表させていただければと思います。よろしくお願いします。
私の方からはなぜフォルシアが今日PostgreSQLのイベントを開催しているのかというところの概要みたいなものを少しでもお伝えできればいいかなと思っております。

はい。まず簡単に自己紹介なんですけれども、高橋と申します。今、新卒入社3年目でして、ずっとエンジニアをしております。今は旅行会社向けの商品登録システムの開発のチームに携わっていて、絶賛、新しいサービスを開発しているところです。

01001.png

また今回のイベントも技術広報というチームが主導で開催しているんですが、それのリーダーをやっていたりもしております。私事ですがマイブームは、最近はずっとサウナにはまっているのと、あと冬の期間はスノボによく行ったりしておりました。

はい、早速なんですけれども、フォルシアで使っているメインDBはPostgreSQLです。先ほどSpook®というサービスの説明を力石さんがしてくださいましたが、Spook®で使っているメインのDBもPostgreSQLを使っております。

会社紹介の繰り返しにはなってしまうんですが、フォルシアは膨大で複雑なデータの高速検索が強みです。詳しいところはまた後ほどのLTで紹介される部分もあるんですが、属性による絞り込みの検索だったり、テキストの全文検索、あとは先回り検索などと呼んでるファセットカウントだったりですとか、あとは複雑なデータの間の関係を考慮した検索など、様々な強みをもって高速検索を行っております。そしてこれらの実現にはPostgreSQLっていうのは必要不可欠だと私達は考えております。

今日の話はですね、PostgreSQLのここがいいよ3選というところで、大きく3つのポイントに絞ってお話をさせていただければと思います。その3選というのが、1つ目が、RDBならではの柔軟なテーブル設計。2つ目が、C言語による関数の拡張ができるということ。3つ目が、OSSなので無料で使えるよということですね。こちらについて順番に紹介させていただければなと思います。

01002.png

1. RDBならではの柔軟なテーブル設計

まず1点目の「RDBならではの柔軟なテーブル設計」というところですね。
弊社のお客様は旅行会社様が多いので、今回のスライドでは旅行会社様のデータを例にとって簡単に紹介させていただきます。

旅行に行こうと思ったときにネットで検索をして、予約をしたりするかと思うんですが、ネットで購入するその旅行商品の販売単位というのが、宿泊施設、1泊2食付とかカニ食べ放題プランのようなプラン、あとは客室はシングルなのかダブルなのか。こちらの3点(宿泊施設、プラン、客室)が合わさって販売できる可能な単位が決まります。その販売単位に対して多くは1年分の料金と在庫の情報を持っていて、これだけでもですね、例えばホテルだと数万施設あったりですとか、その中にさらにプランや客室が数十から数百ほど紐づいていたりするので、その全てに対してこの料金や在庫の情報を持っている...というだけでもなかなかなデータ量になるっていうのはなんとなくイメージがつくかなと思います。

さらにそれだけではなくて、現地で使えるクーポンやチケットの現地素材だったりとか、あとは宿泊施設までの足ですね、飛行機とか新幹線とかそういう足の素材もあわせて予約をすることができるんですが、それらについても、料金だったり、在庫のような情報を持っていたりします。加えてですね、契約情報といった、このプランだったらこの素材を組み合わせられるといったその素材同士の組み合わせの情報だったりですとか、何月何日は、このプランは売れませんといったですね、停止情報みたいなその他の情報などもあったりして、例えば何月何日何人でこのホテルに泊まりたいっていうふうな検索をした場合に考慮すべき条件というのは、ここにスライドを載せているようなとてもたくさんの情報の中から検索を行う必要があります。

01003.png



このようにですね販売可能な条件の判定がとても複雑、データ間の組み合わせなども考慮しないといけないという特徴がありますので、そういう複雑な環境を表現できるリレーショナルデータベースというのが検索のデータベースとして適していると考えております。

最近ですとNoSQL、例えばDynamoDBといったkey-value型のDBは色々あると思うんですが、検索のメインDBとして利用するにはこの条件を判定するのは難しいかなというふうに思っております

2. C言語による関数の拡張

では次に2点目のC言語による関数の拡張という話をさせていただきます。

PostgreSQLにもともと組み込まれている関数もなかなか種類はあるんですけれども、ユーザが自分で関数を定義して、それらを拡張することもできます。その拡張する際にもいろんな言語で書くことができて、例えばSQLを使って書くこともできますし、PL/pgSQLといった、他の手続き型言語でも書くことができます。特徴なのがC言語を使って関数を拡張することもできまして、フォルシアではこちらを大変活用しております。

まずはC言語による関数の拡張のイメージなんですけれども、C言語で関数をこのように実装していきますと、ここではPostgreSQLのマクロを呼び出してそれをC言語で使って、そちらコンパイルすることでsoファイルを作成します。そのsoファイルをPostgreSQL側で呼び出して読み出すことによって、PostgreSQL側で関数を使うことができます。

01004.png

谷井:はい、ここからはバトンタッチして私が発表させていただきます。フォルシアの谷井と申します。よろしくお願いします。

組み込み関数と別で合わせて実行することができて従来の組み込み関数を使ったり、あるいは純粋なSQLのクエリを書いて実行していくよりも高速に実行できる場合がかなり多くて、フォルシアではかなりこれを活用して実装をしています。

フォルシアのクエリにおいてはテーブルをあえて正規化せずにいくつかのデータを圧縮した状態でもってそのまま処理をするということをしています。これはあまりいわゆるセオリー通りではないのでトリッキーなやり方にはなりますが、その状態のまま持ち回ることでうまくメモリに乗せてあげたりとか、検索用のテーブルに対して、テーブルサイズを小さくするような工夫がされております。

まぁたくさんフォルシアのノウハウが詰まっているんですが、圧縮したデータの操作をPostgreSQLでやるにあたっては組み込み関数だけでは不自由になってしまうところがあるので、そこをC言語を使って拡張してあげることで、素早く処理してあげて、高速な検索をするための機能の一部として提供しているような形になっております。

これは、これまでにいろいろな旅行会社さんとかあるいは他のお客様のデータ構造をたくさん見て、こういうデータ構造であれば検索を速くできるのではないかという、エンジニアが蓄積してきたノウハウのもとに、「じゃあ、こういう関数もあると便利だよね」というものを共通ライブラリに追加していくことで実現しています。

関数の拡張については、パフォーマンスが必要な部分だけに対してい利用していくことで、コーディングのしやすさと、パフォーマンスの両立というところを実現している形になっています。

3. OSSなので無料で利用可能

はい。PostgreSQLのここがいいよ3点、3つ目というところで、OSSなので無料で使えるというところも大きな利点として挙げられるかなと思っております。

当然OSSなので無料で使えるというところで、コストが抑えられるので導入するときのコストが低いよっていうとこだったりとか、ライセンスによる制約も少ないため、導入するための障壁が低くなっているかなと思っております。

補足: PostgreSQLのライセンス

それからオープンソースでありながらもすごい高い可用性要件に対応できるような形になっていて、システムの要件だったりとか、規模に応じて自由な構成で柔軟に構成を実現できるので、そうしたクラウドを使ったスケーラブルな構成とかにも向いているという形で、社内ではKubernetesと組み合わせて利用している例もあったりします。

それからコミュニティもかなり活発で、新しくバージョンアップされたりとか、色んな機能が新たに追加されたりというところで更新も活発にされているところは、さらにPostgreSQLのいいところなのかなと思っております。

このようにPostgreSQLをはじめとしてOSSには大変お世話になっているため、弊社としても今後OSSの発展に貢献していきたいと考えています。

今後の展望

最後に今後の展望としては、ユーザ定義関数を他の言語を使って書くというのがあります。既に弊社のブログでも書かせていただいていますが、Rustを使ってユーザ定義関数を書いてみるっていうところも一部チャレンジをされていたりとか。
またはAWSのRDSがplv8をサポートされているので、JSを使って一部の関数を書いてみたりとか、そうしたところでさらに書きやすく、関数を拡張していこうみたいなこともあったりはします。

01005.png

はい、といったところで、具体的な内容はどんなことしてるのっていうのは残りのLTで続きを発表させていただきたいと思いますので、このLTとしては以上とさせていただきます。ありがとうございました。

LTを終えて

力石(司会):ありがとうございました。質問があれば、よければ是非皆さま、お願いいたします。ちなみに私は、このフォルシアでは、あえて正規化をしないっていうのを、入社してから知ったのですが、学生時代は正規化してなんぼみたいな感じだと勝手に思っていたところがあったのですが、正規化しないことで速さに繋げているのかって驚いたことが1年ぐらい前にあったなっていうのを今思い出しました。

谷井:たくさんの工夫の上に成り立ってるので、ライブラリだったりとか、いろんな既に書かれた既存のアプリのSQLとかを見ていても、なかなかトリッキーなことをしているなというのは日々勉強になるので、そうですねそういうところは、なかなかノウハウが詰まっているなと思いますね。

力石(司会):本当にそうですね。自分はまだあまり拡張のC関数みたいなところは触ったことはないのですが、今までの先輩皆さまのいろんなC関数を見ていると「そういう処理の仕方があるんだ」と勉強になりますね。では、高橋さんと谷井さん、お二人ともありがとうございました。

谷井:ありがとうございました。

FORCIA Meetup #4 書き起こし記事、続々公開

PostgreSQLの3つの推しポイントについて、いかがでしょうか。
「検索」、「旅行」といったフォルシアの代名詞のような部分も例に挙げてのLTでした。

続いて公開するのは、

PostgreSQL開発とテスト

テストにまつわるあれやこれやをご紹介いたします。お楽しみに!

この記事を書いた人

伊藤 明日香

2021年6月キャリア入社/経営企画室 広報
書き起こしツールの進化に感動中

フォルシアではフォルシアに興味をお持ちいただけた方に、社員との面談のご案内をしています。
採用応募の方、まずはカジュアルにお話をしてみたいという方は、お気軽に下記よりご連絡ください。


採用お問い合わせフォーム 募集要項

※ 弊社社員に対する営業行為などはお断りしております。ご希望に沿えない場合がございますので予めご了承ください。