「LINE DEVELOPER DAY 2019 Day1」に参加してきました

  • LINE DEVELOPER DAY 2019に参加してきました。

linedevday.linecorp.com

  • セッションの資料はこちらに随時公開されるとのこと

speakerdeck.com

  • 今回はDay1の午後だけ参加してきました
  • 以下セッションのメモです

Inside of Blog; 15年熟成されたサービスの光と影、カオスとレガシーへの挑戦

  • 大森 貴博さん

livedoor Blog

  • 構成
    • LAMP
    • 30近くのサブシステム
  • 15年での蓄積
    • Developper
      • 70+
    • サーバ
      • 750+
      • 200がDB
    • DBテーブル数
      • 550+
    • ファイル数
      • 43500+
    • プログラムファイル数
    • コードの行数
      • 410000+
  • 今動いているブロジェクト

カオスとレガシー

ドキュメントがない

  • セットアップ方法がわからない
  • デプロイ方法がわからない
  • 普段触ってないサブシステムだと特に

開発サーバがない

  • 誰からも忘れられていて安定して動いたサブシステム
    • それに手を入れようとしたら環境がない
  • 開発サーバはあるか?
  • 正常に動いているか?
  • 本番との差分がないか?
  • 本番のデータを使っていないか?

テストがない

DNSレコードが多すぎる

  • 300レコード以上
    • ユーザが設定してる独自ドメインとかは入ってない
    • 調査したら230が不要だった
    • 古い機能とか過去のキャンペーンでの残骸
    • 整理して削除するだけで数ヶ月

機能が多すぎる

  • 目に見えるもの見えないものたくさん削除してる

Perl

  • Perlのバージョンがとても古い
    • 5.6(2002年)
    • ローンチしてから変えてない
  • 新しいバージョンのPerlも一部使ってる
    • バージョンが混在している
    • 環境など全て2倍必要

MySQL

  • MySQLのバージョンが古すぎる
    • 4.0(2003年)
    • ローンチしてから変えてない
  • 4.0でできないこと
    • Online DDL
    • Fast Index Creation
    • Trigger
    • => オンラインでalter tableできない
      • テーブルコピーしてデータ移行して、、と無理やり頑張った(数ヶ月かかる)
      • データが2倍だからディスク容量が逼迫
  • バージョンを上げないのか?
    • サーバマイグレーションのタイミングで考えた
    • ブログの特殊な事情と時間的制約で断念
      • 1つのテーブルに複数文字コードが混ざってる
      • そのせいで正攻法でのバージョンアップができない

LINE BLOG

  • LINEとの連携が強い
  • 2014年リリース
  • 2016年リニューアル
    • 一般公開
    • 独立したサービスに
      • livedoor Blogをフォークした
      • livedoor Blogのカオスとレガシーも引き継いだ
      • => LINEのエンジニアが本気出して数々の問題を解決

Next 15 Yeras

  • 15年後を考えて開発していくことが大切
  • 小さなことからでも始めること
    • コメント一行書くだけでも
    • 不要なファイルを削除しておくだけでも

LINE NEWSの記事配信を支える技術

  • 稲葉 大樹さん

LINE News

  • 2013年開始
  • 2017年からLINEのタブに加わった
  • ニュース以外に運行情報や地震速報なども
  • 月間680万ユーザ
  • インフラ
    • Amon2(Perl) 44台
    • Spring Boot(Java) 30台
  • DB

Personalized Recommendation

  • 多大な記事数ユーザ数をもとに記事をレコメンドしている
  • ML + Manual(運営の手動)
  • 表示対象かつ表示期間中のものがユーザに表示される

MLによるレコメンド

  • 社内のMLチームで生成されたものをもとにレコメンド
    • 1億人超えのデータが入っている
    • ユーザ一人に付き200件の記事を選んでる

手動によるレコメンド

  • 運営チームがCMS上で設定
  • 属性に応じてどの記事を表示するか選ぶ
    • どの媒体をフォローしてるかとかも属性として選べる

MLのレコメンドだけを使っていた時代

  • CDNを活用して記事を取得していた

    • レコメンドを取り入れると属性が必要なのでCDN活用できなくなった
  • ユーザからの記事取得リクエストの流れ

    • Redisにレコメンドした記事を事前に入れておく
    • ユーザから記事取得のリクエストが来るとRedisから取得する
    • 取得した記事をキャッシュに保存しておく
    • 次からはキャッシュにあればそこから、なければMySQLから取得する

ML + Manualでレコメンドしていた時代

  • Central Dogma
    • jsonとかyamlの設定ファイルを管理する
    • 変更をwatchすることができる
  • Datalakeから対象ユーザのIDを取得してCMSにアップロード
  • 記事IDとユーザのマッピングをRedisにあげる
  • Central Dogmaに記事の情報をあげる
  • 課題
    • 記事とユーザのマッピングデータの形式の影響でスケーラビリティがない
    • パフォーマンス

今後

  • 今はユーザからのレスポンスが反映されるまで1時間かかったる
    • リアルタイムに反映させたい
    • 今ABテストで一部のユーザに適用
  • レコメンド適用範囲の拡大
    • ダイジェストは今全員同じものを出してる

コミュニケーションアプリ「LINE」の機能改善を支えるデータサイエンス

  • 高口 太朗さん

LINE App Improvement Project

  • Uesrs First
  • Data Driven
  • Diverse Team
  • In-houes Developmemt

データサイエンスチーム

  • Data Science And Engineering Center
    • Data Labs
      • Data Science Team
  • Data Science Team
    • LIENマンガ
    • LINEトップ
    • LINE Pay
    • LINE ad

プロジェクトのサイクル

  • ユーザリサーチ -> 計画 -> 開発 -> テスト -> フィードバック -> 計画 -> ...

ユーザリサーチ

  • Focused Interview
  • Online Suvey
  • Dashboard Monitoring
  • 定量と定性を組み合わせる

計画/開発

  • 計画
    • どうデータではかれば良いか考える
  • 開発
    • どのようなログを集めればよいか定義など

テスト/フィードバック

  • テスト
    • オンラインでのABテスト
    • 2018~で20回以上者ABテストをやってきてる

LINEアプリ改善の取り組み

  • LINEアプリならでは
    • ユーザが多い
    • 使い方もさまざま
  • LINEアプリを評価する単独のKPIが存在しない
    • メッセンジャーは無料の機能
    • すでに多くのユーザを獲得してるからユーザ数xx増加とかもやりづらい
  • LINEのコアバリュー
    • LINEのミッション
      • Closing the Distance
    • メッセンジャーアプリにあてはめると
      • 身近な友達と簡単にやりとりできること
    • そのために改善すべき機能を考える
  • 友達ネットワークを分析
    • 社会的なネットワークが反映されている
    • グループ機能の改善がターゲットに

グループ機能の改善

  • ユーザリサーチ
    • グループ作成の手順がわかりづらい
    • 当初
      • グループ名やアイコン決めてからメンバー選択
      • 急にグループ名聞かれても困るのでは
  • 計画
    • グループ名選択よりも前にメンバー選択を持ってくる
  • ABテスト
    • 入れ替えてもグループ作成成功率は変わらなかった
  • フィードバック
    • どこに目をつけるか
      • 成功したユーザに着目?
      • 失敗したユーザに着目?
      • 時間帯に着目?
      • 地域に着目?
    • グループ名アイコンを選ぶ画面まで進んでない人が多い
      • スムーズにメンバーを選べていない
      • テスト期間中に複数回失敗したユーザ30%程度
  • 計画
    • 最近トークした友達を上に持ってくる
    • グループ名アイコンとメンバー選択を一画面で
  • ABテスト
    • 2種類×2の4通りテスト
      • 比較のパターンが多いので偶然の差異を拾ってしまう可能性がある
      • 組み合わせの一つを諦めて3パターンを検証
  • フィードバック
    • 大きな差はでなかった
    • グループ作成までにかかる時間が短くなってれば成功なのでは?
      • 最近トークした友達を上に持ってくると短縮されていた
    • 1画面にした結果はネガティブ
      • メンバー1人でグループ作成が増えた
      • メンバー2人以上だけをみると作成成功率低下
    • 2画面のままで最近トークした友達を上に持っていくのを採用

データサイエンスツール

  • 分析の環境とツールによってこれらの改善は支えられている
  • ABテストするためには
    • 必要なサンプルサイズの選定
    • テストユーザ選定
      • LIBRA
    • モニタリングダッシュボード
      • LIBRA REPORT
        • GitHubを通じて集計に必要なクエリを登録
        • ブラウザベースのダッシュボードに出力してくれる
      • R Shiny
        • より高頻度でチェックしたい
    • テスト結果のレポート

XXE、SSRF、安全でないデシリアライゼーション入門

  • 徳丸浩さん

XXE

  • XML外部実体参照
  • 外部実体参照
    • XMLはentityを定義して参照することができる
  • 攻撃の例
    • SYSTEM /etc/hostsとか指定すると内容がとれてしまう
    • URLを指定するとその内容が読み込まれてXMLに展開される
      • SSRF(Server Side Request Forgery)
  • 原因
    • XMLのもともと保つ機能
  • 対策
    • XMLを使わずJSONを使う
    • XMLを使わなければいけない場合はどうする?
      • Javaの場合DTD(Document Type Definition)を禁止する
      • PHPだと外部実体参照を停止する設定になっている
      • RailsではREXMLを使う
        • nokogiriだとNOENTオプションを設定しない

SSRF

  • Server Side Request Forgery
  • 攻撃イメージ
    • 直接アクセス不可の内部サーバがある
    • 公開サーバを通して内部サーバにアクセスを許可している
    • 公開サーバを踏み台にして内部サーバにアクセスすること
  • 攻撃の例
    • プレビュー機能でのSSRF攻撃
    • http://169.254.169.254にアクセスするとEC2のインスタンス情報をとれる
    • このURLをプレビューするとSecretAccessKeyなどとれてしまう
    • EC2インスタンスを踏み台にしてクレデンシャルな情報にアクセスできてしまう
  • 原因
  • 事例
    • Capital Oneの例はSSRFだった
    • WAFの設定ミスによるもの
    • HostヘッダにEC2インスタンスを指定することによる攻撃
    • WAFの権限がS3へのアクセスなど広く与えられすぎていた
  • 対策
    • ホスト名がIPアドレスであることをチェックするだけではダメ
      • リダイレクトされてしまうなどさまざまなケースが有る
    • ネットワーク的にチェックする
      • 許可されたURLかどうかチェックする

安全でないデシリアライゼーション

  • シリアライズ
    • バイト列に変換してオブジェクトに格納できるようにする
  • 外部から来たシリアライズデータをデシリアライズするとどんなオブジェクトでも作れてしまう
    • メソッドをいじったりとかはできない
      • プロパティを工夫するといろいろできてしまう
  • 対策
    • シリアライズ形式でなくJSONを使う
    • クッキーやhiddenパラメータではなくセッション変数を使う

LINEのメッセージングプラットフォームにおけるマイクロサービス化への長い道のり

  • 井出 真広さん

LINE Messaging Platform

  • 2011年ローンチ当初はモノリシックだった
    • talk-server/redis/msql
    • 1つのチーム/1つのサーバでうまくいっていた
    • どんな機能を追加していくか同じ方向を向いてできていた
  • 追加したい機能がたくさん増えてきてチーム全体で調整する必要がでてきた
    • 速度を持って進められなくなってきた
    • チームを分割してサービスを分けるようにしていった
    • チーム単位でそれぞれコントロールできるようになった
    • スタンプ/メッセージング/認証/...
  • 現在は多くのサービスが連携し合いながら動いている
    • チームごとにやりたいことにフォーカスしながら開発している
  • マイクロサービス化して
    • よかったこと
      • コンフリクトが少なくなった
    • よくなかったこと
      • ネットワークレイテンシ
      • 障害

マイクロサービスを構築するためのツール

  • Coneectivity
  • Directory Service
  • Routing

Coneectivity

  • Armeria
  • 非同期なRPC/RESTライブラリ
  • Java/Netty/HTTP2
  • ロギングや分散トレーシングの仕組み
  • 障害を伝播させないためのサーキットブレーカーの仕組み

Directory Service

  • Central Dogma
  • サービス間で設定を共有したい
  • 通信先のサービスがどこにあるのか把握したい
  • どのホストが度のサービスを配信しているか
  • gitをバックエンドとしたバージョン管理の仕組み
    • どの時点でどの設定だったか管理

Routing

事例

  • スタンプが普及してきた
  • 1ユーザで万単位で持っている人もでてきた
  • スタンプを購入するたびにRedisにスタンプの所有情報を再構築していた
    • その時にスロークエリが発生して一瞬talk-serverが止まる
    • talk-serverにはいろんな場所からリクエストがくる
    • メッセージングプラットフォーム全体の障害となりかねない
  • どこかが一瞬とまるようなことがあっても波及しない構成に再構築
    • サーキットブレーカーなどの仕組みをいれる
    • レイテンシを悪化させないように
    • スケール