Mercari Engineering Blog

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

Mercari BOLD Scholarship をはじめる話

f:id:ikkou:20171220165404j:plain

この記事は Mercari Advent Calendar 2017 20日目の記事です。昨日は @_hitima の「Mercari Web版 に Workbox で Service Worker を導入する話」でした。本日は研究開発組織の @ikkou が Mercari BOLD Internship に続く新しい企画 Mercari BOLD Scholarship をはじめる話をします。

メルカリにジョインするきっかけとなった xR(VR/AR/MR) のことや、研究開発組織については、この記事が公開される翌々日に メルカリ新研究開発組織オープニングイベント が開催されるので、そこから段々と明らかにしていく予定です。

続きを読む

Mercari Web版 に Workbox で Service Worker を導入する話

Mercari Advent Calendar 2017 19日目は フロントエンドチームの @_hitima が JP Web版 にてサイトのオフライン対応を検証している話をします。

メルカリのWeb版強化への道

メルカリは iOS と Android のアプリ版のほかに Web ブラウザから利用可能な Web 版があります。アプリ版と機能面で差はあるものの、購入から出品まで一通りのことはできるようになっています。本エントリではWeb版の強化施策として現在進行中の Service Worker 導入について解説します。

Facebook のザッカーバーグ CEO はかつてこのような事を言いました。

When I’m introspective about the last few years I think the biggest mistake that we made, as a company, is betting too much on HTML5 as opposed to native… because it just wasn’t there.

iOS 向けのアプリを HTML5 ベースにしたのは失敗だったと。もう5年以上も前の話ですね。

Facebook のこの有名な話は、パフォーマンスが起因する話が主だったと思いますが、Service Worker , App Shell Model , PRPL Pettern などを駆使した Google 提唱する Progressive Web Apps と言う HTML / JS / CSS だけでほぼ構成された新しいスタンダードが台頭してきていて、そのほとんどが今、解決されようとしています。

PWA とよく呼称されますね。 主にモバイルユーザーの体験向上を目指す技術の集合体を指す名前だと私は理解しています。(マーケティング用語だと言う方もいます)

弊社会長の山田も、Twitter でこのようなことをつぶやいております。

f:id:h1tima:20171217224744p:plain

PWA のような比較的新しい構成の技術スタックが必要になってくることもあり、今回はサイトのオフライン対応を検証して、お客さまにオフラインでもメルカリを楽しんでいただくべく、導入検討してみることにしました。

続きを読む

デッドロックおじさん戦記

Mercari Advent Calendar 2017 の18日目です。

こんにちは。メルカリJPのサーバーサイドエンジニアの@Hirakuです。最近はメルカリNOWの立ち上げに関わっておりGoとPHPを行ったり来たりしています。

今回はネタとしては地味ですが、2017年に遭遇した、MySQLのデッドロックの話をしようと思います。 これまでも何度か話されている通り、メルカリのコア部分は今でもPHP + MySQLで構成されており、複雑なトランザクションを含む処理が各所に存在しています。そのため、意図せずしてデッドロックを作ってしまうことがあり、場合によっては重大な問題につながります。

今年は本当にデッドロックに関するトラブルに多く遭遇し、すっかり「デッドロック絶対に許さないおじさん」みたいになっていました。

事例1)出品者と購入者

デッドロックと言われてもピンと来ない方もいらっしゃるでしょう。 まずは小手調べです。

メルカリはC2Cのフリマアプリですので、お客さまは出品も購入もできます。 ここで、あるAPIの中に、

「(1)出品者の情報を更新し、(2)購入者の情報を更新する」

という処理が書かれていたとしたらどうでしょうか? もちろん、処理は1トランザクションの中で行われます。以下のコードに何か問題はあるでしょうか?(制限時間5秒)

<?php
// 擬似コード
doTransaction(function (User $seller, User $buyer) {
    $seller->update();
    $buyer->update();
});
続きを読む

次世代Continuous DeliveryプラットフォームであるSpinnakerを体験してみよう!

Mercari Advent Calendar 2017 の17日目は SET(Software Engineer in Test)チームの @masudak がお送りします。

Spinnakerの登場

みなさんの会社では、どうやってサービスのデプロイを行っていますでしょうか。手で温かみのある配布しているという方もいるかもしれませんし、scp/rsyncでデプロイ、シンボリックリンクを駆使してデプロイ、botを使ってデプロイなど、色々な方法があるでしょう。

@deeeetが tech.mercari.com

に書いたように弊社ではマイクロサービスのデプロイを少しずつSpinnakerに寄せています。

RED/BLACKデプロイや、承認フローの追加、カオスモンキーなど数多くのマイクロサービスを、共通の基盤を使ってコントロールすることができるようになります。

この記事ではSpinnakerの構築を可能な限り分かりやすく、ハンズオン形式で覚えられるようかなり平易な内容で書いてみました。 環境はGCPですが、それ以外の環境でも極力自力でできるよう必要な概念を説明するようにしています。

また本文中では、Kubernetesをk8sと省略しています。ご了承ください。

是非実際手を動かして覚えて頂き、活用した結果をコミュニティに還元して頂ければと思います。

では、行きます。

インスタンスを用意

まず、 Ubuntu 14.04 のインスタンスを一台用意してください。Dockerイメージもあるのですが、gcloudツールを別途入れたりしないといけなくて面倒なので、普通に Ubuntu 14.04 を使うことをオススメします。

その際、サービスアカウントには Allow full access to all Cloud APIs を選択してください。

もちろん、 https://www.spinnaker.io/setup/install/halyard/ に従い、Dockerイメージなども使うことは可能ですので、その場合は上記ドキュメントをご参照ください。また、Macで動かすこともできるのですが、8〜9GB求められたという噂も聞いたので、その辺もお気をつけください。

続きを読む

メルカリチャンネルにおけるFirebaseの利用例

Mercari Advent Calendar 2017 の16日目は@sota1235がお届けします。

この記事では私のチームが開発しているメルカリチャンネルでFirebase Realtime Databaseを使うにあたり行っている工夫をご紹介します。

同じ文脈の話を今年のPHPカンファレンスでも発表したのですが、この記事ではその時お話できなかったもう少し細かい工夫を4つ紹介したいと思います。

続きを読む