Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MTC2018 - Listing Service: モノリスからマイクロサービスへ

mercari
October 04, 2018

MTC2018 - Listing Service: モノリスからマイクロサービスへ

Speaker: 森國 泰平

メルカリで現在進められているマイクロサービス化の1つとして出品機能のマイクロサービス化があります。
PHP & モノリスのコードを可能な限り互換性を保ちながらGo & マイクロサービスに移植するにあたり、どのように開発を進めているのかを紹介します。

mercari

October 04, 2018
Tweet

More Decks by mercari

Other Decks in Technology

Transcript

  1. • 出品に関連があるロジックのみを移植 • 一部はPHPに残したままWebhookで連携 Listing Serviceの戦術 • 既存のAPIに対するアプリの自動テスト • QAチームによる手動確認

    • AQAチームによるテストツール(開発中) APIの互換性を保ちつつ サービスを分割 チームとして独立した開 発を可能にする
  2. GCPからSakuraのMySQLへの接続 message SelectRequest { repeated string columns = 1; string

    table = 2; Where where = 3; ... } message SelectResponse { repeated Row rows = 1; int64 count = 2; }
  3. GCPからSakuraのMySQLへの接続 req := Select("id", "name", "age"). From("users"). Where(Eq("lang", "ja"), And(Gt("age",

    "18"))). OrderBy(ASC("created_at")). ToRequest() err := dbClient.Select(ctx, &user, req)
  4. function listing() { $db->begin(); $item->save(); $photo->save(); $shipping->save(); $analysis->save(); $db->commit(); }

    トランザクションの分割 → トランザクション: 商品を出品したのになかったら不自然 → 同期: 商品の画像がなかったら不自然 → 非同期: 売れるまで配送されない → 非同期: 分析用データはお客様に見えない
  5. function do_something() { if (is_x()) { return 1; } return

    hello(); } 機能追加・修正への追従 func DoSomething() int { if IsX() { return 1 } }
  6. 機能追加・修正への追従 function do_something() { if (is_x()) { return 1; }

    return hello(); } func DoSomething() int { if IsX() { return 1 } return Hello() }
  7. 機能追加・修正への追従 function do_something() { if (is_x() || is_y()) { return

    1; } return hello(); } func DoSomething() int { if IsX() || IsY() { return 1 } return Hello() } Merge conflict !!
  8. 機能追加・修正への追従 function do_something() { if (is_x() || is_y()) { return

    1; } additional_process(); return hello(); } func DoSomething() int { if IsX() || IsY(){ return 1 } AdditionalProcess() return Hello() } Not migrated !!
  9. PHP例外の互換性 // gRPC Server func DoSomething(ctx context.Context, r *pb.Request) (*pb.Response,

    error) { ... if err != nil { s, err := exception.WithException(codes.NotFound, exception.NotFoundException) return nil, s.Err() } }
  10. PHP例外の互換性 // PHP compatible HTTP Server func HTTPServer(r http.ResponseWriter, r

    *http.Requeset) { res, err := client.DoSomething(ctx, &pb.Request{}) if err != nil { e, isException, err := exception.FromError(err) body, err := exception.ToJSON(e) r.Write(body) } }