Mercari Engineering Blog

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

Google Kubernetes Engine上のGoアプリケーションでのHTTPリクエストを行う方法

この記事はMERPAY TECH OPENNESS MONTHの最後の記事です。

こんにちは、メルペイのバックエンドエンジニアの@gia.nguyenです。 私は第3回のGopher道場を卒業してから2018年12月に入社しました。

他の記事にも記載されましたが、メルペイのバックエンドは、Google Kubernetes Engine(以下、GKE)を使用して、マイクロサービスアーキテクチャを採用した多数のマイクロサービスから構成されています。マイクロサービスは主にGo言語を使って、開発しています。マイクロサービス間のコミュニケーションはgRPCでやり取りしていますが、外部サービスに対してはほとんどHTTPで通信を行っています。本記事はGKE上のGoアプリケーションでHTTPリクエストを投げる際、いくつか工夫した点を紹介したいと思います。

TL;DR

  • httptraceはデバッグに役立つので使いましょう
  • GKEのDNSが不安定なのでdnscacheを使いましょう
  • サーバーがHTTP/2に対応すれば、Goのクライアントはhttp2.Transportを使うので意識しておいたほうがいいです
  • http2.Transportを使うならGo 1.12以上を使いましょう
  • HTTP/2のMAX_CONCURRENT_STREAMSの設定を上げられなければ、複数のHTTPクライアントか一定のコネクション数を維持するプールを使えば、パフォーマンスがより良くなります
続きを読む

メルペイにおけるお客さま残高の管理手法

はじめに

この記事はMERPAY TECH OPENNESS MONTHの19日目の記事です。 こんにちは。株式会社メルペイのPayment Platformチームでエンジニアをしている knsh14 です。

メルペイの様々な決済手段でどのように決済の整合性を保とうとしているかは15日目の記事で紹介しました。 メルペイでは決済の手段をもつマイクロサービス(Payment Service)と決済のための原資を管理するマイクロサービス(Balance Service)を分けています。 今回はこのお客さまの残高を正しく管理するためのマイクロサービスがいかにして正確に増減をしているかを説明します。

続きを読む

Introducing ViewModel Inputs/Outputs: a modern approach to MVVM architecture

This is the 18th post for MERPAY TECH OPENNESS MONTH.

Hi, I’m @celia, an iOS Engineer working at Merpay. In this article, I want to introduce how the Merpay iOS team practices MVVM architecture with viewModel Inputs/Outputs, to create an isolated, highly testable codebase.

Let me begin by explaining how we chose to use it in the first place. When native iOS development started in early 2018 at Merpay, we wanted to create a modular, well architected product that could be seamlessly integrated into the Mercari app, or provided to third parties as a service if needed. We wanted the codebase to be independent and lightweight, with minimum dependency requirement on open source frameworks. We also want it to be easy to write tests for, because we think of code and tests as one. This led us to try out viewModel Inputs/Outputs, an approach inspired by the company Kickstarter, and after working with it for a year and a half, our team is happy with it.

What It Is

The MVC architecture has been the default practice for iOS development from the beginning. As a project gets bigger, the view controller’s code gets more complex, and harder to maintain and test - a phenomenon well known as Massive View Controller. With MVVM, we add a new layer called viewModel between the model and the view controller, and move the presentation logic and data operations from the view controller into the viewModel. It reduces the complexity of the view controllers and makes the viewModel a single source of truth for the user interface state.

f:id:li-yunjie:20190611111055p:plain
iOS architecture
Reference: objc.io

It’s common practice to combine MVVM with a binding mechanism. Many choose functional reactive programming frameworks such as ReactiveSwift or RxSwift, but at Merpay, we minimize third-party framework dependencies as much as possible. We create our viewModel with Inputs/Outputs protocols. Why protocols you ask? Well, the protocols force the code author to reach the viewModel through Inputs and Outputs each time, thus keeping a consistent style across the entire codebase. Also they're similar to Java Interface which means we can use them to mock classes easier. Essentially, it's a lightweight way to map input and output signals to mimic binding behavior, so we can have functional programming without using binding frameworks.

続きを読む

iOSアプリで共通UIクラスを使うための仕組み

この記事はMERPAY TECH OPENNESS MONTHの17日目の記事です。

メルペイiOSエンジニアの@masamichiです。 メルペイで導入している、 iOSアプリで共通UIクラスを使うための仕組みについて紹介します。

背景

メルペイでは、メルペイの機能をSDKとして開発してメルカリアプリに組み込んでいます。SDKにはメルペイで横断的に使用する基本的なUIクラスがあります。例えばメルペイでは統一してテキストラベルの色に #000000 ではなく #333333 を使っていますが、その色を使ったUILabelのカスタムクラスをPrimaryLabelとして定義しています。他にもUIButtonでは、MercariPrimaryFilledButtonMercariSecondaryOutlinedButtonといったクラスを定義しています。

f:id:masamichiueta:20190607104300p:plain
UIクラス

続きを読む

Google Cloud Spannerのセッションリークを静的解析で防ぐ

この記事はMERPAY TECH OPENNESS MONTHの16日目の記事です。

メルペイ エキスパートチームの@tenntennです。 @sinmetalの記事でも紹介がされていたように、メルペイではGoogle Cloud Spannerを用いて開発しています。 Google Cloud Spannerはまだまだ世界的にもノウハウが乏しい状況です。そのため、メルペイにおいても各開発者が学んだノウハウをGo Fridayなどを通して社内で共有しながら開発を進めています。

社内でノウハウを共有する中で、うっかりミスをしがちでかつそのミスによってサービスに大きく影響を与えるものがいくつか出てきました。例えば、Google Cloud Spannerのセッションを閉じ忘れることによるセッションリークの問題は、うっかりミスをしがちですがサービスに大きな影響を与えかねません。

このような問題を発見するためにzaganeというツールを開発しました。zaganeは静的解析を行い、Cloud Client Library for Goを利用している時に起こりがちなコードのミスをコミットする前に発見できます。

この記事ではzaganeで提供している機能のうちの1つである、セッションリークを発見する方法について解説します。ここで紹介するアルゴリズムはGoogle Cloud Spanner以外にも応用の効くもので、ファイルの閉じ忘れの発見などにも用いることが可能でしょう。

続きを読む