Mercari Engineering Blog

We're the software engineers behind Mercari. Check out our blog to see the tech that powers our marketplace.

PHPStanで始めるPHPのための静的解析 #phperkaigi

こんにちは。最近メルペイに異動になった @hiraku です。

2018年3月10日(土)に、PHPerKaigi 2018というイベントで登壇してきました。「PHPStanで始める継続的静的解析」ということで、メルカリで使用しているPHPStanというツールについて解説しました。

phperkaigi.jp

発表内容を短くまとめると

  • メルカリではPHPStanというツールをCIフローに組み込み、PHPコードの静的解析を行ってコードの信頼性向上に努めています。
  • PHPStanはautoloadファイルを解釈し、一部のコードを実行することで解析の高速化を行っており、よくできています。
  • とはいえ、PHPに対して可能な解析に限界はあるので、テストも合わせて行っていきましょう。
    • 大事なのは、品質向上のアプローチが用意され、心配せずにリリースできることです。

autoloadを認識するということ

スライドの中でも触れていますが、"静的"解析ツールにもかかわらずautoloadを解釈するという機能はかなり画期的です。 autoloadを使わずに静的解析をしようとすると、おそらく全部のプロジェクトファイルを読み込まない限り解析ができません。単発で「src/A/B/C.phpだけチェックしたい」というときもsrc配下とvendor配下全部のファイルを読み込むことになり、非常に時間がかかります。

autoloadベースで読み込むと、不要なファイルは読み込まなくなるため、解析速度が向上します。ちょうど、Makefileが依存関係を辿って、必要な部分だけビルドするようなイメージに近くなります。(Phanというツールはautoloadを解釈しませんが、プロセスを常駐する機能があり、そこで高速化を図っているようです)

プロジェクトがcomposerベースでなくても、独自のオートローダーを書いて読み込ませてもいいですし、何なら全PHPソースをrequire_onceしているファイルを一個作ってオートローダーとして読み込ませても構いません。 設定の柔軟さという意味でも、autoloadは素晴らしいと思います。

続きを読む

CREチーム始めました

こんにちは!メルカリでサーバーサイドエンジニアをしている @bravewoodと申します。 このPostでは、最近できた「CREチーム」について紹介します。

CREとは

CREはCustomer Reliability Engineering(顧客信頼性エンジニアリング)の略で、Googleが提唱した専門職です。

メルカリには従来CXI(Customer Experience Improvement:顧客体験改善)と呼ばれるチームがあり、このチームが、お客さまからのお問い合わせなどを通した顧客体験を改善するという業務を行ってきました。

新たにできたCREチームは、このCXIチームを内包し、「負の顧客体験の解消」という意味だけではなく、「顧客の信頼性向上」という部分にも着目した様々な活動を行う新たな専門チームとなります。

これは例えるなら、メルカリのSREチームがサイトの信頼性にフォーカスするという形で従来インフラチームという名前から発展を遂げた事例と似たような視点であると考えることができます。

f:id:bravewood:20180221145311p:plain

CREチームの意義

最近は報道等でメルカリが取り上げられることも増え、メルカリの社会に対する影響は益々高まっています。 メルカリがこのように皆様に広くご認識いただいた理由の一つは、やはり、「安心・安全」な取引が手軽に行えるということだと思っておりますが、これを支えているのはメルカリのカスタマーサポートチームです。

カスタマーサポートチームが日々業務に使う「CSツール」と呼ばれる内製ツールはメルカリのアプリに合わせて様々なサポート業務が行えるように作られております。メルカリを使っていてわからないことやトラブルになった場合にはお客さまがアプリ内からお問い合わせを行います。するとCSツール上にはお問い合わせの内容とお問い合わせの種類に基づいた付随する情報が画面に表示され、これをもとにカスタマーサポートチームが素早く正確にお問い合わせへの返信や場合によっては返金なども含めた対応を行うことができます。

CREチームの前身であるCXIチームは、このCSツールを改善するというのが主なミッションでした。

一方で、アプリ本体の改善は別チームが担当しており、お客さまがアプリに対して感じた「わかりにくい」、「使いにくい」、「トラブルがあった」など負の顧客体験部分を解消するためのアプリの修正はCXIチームで見ておらず、あくまで、CSツールの改善によってお客さまのお問い合わせを通した顧客体験を改善するという限定された範囲しでしか影響を与えることができませんでした。

真の意味で「安心・安全」な取引を実現し、お客さまにメルカリというサービスを「信頼」していただくためには、「そもそもお問い合わせが発生しない」ような、アプリの使いやすさの改善であったり、トラブルなどにつながる商品を自動発見しマーケットを健全化するためのモニタリングツールの開発など、CSツールの改善以外のアプローチも重要になってきます。これら両面からのアプローチを包括的に行う専門チームが必要との認識から、われわれは新たにCREチームを設立し、今後の重要な領域として運営していきます。

Tech Talkを開催します

われわれCREチームが行っている各種施策については、AIやMicroservicesなどの新しい分野も積極的に取り入れて行っています。 もし、これらの技術的なお話も含め、新しいCREチームがどのようなものか聞いてみたいという方がいらっしゃれば、是非とも3/22(木)にメルカリ六本木オフィスで行われるTech Talkイベントへお越しください!

mercari.connpass.com

pvpool〜メルカリの商品閲覧数カウントアップの裏側〜

SREチームの@cubicdaiyaです。今回はメルカリの商品閲覧数カウントアップの裏側について紹介します。

f:id:cubicdaiya:20180226144601p:plain

メルカリの商品閲覧数

メルカリでは出品されている商品の閲覧数を「出品した商品」の一覧や「いいね!した商品」の一覧画面から見ることができます。以下は「いいね!した商品」の一覧画面です。(開発版アプリの画面になります)

f:id:cubicdaiya:20180222150303p:plain

赤い枠で囲まれている部分がそれぞれの商品の閲覧数になります。今回紹介する閲覧数のカウントアップのバックエンドはGoで開発されています。

データベース上の商品閲覧数のカウントアップ

メルカリでは日々大量のリクエストを処理していますが、そういった中でもデータベースへのアクセスはINSERTやUPDATE等の書き込み処理よりもSELECTによる読み込み処理が圧倒的多数を占めます。(メルカリでは、データベースには主にMySQLを利用していますが、サービスやリージョンによってはGCPが提供しているCloud DatastoreCloud Spannerを利用している箇所もあります)

商品が閲覧される時に実行される処理もロギング等の処理を除けば基本的に読み込み処理のみになります。しかし、商品の閲覧数を都度インクリメントする必要があるとなると話は変わります。商品閲覧リクエストは全リクエストの中でも結構な比率を占めるので、単純にそれらすべての商品閲覧リクエストを処理する度に閲覧数をインクリメントしようとすると、データベースに非常に大きな負荷がかかってしまいます。そのため非同期処理は必須と言えます。

加えて、商品閲覧数のカウントアップには以下のような性能上の要件があります。

  1. 出来る限り低遅延で応答できるAPIを提供する(目安:数ミリ秒以内)
  2. 出来る限りリアルタイムに閲覧数を最新の状態に反映する(目安:数秒以内)

こういった事情から商品閲覧数のカウントアップの仕組みはPHPで書かれたメインのコードベースから切り離された別の内部サービスとして開発されることになりました。この仕組みは社内ではpvpoolと呼ばれています。

続きを読む

try! Swift Tokyo 2018にメルカリとソウゾウから3名がLTで発表! 当日はブースでも弊社エンジニアとお話しましょう! #tryswiftconf

try! Swift Tokyo 2018

プログラミング言語Swiftに関するコミュニティ主催のカンファレンス、try! Swift Tokyo 2018が3月1日〜3日に開催されます。ベストプラクティス、アプリケーション開発、サーバーサイドSwift、オープンソースSwiftなど、Swiftに関連する発表が中心のカンファレンスです。 メルカリはプラチナスポンサーとしてtry! Swift Tokyo 2018を応援します!

www.tryswift.co

発表内容

メルカリとソウゾウから3名がLTで発表します。発表内容を紹介します。

  • @kitasuke: SIL入門

    Swiftのコンパイラは複数のフェーズにわけて実行され、そのうちもっとも大きなものが SIL (Swift Intermediate Language) の最適化です。SIL Optimizer はSwift特有のすべての最適化を担うので、SwiftのエンジニアがSILを理解しておくことは極めて重要だと考えます。このトークでは、SILの基礎を簡単な例を用いて説明します。

  • @orakaro: 変性のダイヤモンド

    ジェネリクスはSwift言語における悩みの種となっている面白いトピックです。Generics Manifesto では、Swift の型システムが定義よりも実践に重きを置いて作られたかについて素晴らしい説明がされています。ですが、「変性のダイヤモンド」という理論では、型システムの完全性とSwiftのジェネリクスがいかにこの理論にフィットしているかを別の視点で見ることができます。 このトークでは、Swiftにおける変性、共変性、反変性と、ダイヤモンドの上に輝く、Phantom Type について説明します。

  • @tarunon: 型とパフォーマンスで見るType-erasureの利点

    2016年のtry! Swiftで紹介されてから誰もが知るところとなったType-erasure、これを採用するメリットを型とパフォーマンスの面から紐解きます。また、stdlibのAnySequenceの実装をヒントに、効率が良くパワフルなType-erasureの実装を探っていきましょう。

メルカリとソウゾウのエンジニアがSwiftに役立つ内容を話しますので楽しみにしてください!

ブース

当日はメルカリブースを出展します!メルカリブースにはメルカリ、ソウゾウ、メルペイのiOSエンジニアがいるのでぜひ技術の話をしましょう。お待ちしています!