{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Akka Streamsへ移行しとるんやけど\n", "# ちょっと聞いてや\n", "\n", "[@grimrose](https://twitter.com/grimrose)\n", "\n", "@[Scala関西 Summit2017](http://summit.scala-kansai.org/)\n", "\n", "2017-09-08" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### 今日話すこと\n", "\n", "現在もともとPHPで作られていた集計業務システムをScalaへ置き換えています。\n", "\n", "チームが成熟したのを機に、まずバッチ処理をAkka Streamsに移行し始めました。\n", "\n", "また、Akka HTTPを導入してPHPが持っていたAPIのサービスも一部移行を始めています。\n", "\n", "Akka Streamsを導入してどう変わったのか、ハマったところ等を紹介します。" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### お前、誰よ\n", "\n", "* よしだ\n", " * twitter: [@grimrose](https://twitter.com/grimrose)\n", " * github: [grimrose](https://github.com/grimrose)\n", "* とある人材紹介会社\n", " * マーケティング部門のデータエンジニア(自称)\n", "* 好きなIDE: IntelliJ IDEA\n", "* Scala歴: 2年(2015~)\n", "* [ScalaMatsuri](scalamatsuri.org) 2016, 2017 スタッフ" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### 普段の仕事\n", "\n", "* 事業KPIの可視化を行うためのWebアプリケーションの設計から運用\n", "* Scalaを使って日次や月次の集計バッチを実行するアプリケーションの作成\n", "* 帳票や外部APIなどからデータベースへデータを投入するツールの作成\n", "* 部門の日常業務を改善するためのちょっとしたツールの作成" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 移行の話をする前に" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### プロジェクトの目標\n", "\n", "**事業KPIを集計して可視化する**\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### プロジェクトの概要\n", "\n", "* 始まりは2013年\n", "* もともとはExcelでやっていた\n", "* 「KPIのデータを出社してから見られるようにしたい」\n" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "slideshow": { "slide_type": "slide" } }, "source": [ "### プロジェクトの概要\n", "\n", "\n", "必要なデータをかき集める(人力で)\n", "\n", "* 社内の基幹システムから\n", "* 外部サービスから\n", "* ぬくもりのあるExcelから\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### プロジェクトの概要\n", "\n", "導入時(約4年前)に採用した技術\n", "\n", "* PHP 5.5\n", " * FuelPHP 1.7\n", "* MySQL 5.6\n", "* [TypeScript](https://www.typescriptlang.org/)\n", " * [AngularJS](https://angularjs.org/)\n", " * [Wijmo](http://wijmo.com/)\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "**出社時に誰もがブラウザから見られるようになった**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### プロジェクトの課題\n", "\n", "\n", "**見られるようになったので、やりたいことが増えた**\n", "\n", "* 見たい範囲の拡大\n", "\n", " * 集計業務の拡大\n", " * 取り込みが必要なデータ量の増加\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "** 集計時間の増加 -> 間に合わない**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "**このままでは出社時に見られなくなってしまう**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "**どうしたらいいんだ**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "短縮できそうな箇所を洗い出し\n", "\n", "選んだのは「**データの取り込み処理**」\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "集計に必要な社内の基幹システムのデータの取り込みを短縮する\n", "\n", "逐次処理をしていた箇所を、並行で行うことで短縮を図る\n", "\n", "* 2015年、並行処理が書きやすい**Scala**を導入" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Scalaの導入の前に\n", "\n", "[とあるマーケティング部隊でのembulkの活用事例](https://gist.github.com/grimrose/1377fce36840b6ef7536d22dc63e7761)\n", "\n", "* 当初は、embulkで解決しようとした\n", "* 並列でやるには別の仕組みが必要だったため、断念\n", " * 当時はまだdigdagが無い\n", " * liquidテンプレートもまだだった\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Scalaの導入\n", "\n", "[ScalikeJDBC](scalikejdbc.org) + [Skinny ORM](http://skinny-framework.org/documentation/orm.html)を利用してスクラッチで開発\n", "\n", "* ScalaのFutureを活用して、並行で処理するように\n", "* PHPで3~4時間 -> 1~2時間で完了するように\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "**さらなる改善と時間短縮を求めて**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# そこで、Akka Streamsですよ" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Akka Streams、どうでしょう\n", "\n", "* ストリーム処理ことはじめ ~ Akka Streams\n", "* グラフを知って理解するAkka Stream\n", "* Scala on Docker(AWS ECS)\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "