• Home
  • コーポレートブログ Geniee’s BLOG
コーポレートブログ

Geniee’s BLOG

ジーニーは最先端の広告テクノロジーで
顧客の収益を最大化します。

先日のPOSTの通り、企業のミッションをアップデートをしました。合わせてGENIEE のVALUE(行動規範)をアップデートしました。

これまでのGENIEE VALUEは、「事業最適」の観点を重視して、アドテクノロジーの事業を成長させる上で、重視すべき行動を明文化したものでした。GENIEE VALUEEを掲げて6-7年たち、アドテクノロジーの事業は成長しました。お蔭さまで上場もできました。

世界的なテクノロジー企業を創る上で、良い部分、変わった方がいい部分もわかってきました。

今回の変化でまずGENIEE VALUEが、GENIEE Brand Personalityとなり名前が少しおしゃれになりました。

次にジーニーは歴が浅い人も多く、まずはテクノロジーの会社に慣れる必要がある人たちが一定います。その一方で世界的な仕事に挑戦する人たちがいます。そのためジーニー初心者向けの行動規範であるBASICと、世界的な仕事をするためのMASTERに分けました。

こちらがGENIEE Brand Personality BASIC

「当事者意識」「やり抜く」という成長を牽引してきた文化を継承しながらも、

「隣人に親切に」
もし困ってる人を見かけたら助けよう
私たち一人ひとりは完璧ではない。スピード成長する状況のなか、一人ではやり切れない時もある。困ってる人がいたら手を差し伸べよう。助け合って、感謝し合い、良い組織を作ろう。

「心身ともに健康に」
いい仕事をする基礎は健全な精神と身体にある
知的労働は神経を使う。集中力を維持するには、体力が重要だ。毎日、新鮮な頭と身体で働けるよう身辺を整え、健やかな心身を保とう。

などを追加されました。初心者により優しい組織を目指します。

テクノロジー企業として
「顧客価値を生み出す」
「オープンさとフィードバック」
「数字・ファクト・ロジックで考える」
により、新しい顧客価値を生み出し、過去の経験よりも、数字とロジックで議論する文化を明文化しました。

こちらがGENIE Brand Personality MASTER

すべての内容が素晴らしいですが、

本物のチームワーク
強い個が、チームを組むことがいちばん強い
担当分野のスペシャリストとして、相手のことを理解・信頼・尊敬し、摩擦を恐れず、オープンに議論を交わすこと。チームのシナジーは、違いを尊重したコミュニケーションから生まれるもの

ビギナーズマインド
自分の経験に固執しない。全てに気づきはある
日本で正しい事が世界では違う。ビジネスの正解は時代とともに変化する。人は経験を重ねると経験の枠組みやパターンによって、新たな事柄を認識することや興味関心を持つことが難しくなる。毎日を初心者の気持ちで過ごし、あらゆる事から学び、自分を変え続けましょう。

仕事を愛し、こだわり抜く
魂を込めた仕事でしか世界を変えられない
仕事はあなた自身。大切にしよう。細部の細部までこだわろう。圧倒的な熱量で人生の最高傑作をジーニーで生み出そう。

は特にジーニーらしく最高です。

「長期思考」「リスクテイク」「グローバルレベルの仕事」「仕組みを強くする」など一部の人が体現していましたが、これからより多くの人が取り組むことになるでしょう。

一人一人がGENIEE Brand Personalityにのっとって行動し、ジーニーを世界的なテクノロジー企業を一緒に創り上げていきましょう。

ブランドチームの皆さま 10ヵ月以上の検討お疲れ様でした!!

Date
Author
ジーニー代表の工藤です。 工藤智昭

ジーニーのミッション、私たちの存在理由を定義するものとして
「テクノロジーで新しい価値を創造しクライアントの成功を共に創る」を新たに掲げ、
次の10年に向けてスタートします。

上場という契機もあり「次の未来を見据えた新たなミッションを再定義すべきではないか」
という社内デザイナーの提案を発端に、ブランドプロジェクトが発足しました。

ジーニーの存在価値はどこにあるのか。
次の10年どんな企業が社会から必要とされるのか。
私たちは今後何を目指していくか。
昨年夏からはじまったブランドプロジェクトでは、サンフランシスコまで出向き世界的なテクノロジー企業へヒアリングし、社内のメンバーやブランドコンサル企業と何度も議論を重ねてきました。

ジーニーはアドテクノロジーと言われる業界でRTBの技術やビックデータの活用によって広告業界の変革してきました。
昨今、広告業界だけでなくあらゆる産業でAI、Iot、AR/VRや5Gをはじめとするデジタルテクノロジーが、ビジネスに大きな影響を及ぼしています。
ジーニーはテクノロジーの無限の可能性を信じています。
しかしテクノロジーは、そこにあるだけでは意味を成しません。
人がイマジネーションを持って活用する方法を導き出し、
プロダクトを創造してこそ社会を変革する価値が生まれます。
ジーニーは技術から新しい価値を創り出し続ける会社でありたいと考えています。

また、ジーニーはこれまで、協業を大切にしながらビジネスパートナーの皆さまと一緒に成長・成功をしてきました。アジアのたくさんの人々との出会い、お互いを信頼し、何度も一緒に挑戦をしてきました。そうした人々との強い結びつきがたくさんできた事がとても誇らしいですし、ずっと大切にしてきたいと思います。
今後より一層、日本をはじめアジアの企業が変革が求められる中で、ローカルの顧客に寄り添い、ローカルの顧客と一緒に成功をする。
次の10年もそんな会社でありたい。

そんな願いを込めた新たなミッションの下、実現に向けて邁進して行きます。

また、ジーニーは普通の会社以上にたくさんの挑戦と失敗を繰り返してきました。海外の展開も黒字化を果たして、その後も成長を続けています。たくさんの経営の経験が積まれました。

今後はそのような経営のノウハウを社外に提供していこうとも考えています。たとえば、リクルートで行われていた「非連続の事業成長モデル」をジーニーでは実践し高成長を続けてきました。ただ、問題点もあることに気づきました。より長期に渡って成長し続けるために作った「価値創造の成長モデル」に今は移行していっています。

Date
Author
ジーニー代表の工藤です。 工藤智昭

こんにちは、人事の高橋です。

先日マネージャー、部長、本部長の研修を実施いたしました。
レイヤー別研修はやっておりましたが、合同の研修は初めてで、いろいろな気付きがありました。

第一部では、新卒からマネージャーになった2人から育成やチーム作りについてプレゼンをしてもらいました。

1人目は酒井。成果を出していくには部下の育成が不可欠と自身で気づいた中で、ひたすら部下と向き合い自身の育成で意識している7つのことを紹介していました。


<酒井流部下育成の7つの方針>
・自信を付けさせる
・話しを聴く/向き合う
・教わる
・褒める/叱る
・気付かせる
・約束を守る
・何より信じる

どれもとても基礎的なことではありますが、一つ一つ日々出来ているか内省をしているそうです。
また今にたどり着くまで100冊以上もマネジメントの本を読んだというエピソードには地道に努力をしている様子が伺えました。

もう一名は川崎。モチベーション向上に向けてのチャレンジという内容でした。
自分がこの会社に必要な存在であるということを認識させることが大切、そのために必要なものを3つ紹介しています。

<存在意義を感じるために必要な要素>
・明確な役割の認識
・希少性(=プライド)
・周囲からの認知

その人の得意不得意をやりたいことを考慮してミッションを明確にすること、自分たちのチームはこうだよ!と自身のチームの希少性を全体の場でアピールし続けたそうです。まだまだ足りないのでこれからも継続していくということでした。

また、最後の言葉が印象的でした。
「自分たちのチームはモチベーションが低かったのか?そうではないと思っている。組織を良くしていきたい気持ちがあったから、現状に対して怒りがあった。」
それを本気で受け止め、返していかなければということでした。

その後第一部後半には、マネジメント習慣の見直すグループワークを行いました。
目的は最低限のマネジメント品質を自分たちで考え決めること。
各職種のマネージャーとしての基礎行動習慣やスタンスを具体的にリストアップしていきました。次回の研修でも継続して議論していく予定です。

第二部では組織サーベイ結果等から組織の現状把握、課題分析を行いました。
第三部では上記を受け、9期上期の自身の目標を設定。次回の研修でフィードバックを行う予定です。

9期の研修でも継続してマネージャー陣一同でマネジメントの強化に取り組んでいけるよう、頑張ります!

Date
Author
社風やジーニーでの働き方などをご紹介していきます。 ジーニー人事チーム

人事藤本です

学生の皆さん、3月に入り就職活動が解禁になりましたね!
今は様々な企業の説明会にエントリーをしている所ではないでしょうか。


ジーニーも2019年度の新卒採用活動を積極的に行っており、
3月は東京本社での説明会以外でも関西と九州に遠征に行きます。
今年は上場後、初の会社説明になります。
ジーニーのこれまでの軌跡、そしてこれからの成長戦略と、
色々な事をお話しさせて頂ければと思います!

今年も40名弱の新卒を採用予定なので、沢山の学生に会いに行きます!
どうしても都合が合わない場合はSkypeでもお話しさせて頂きます!
興味があったら是非エントリー下さい。
お待ちしております!

Date
Author
社風やジーニーでの働き方などをご紹介していきます。 ジーニー人事チーム

こんにちは、人事の高橋です。

弊社は昨年12月に東京証券取引所マザーズに上場いたしました。
日頃のご愛顧を込めて上場記念謝恩会を開催させていただきました際の様子をご紹介いたします。

オープニングでは、共にジーニーの歴史を作り歩んでくださった皆様と一緒にこれまでの道のりを振り返るとともに、あらためて代表取締役の工藤から感謝の言葉、ジーニーにとって上場はスタート時点であり、これからも積極的に事業拡大し、企業価値を向上させていく方針を述べさせて頂きました。
その後のフリータイムはお取引先のお客様へ個別にご挨拶へ伺わせていただきました。ささやかながらジーニー社員一同精一杯おもてなしさせて頂きました。
みなさま、いつもありがとうございます。

また、懇親会ではこれまでご支援いただいた企業様に、あらためて感謝の気持ちをお伝えするとともに、当時のエピソード、また今後の期待のお言葉等をいただきました。
今までの皆様からの感謝を胸に、ジーニーは今後も圧倒的な成長を目指します。
引き続きご支援ご鞭撻のほどよろしくお願いいたします。

Date
Author
社風やジーニーでの働き方などをご紹介していきます。 ジーニー人事チーム

こんにちは!人事の古内です。

先日、2018年4月入社予定の内定者向けの研修を開催しました。

遠方の内定者もたくさんいる中ほぼ全員に参加いただき、大変賑やかな研修となりました!

冒頭では、新しく仲間入りした内定者の紹介と内定証書の授与が行われました。

課題の発表です。

前回の研修で出された「アド・プラットフォーム、マーケティングオートメーションの両事業課題」を各グループで発表しました。

様々な業界を例に出したり、分かりやすく、聞いてる人が興味を惹くように工夫されていました。

皆真剣に発表を聞いています!

最後に、取締役の廣瀬とマーケティングオートメーション事業本部本部長の吉村が審査をし9チームの順位が決まります。

プレゼン力やチーム力などが審査基準です。

廣瀬・吉村から質問も飛ぶので、会場は緊張感に包まれました。

 

休憩を挟み、グループワークです!

今回の注目ワークは、マシュマロチャレンジ。

マシュマロ・チャレンジはパスタ、テープ、ひも、マシュマロを使って自立可能なタワーを立て、最も高いタワーを作ったチームの優勝となるゲームです。

 

皆で話し合いながら、より高いタワーを求めて取り組んでいます。

 

自立したと思ったら倒れてしまったり、今にも倒れそうなのにピタッと自立することができたり、その度に歓声が上がり楽しく進めることができました。

チームで一つの目標に向かって、成果を出そうと頑張ること、最後に良かったところ、悪かったところを振り返ることがこのワークの目的でした。

 

ジーニーでは、入社前も入社後も様々な研修を取り入れています。

内定後は、少しでも不安を取り除きスムーズに業務開始できるように、入社前から人事が全力でサポートしております!

2019年度入社の新卒採用も始まります。

中途採用も積極採用中です。まずは話を聞きたい!というカジュアルな面談も大歓迎です。

少しでもジーニーに興味を持っていただいた方は、こちらからエントリーをお待ちしております。

Date
Author
社風やジーニーでの働き方などをご紹介していきます。 ジーニー人事チーム

こんにちは!人事の田村です。

1/12(金)は8期4Qのキックオフでした。
方針発表、表彰、懇親会と内容盛りだくさんの会の様子をレポートいたします!

会場は、披露宴で使用するようなゲストハウスを貸切り、新鮮でした。
集合写真は最近恒例のGポーズで。(GenieeのG!)

 

<第1部:3Qの振り返りと4Qの全社方針・各部方針の発表>

社長の工藤からは、振り返りとして3Qに取り組んだサービス強化の背景や、
事業を前へ進めた事例や気付き、上場前後の違いなどが共有されました。
4Qの方針については、上場後のその先の夢を社員の私たちから募集するというお話や、人事部の新設について説明がありました。

その後、各部の方針が各本部長より発表されます。
社長をはじめ、各事業部のトップが直接方針を伝える文化はずっと続いており、皆さん真剣に聞いています。

2018年1月に新設した人事部の発表では、人事メンバーの期待を一身に受け止めた人事部長の高橋から、採用と研修の2軸で方針発表がありました。

写真は、人事部5名。
3年前、一人きりで人事を担当していた見並も嬉しそうです!(左から2番目)

 

<第2部:所信表明、3Qの表彰>

第2部は、MGR、部長に昇格した方からの所信表明から始まりました。
今回は皆さん中途入社の方々で、1年以内でリーダー、マネージャーへと昇格した方もいました。

そして、そのまま8期3Qの表彰です。
今回は、Valuable Playerに5名、Valuable Teamに2チームが受賞されました!

受賞式では、受賞者の直属の部長から結果が出るまでに乗り越えた壁や、
本人が変化したことなどの説明があり、一人一人の表彰背景が分かるとても充実した時間でした。

こちらが受賞された皆さんです。
若手社員も多く、勢いを感じます!

 

<第3部:懇親会>

乾杯は、部長に昇格したマーケティングオートメーション事業本部の石井が任され、恒例のダルマの目入れも行いました。

17新卒による紅白歌合戦コンテンツでは、この機会でないと決して見ることは出来ないだろうエンジニア社員のダンス姿や、熱唱する姿を見ることが出来、個人的にはとても面白かったです!

その後は、ランダムに決められたチームで他部署交流を深めつつ、チーム対抗の伝言ゲームが始まりました。
伝言内容は、ジーニーの4Qの方針です!
中には珍回答もありましたが、皆さん酔っぱらっているはずなのにしっかりお題の方針を伝え、どのチーム景品をもらって嬉しそうでした!

 

最後は社長の工藤より、閉式の挨拶です。

 

懇親会では、フォトジェニックな場所が色々あったにも関わらず、写真を撮るより夢中で話して夢中で食べている皆を見て、「ジーニーらしいなぁ」と感じました。

4Qも、一丸となって頑張ります!
以上、キックオフのレポートでした!

Date
Author
社風やジーニーでの働き方などをご紹介していきます。 ジーニー人事チーム

こんにちは、メディア部の水野です。

ジーニーに入社して6年経ち、当時24歳のぺーぺーでしたが、気づいたら社内でも古株のベテランになりました。
僕がジーニーに入ってからと思ったところをライトに書きたいと思います。

元々僕がジーニーにまず興味を持ったのは、面接で廣瀬取締役が「2年で上場する」といったから。

僕は株が好きで18歳の時からトレードをして色々な会社を市場の中で見てきました。今でこそGoogleやAppleのストア系のゲーム事業社が3-4年で上場するケースはたまに見かけるようになりましたが、その時のジーニーは設立1年半、まだ10名規模程度の会社でした。
こんなに早期から本気で上場を考えて信じているところを見て、このマンションの一室のようなところでどういう人たちがどんなビジネスをしているんだろう、と非常に興味が湧きました。

次に工藤社長の面接だったのですが、その時出されたのがグローバルのアドテクのカオスマップ。

「ジーニーは1-2年以内に海外に展開を進め、いくつかこのグローバルのカオスマップの中でもトッププレイヤーである海外の大手企業と肩を並べるような会社になる」と本気で語っていました。
正直当時は全くイメージがつかなかったですが、実際1年して海外拠点を出し、5年は経ちましたが上場をし、大きな夢を描いたものを一つずつ実現しているなぁ、としみじみ思います。


気付いたら全社で250名というところまで来ました。
入社したときには全くイメージが沸かなかったようなたくさんの仲間と素晴らしいオフィスに囲まれていています。
(たくさんお花も頂きました、ありがとうございます!)

ただ、ジーニーとしてはまだまだ志半ばです。
会社が大きくなるたびに色々なことが起こっていろんな人が入ってきて、年を重ねるたびにどんどん濃厚になっていくジーニーに、大きな感謝と期待を込めて、、、2018年はどんな1年にできるのか、今から楽しみです!

Date
Author
社風やジーニーでの働き方などをご紹介していきます。 ジーニー人事チーム

はじめに

こんにちは、R&D本部アドプラットフォーム開発部の村岡です。

九州工業大学の先端情報工学専攻を予定通り修了してジーニーに17卒入社し、現在は主にGenieeSSPの開発を行っています。

以前こちらの記事を書きましたが、今回もMySQL関連の記事となります。

GenieeSSPについて

GenieeSSPは、広告配信のレスポンスタイムを短くするために、数十万の広告枠の配信設定をすべてインメモリで保持しています。

全広告枠の配信設定はMySQLに保存されています。配信設定を変更する、つまりDBのデータを変更する方法は、現在の運用では4つあります。

  • 営業担当や、広告運用チームなどが操作画面を使って更新する。
  • 操作画面では対応できない場合などに、エンジニアの運用チームが手作業で更新する。
  • 配信パラメータ最適化のためのバッチが更新する。
  • リリース時などにエンジニアが権限をもらって更新する(平時は更新する権限がない)。

また、GenieeSSPは広告枠単位で配信設定をキャッシュしており、広告枠に紐づく何かしらの情報が変更となった場合は、その広告枠の情報をすべて再取得しキャッシュを更新します。

以上の事情から、GenieeSSP配信サーバが使用するMySQLのテーブルにはトリガーが設定されており、あるテーブルのレコードが変更された場合に、どの広告枠が変更となったか、わかるようになっています。

数十台あるGenieeSSP配信サーバの全てが、全広告枠の配信情報をインメモリキャッシュとして保持しており、各サーバが定期的にrefresh_counterテーブルのカウンターが更新されているか調べるクエリを投げ、どの広告枠を更新すべきか調べています。

GenieeSSPの課題

このようなキャッシュ更新の仕組みでは、ある広告枠の配信設定がひとつだけ変更となった際に、紐づく配信設定全てを再取得しなおさなければならない、という問題があります。 配信サーバが使用するテーブルは60程度あり、一つの広告枠キャッシュを作成するために数百のクエリを投げなければなりません。

このキャッシュ更新の処理が重く、バッチによる大量更新が行われた際には、最悪2時間程度の間、配信設定が配信サーバに反映されないままになってしまう、という深刻な問題がありました。

今回、DBに配信設定が保存されてから、配信サーバに反映されるまで5分以内にする、という目標のもと、GenieeSSPの長年の課題であったこの配信設定反映遅すぎ問題を解決しました。

実装案

設計段階で出た実装案について、各案についてどのように実装しようとしていたか、なぜその案が採用されなかったか、最終的に選ばれた実装案はなぜ採用されたかについて説明します。

実装案を考えるときに重要だったポイントは、

  • テストが行えるような方法であること
  • 既存のテーブルのトリガーを使用しないような方法であること
  • 既存の運用方法で配信設定の反映が行われること

でした。

テストには、GenieeSSPが定期的にJSON形式でファイルに書き出す、全広告枠の配信情報が使えます。 これは、GenieeSSPがクラッシュしたとき、JSONファイルがないと起動に二時間かかってしまうため、JSONから配信情報をロードすることで起動時間を短縮しています。 高速化後の実装と古い実装で、このJSONファイルを出力させ比較すれば容易にテストが行えます。

案1:updated時間を見る

この実装案は、一つの広告枠の情報を取るのに数百のクエリを投げたくないなら、テーブルデータまるごと落としてしまえ、というかなり力技な案です。

まず、前準備として、DBの各テーブルに更新時間を記録するカラムを追加します。カラムの更新時間は自動で更新されるように、以下のように定義します。

---------------------
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
---------------------

GenieeSSPが起動するとき、配信に必要な約60のテーブルデータを全て取得します。 テーブルデータを全てメモリに載せても10GBも使用しないため、今後、データが増えることを考えてもメモリ使用量としては全く問題になりません。

そして、キャッシュした各テーブルデータをもとに広告枠情報を構築するようにします。

キャッシュ更新は、以下のようなクエリを定期的に投げて、各テーブルに追加したupdated_atカラムを見るようにします。

---------------------
SELECT * FROM table WHERE updated_at > "最後のポーリング時刻";
---------------------

updated_atカラムの時刻が、以前更新したときの時刻から更新されていれば、データが変更されたとわかります。 更新されたレコードから、キャッシュの再構築が必要な広告枠だけ、再構築を行うようにします。

この実装案は仕組み自体はとてもシンプルですが、採用されずお蔵入りとなりました。 理由は、テーブルのレコード削除がわからない、という致命的な問題があったためです。

案2:操作画面変更時に配信サーバに通知する

この実装案は、操作画面で配信設定が変更されたら、配信画面側でJSONファイルを生成し、RedisかAerospikeに保存する、という案です。

GenieeSSPは、定期的に保存場所をポーリングし、更新された広告枠についてJSONをダウンロードしデシリアライズしてキャッシュを更新します。

GenieeSSP側の変更はほぼ必要なく、操作画面側でJSONを作る処理を追加する必要があります。

この実装案が没となった理由は、操作画面以外からDBを更新された場合に対応できない、操作画面のコードの保守が大変になってしまうためです。

案3:MySQLのBinlogを使う

この実装案は、案1をベースに、DB更新の検知をMySQLが出力するbinary log(binlog)を見るようにする、というものです。

まず、起動時に約60のテーブルデータ全てを、通常のSELECTクエリで取得します。 その後、MySQLサーバにスレーブとして接続し送られてくるbinlogを処理し、インメモリのテーブルデータを更新していきます。 MySQLにクエリを投げるのは起動時のみ、あとは送られてくるbinlogを処理するだけです。

binlogをハンドリングするためのライブラリとして、MySQL Labsで公開されているlibbinlogeventsを使用します。

案1と同様に、更新されたレコードから、キャッシュの再構築が必要な広告枠を計算し、キャッシュの再構築を行うようにします。

この実装案は、experimentalなライブラリであり、社内社外ともに実績があまりないlibbinlogeventsを使用するため、本当にうまくいくのか疑問ではありましたが、以下の点でメリットがあり採用に至りました。

  • 他の案と異なり既存の運用にも対応できること
  • 配信設定の反映時間は最速が狙えること
  • 変更がpushされるため、ポーリングするより効率的
  • 何より純粋にbinlogを使う実装が面白そう

実装

GenieeSSP配信サーバが、experimentalなライブラリを使用してMySQLサーバにスレーブとして接続するのはあまりにもリスキーです。何かあったときに、配信サーバが全滅しかねません。 GenieeSSPは幸いにも、JSONファイルから配信設定をロードする機能があるため、これを利用することにします。

具体的には、MySQLサーバにスレーブとして接続しbinlogを処理、JSONファイルを生成する配信キャッシュ作成サーバを開発します。

DBのレコードが更新されると、以下のような流れで配信設定が反映されるように実装を行います。

現状では、更新されていない広告枠も含む、全ての広告枠情報をJSONに出力しています。 これにより、テストが容易になる、実装が容易になる利点があります。 ただし、配信キャッシュ作成サーバから、JSONを各GenieeSSP配信サーバに転送するときはサイズが大きいため時間がかかってしまいます。

Zstandardで圧縮することでファイルサイズを98%削減できましたが、プロダクション環境ではZstandardが新しすぎるためにパッケージがない・バージョンが古く、自前でビルドしなければならなかったため、一旦LZ4で圧縮しています。 LZ4の方が少し処理時間は長く、ファイルサイズを94%削減できています。

配信キャッシュ作成サーバ

クラスをJSONでシリアライズする部分など、流用できる/流用したいコードが多くあること、libbinlogeventsがC++だったことなどから、配信キャッシュ作成サーバもC++17で開発しました。

LL言語のほうが良いんじゃないか、とも言われましたが、

  • libbinlogeventsのバインディングを書くことがめんどくさい
  • 大量にメモリを使うのでマークスイープ系のGC走ると止まる時間長そう
  • シリアライズ部分とか並列化したいけどプロセス並列やりたくない
  • そもそも速度が最重要なのでC++でいいじゃん

という理由でC++です。 個人的にはRustを使いたかった気持ちもありますが、Rustは別の仕事や趣味で使うことにします。

処理フロー

約60あるテーブルデータを保持するクラスを手で書くのは流石に大変なので(一度手で書こうとして止められた)、コードジェネレータを作りました(後述)。

GenieeSSPから流用したコードは”広告枠の情報を再構築、再シリアライズ”する部分となります。 当然ですが、GenieeSSPが投げていたSQLクエリは流用できないので、全てC++で書き直して実装しました。

C++で書き直したので何をしているのかわかりづらい…と思うかもしれませんが、元のSQLクエリが既に意味不明な部分も多かったため、全体としてそれほど読みにくくなってはいないように思います…が、SQLクエリのままのほうがやはり簡潔で良いと思います。

コードの生成

キャッシュ生成に必要なテーブルのテーブル名、及び、必要なカラム名などを記述したJSONファイルをもとに、MySQLサーバにSHOW CREATE TABLEクエリを投げてカラムの型情報、カラムインデックスなどを取得し、C++のコードを生成するコードジェネレータが必要となり作りました。

コードジェネレータを作ることで、あとからデバッグのための関数追加、コードの修正などが容易に行えるようになり開発がスムーズに進みます。

また、binlogからカラムデータ取得、MySQLにクエリを投げてデータを取得するコードは、JSONファイルにテーブル名、カラム名を追加しコードジェネレータを叩くだけで全て生成されるため、メンテナンスも容易になります。

今回はJinja2テンプレートエンジンを使いましたが、扱いやすく、テンプレート中で制御構文など使えて簡潔にテンプレートを書くことができました。

binlogのハンドリング

大真面目に実装していけばMySQLが作れます。

今回はその必要はないので、以下のイベントのみハンドリングします。

  • TABLE_MAP_EVENT
  • XID_EVENT
  • UPDATE_ROWS_EVENT
  • WRITE_ROWS_EVENT
  • DELETE_ROWS_EVENT

TABLE_MAP_EVENTは、ROWベースのbinlogにおいて、全ての行操作イベントの前に表定義とその後のイベントの値をマップするイベントです。 このイベントを見ることで、DB名、テーブル名、カラム定義などがわかります。

XID_EVENTは、テーブルの変更をするトランザクション処理がCOMMITされると発生するイベントです。 このイベントを見て、中途半端なところでbinlogを処理しないようにする必要があります。

UPDATE_ROWS_EVENTWRITE_ROWS_EVENTDELETE_ROWS_EVENTはそれぞれ、レコードがUPDATEINSERTDELETE時に発生するイベントです。

おそらく、QUERY_EVENTをハンドリングすることでテーブルのALTERなどもわかるはずですが、試したことはないです。 配信キャッシュ作成サーバでは、テーブルをALTERするときは新しいテーブル定義を使ってコード生成しなおし、再リリースすることにしています。 テーブルのALTERはめったに行わないため、この運用で問題ありません。

スレーブとしてMySQLサーバに接続したあと、binlogのポジションを設定する必要があります。 binlogポジションはSHOW MASTER STATUSコマンドを投げることでわかります。 SELECTクエリでテーブルデータを取得したあとは、binlogによる更新となるのでbinlogポジションはちゃんと設定してあげなければデータの整合性がとれなくなります。

今回は、MySQLサーバにSTOP SLAVEして、テーブルデータとbinlogポジションを取得、MySQLサーバにスレーブとして接続してからSTART SLAVEするようにしています。 そのため、配信キャッシュ作成サーバ専用のMySQLサーバを動かしています。

libbinlogevents ver1.0.2を使用しましたが、このライブラリには重大な問題があります。 それは、

  • Decimal型のカラムの値を正しく取得できないこと
  • DateTime型のカラムの値を正しく取得できないことがあること

です。

これらの問題は、libbinlogeventsにそれらのデータを処理するコードがないことが原因です。 この問題を修正するには、MySQLのソースコードを漁って、MySQLがbinaryフォーマットからdoubleDateTimeに変換している部分のコードを移植してやる必要があります。

どちらもすぐに処理を行っているコードは見つかります。 MySQL本体とべったり書かれているわけではないので、移植もわりとやりやすいと思います。

特にDecimalについては、内部でどういう風に扱われているのか全く知らなかったため、MySQLのソースコードとコメントを読むのは楽しかったです。

テスト

テスト環境に配信キャッシュ作成サーバ専用のMySQLサーバを置きます。 このサーバは本番サーバとレプリケーションするようにしておき、このMySQLサーバに古いGenieeSSPと配信キャッシュ作成サーバを接続し、一定時間ごとにレプリケーションを止めて、生成されたJSONを比較します。

JSONの比較のためのツールをPythonで書きましたが、やたらとメモリ食いで40〜50GB程度使っていました。 しかもGCが走ると数十秒平気で止まるので、なかなかテストが進みません…仕方ないですね。

2〜3週間程度、自動でテストが動くようにして、毎日差分をチェック、問題があれば調べて修正を繰り返しました。

最後の一週間は問題のある差は出なかったため、プロダクション環境に一台だけリリースして一週間程度様子を見てから全台リリースを行いました。

リリース後

配信設定反映まで、最悪2時間かかっていましたがリリース後は約3分程度となっています。 3分の内訳は、

  • Binlog処理・JSONシリアライズ…1秒
  • 全広告枠分のJSONをRamdiskに書き出し…5秒
  • LZ4で圧縮…30秒
  • 転送…30秒
  • 配信サーバのJSONロード…平時10秒程度
  • 残りは、ファイルの転送はcronで毎分行われているためそのディレイと、配信サーバが新しいJSONファイルを見つけるまでのディレイ

となっています。

binlog周りで問題が発生しても、MySQLに通常のクエリを投げてテーブルデータを全件取得するのにかかる時間は1分程度なので、毎回全件取得で更新できるようにもしています。 この場合は更新に少し時間がかかるようになりますが、5分以内更新は達成できます。

上図はリリース後のMySQLサーバの負荷です。データの転送量、CPU負荷が格段に下がっています。

MySQL Enterprise Monitorで見られる、受け付けたクエリの統計です。 リリース後は、赤線のSELECTクエリが圧倒的に減っています。

上図は配信キャッシュ作成サーバの負荷です。配信キャッシュ作成サーバのCPU負荷は高くありません。 定期的に走るバッチによる大量更新でもそれほど負荷は上がらず、更新できています。

ただし、テーブルの全データに加え、数十万の広告枠のシリアライズ済みのJSONデータを保持しているため、メモリ使用量は多く25GB程度使っています。 25GBに、数GBのJSONファイルをRamdiskに保存するため、場合によってはメモリ64GBのサーバでもカツカツだったりします。

ネットワーク帯域もかなり消費していますが、これは今後、差分更新の仕組みなどを入れることでかなり改善すると思われます。

おわりに

9月頃に設計を開始し、libbinlogeventsが使えるかの検証、コーディング、テスト、ドキュメントなども書いたりしていたら、リリースが12月になってしまいました。

とりあえずリリースしてから、二週間経っていますが、大きな障害は起きておらず快調に動いています。

お客様等からの声はまだほとんど届いていないのでわかりませんが、今後開発を行っていき、広告配信のパラメータを高頻度に更新していける環境ができあがったと思っています。 今まで、この性能の問題から更新頻度が低く抑えられていたものなど頻度を上げてパラメータを最適化していければ、メディア様の収益もあげていけるでしょう。

とりあえず、二ヶ月程度様子を見て、テーブルのトリガー削除や、旧GenieeSSPの不要コードの完全削除などを行う予定です。 その後は、差分更新の仕組みを入れてより高速に配信設定を反映できるようにしていきたいと思っています。

正直、タイトルの”binlogを使って”は高速化のキモではなく、MySQLにクエリを投げる回数を減らしてC++で処理するようになったら速くなった、という感じではあります。 ただ、MySQLのbinlogを使う、という経験はなかなかないと思うので、これはこれで楽しい経験と思っています。

libbinlogeventsを使う上で、以下の2つの記事には大変助けられました。この場を借りてお礼申し上げます。ありがとうございました。

qiita.com


www.slideshare.net

また、開発時、リリース時、モニタリングの仕組み構築など私のメンターの伊藤さんには大変助けて頂きました。この場を借りてお礼申し上げます。ありがとうございました。

Date
Author
エンジニアの視点から、様々な技術、サービス開発秘話、イベントをご紹介していきます。 ジーニーエンジニアチーム

こんにちは、人事の見並です。前職で6年システム開発の現場に携わり、現職ではキャリアチェンジをして4年人事をしています。今回は、ジーニーのエンジニアが登壇した勉強会を2つレポートします。

はじめに

勉強会のレポートをする前に、ジーニーの事業全体を簡単にご紹介いたします。

ジーニーの事業全体図

アド・プラットフォーム事業

創業から事業の根幹を作っていったのが、広告配信を行っているアド・プラットフォーム事業です。1秒間に数十万回ものリクエストをリアルタイムに捌き、最適な広告配信を実現しています。

マーケティングオートメーション事業

マーケティングオートメーション事業は昨年度から開始した新規事業です。多様化するマーケティング活動を最適な形で自動化し、データドリブンな取り組みを実現させるためのプラットフォームを目指しています。

これらの両プロダクトをインフラからアプリケーションレイヤーまで、60名以上のエンジニアが内製で構築しています。

アド・プラットフォーム事業の登壇レポート

LINE社が定期的に開催している技術者向けミートアップ「LINE Developer Meetup」へ、CTOの篠塚が登壇しました。「広告技術」をテーマとした回に、Supership社やLINE社の方々と共に、アドテクノロジー領域でのコアな取り組みを発表しました。

篠塚は「世界分散配信システムとレポーティングシステム刷新のお話」と題し、一度大きな作り直しを経験した後、現在はアジアを中心に国内外で大規模なトラフィックを捌くまでに成長したGenieeSSPのアーキテクチャ>やその変遷、直近取り組んでいるチャレンジなどをお話ししました。


海外に置いているサーバとの通信やレプリケーションの実現方法、事業の急拡大に伴う技術課題へ取り組んだ事例などに対して質問も多くいただきました。

マーケティングオートメーション事業の登壇レポート

オプト社にて開催された「マーケティング事業の開発現場でリアルに使われるJS事情」と題した勉強会にて、マーケティングオートメーション開発部の若手エンジニア2名が登壇しました。

近年活用が広がっているAngular.js , Vue.jsといったJavaScriptフレームワークの実際の活用事例を発表する形で、ウィルゲート社やオプト社の方々と登壇させていただきました。

「MAJINを支えるフロントエンド技術」というタイトルで、MAJINのアプリケーション開発で活用をしているVue.jsの開発事例を発表しました。

現在のアーキテクチャ>に至るまでの変遷や背景、選定理由など開発現場で様々な課題に直面したエンジニアとしてのナレッジを共有できたように思います。


今後も積極的に発表いたします!

社内で取り組んできた事例や新しく取り入れた技術など、今後も積極的に発表する機会を作っていきたいと考えていますので、ぜひ共同開催などお声がけいただけると嬉しいです!

Date
Author
エンジニアの視点から、様々な技術、サービス開発秘話、イベントをご紹介していきます。 ジーニーエンジニアチーム
Back to top