こんにちわ。Xiaoです。
1月30、31日に開催された日本最大級のScalaカンファレンス、Scala祭りに参加してきました。
今回のScala祭り2016では、初心者向けから上級者向けまで、コーディングのベストプラクティスからシステムの設計まで、リファクタリング、コンパイラ、関数型プログラミング、Reactive、マイクロフォーサーズなど、種類豊かな面白いセッションが沢山あって、とても素晴らしいコンファレンスでした。
特に最近自分が興味を持っているReactiveに関してのセッションに参加して、大変勉強になりました。 ではここからは自分が参加したセッションについて、紹介したいと思います。
[10:00 - 10:40] Refactoring in Scala
Scala の Object Oriented Programming Style や Functional Programming Style、豊かな型システムを、実業務コードにどの様に活用していけばよいのか。このセッションでは、様々なプロジェクトで頻出する典型的なパターンを例に、リファクタリングを通じて実戦的な Scala の使い方を提示します。 Scalaの文法や機能はある程度把握できたけれど、それを具体的に使いこなすにはどういたらいいのかまだ掴めない、といった方を対象にしています。
初日のセッションは、がくぞ(@gakuzzzz)さんの「Refactoring in Scala」から、始まりました。 ごくシンプルな例から始まり、Scalaのあらゆる特性を使って、段々と問題を解決する手法が印象的でした。 そして、ここで初めてIsoとPrismを知り、勉強になりました。
余談:イベント前日に大雪の天気予報があって、電車の遅延などが予想されました。当日はちょっと寝坊して、一時的に間に合わないと思いましたが、結果雪が降らなかったので、ギリギリ間に合いました。
[11:00 - 11:40] なぜリアクティブは重要か
www.slideshare.net
プログラミングモデルから分散システム設計まで、様々な分野で「リアクティブ」というキーワードが注目を集めている。一例としては、非同期ストリーム API ReactiveX や、Typesafe 社が推進する大規模システムの設計原則「リアクティブ宣言」が有名だろう。 また、言語標準にもリアクティブの波が押し寄せている。Java 9 では、非同期バックプレッシャーの仕様 Reactive Streams が標準ライブラリに加わる予定だ。 しかし、それぞれ全く異なる技術的背景から独立に登場した技術が、なぜ似通ったコンセプトを求めるのだろうか? ヒントは、かつてジョン・ヒューズが著した「なぜ関数プログラミングは重要か」の中にある。 このセッションでは、コードやシステム、そして開発組織のモジュール化を進める上で、なぜ「リアクティブ」が重要な役割を果たすのかを考察していく。
その次は同じ会場で行った、岡本雄太(@okapies)さんの「Why Reactive Matters」でした。
ここから初日のReactiveざんまいが始まりました。
ちょっとまとめてみると、お題の「なぜリアクティブは重要か」という問題に対して。 - リアクティブは、近年ソフト開発の課題を解決するためのもの。 - 同じリアクティブですが、プログラミングモデル、ランタイムエンジン、アーキテクチャを含めている。 - 関数型のプログラミングモデルを使って、データフローを定義する。 - データフローとランタイムを分離して、マルチプラットフォームで切り替えできる。 - アーキテクチャについてまだ決まってないが、今多く使われているのはマイクロフォーサーズアーキテクチャ。
40分間の中でリアクティブに関しての概念を殆どをカバーしていて、実に充実したセッションでした。
[12:00 - 12:40] リアクティブ・マイクロサービス
www.slideshare.net
ことマイクロサービスに関しては、皆そろって口先ばかりでなかなかコードが出てこないのが現状だ。この状況を正すため、この発表では本物のマイクロサービスを作る際のパターンをいくつか説明すると共に、作成したコードをデプロイして管理する様子を実演する。コードは Scala、Akka、Play で書かれており、リアクティブ宣言の設計原則を適用する。
続いて、Typesafe社のChristopher Hunt(@huntchr)さんからの「Reactive Microservice」。
前のセッションと比べて、かなりゆっくりのスピードで話ししましたが、リアクティブなマイクロフォーサーズが実際どうのように実装しているのかをデモしながら、 以下のポイントについて話ししました。
- Resilience is No.1: レジリエンスが最も重要。
- これを実現するための方法のひとつはデータの分散化(Cluster our Datastore)。
- 実際使えるサービスのひとつはPostgres BDR(日本語の紹介記事PostgreSQL BDR (Bi-Directional Replication) を使ってみた - Qiita)。
- Elasticity:次は伸縮性
- 複数のノードにデプロイする(Run on multiple nodes)。
- こちらはTypesafeの製品ConductRを使ってデモしました。見たところ、デプロイした全てのノードの状態をアニメーションで表示されて、わかりやすいです。
- 最後はAkka Data Replicationを使ってキャッシュ管理の方法を説明しました。(日本語の紹介記事Akkaの分散されたアクター間でDBを使わずにデータを共有する方法 - Qiita)
[13:40 - 13:55] バッチを Akka Streams で再実装したら100倍速くなった話
www.slideshare.net
バッチ処理のパフォーマンスが Akka Streams を使うことで処理速度が100倍に改善した事例をご紹介します。パフォーマンスに問題を抱えた、本番運用されているバッチ処理がありました。Akka Streams と Slick を使ってバッチ処理を再実装してみたところ、ハードウェアの変更なしに大幅な性能改善が実現できました。Akka Streams の1つのユースケースを今回の事例を使ってご紹介したいと思います。
ランチタイムが終わって、午後最初のセッションはTISの根来和輝(@negokaz)さんからの15分のLTでした。
午前のセッションでリアクティブの理論をいろいろ勉強しましたが、ここで実際Akka Streamsを使って、どのような変化ができるかを体験しました。 その結果、最初3日かかる処理(DBからCSV生成)が14分になりました、実に驚きました。
そして、このセッションから学んだもう一つのことは、パフォーマンスチューニングについて、計測は凄く重要とのことです。
[15:00 - 15:40] レジリエンスが無ければ、他は無いも同じ
www.slideshare.net
あなたのアプリケーションが、どんなに美しくて、疎結合で、スケーラブルで、並行性が高くて、ノンブロッキングで、即応性があって、高性能であったとしても関係ない。もし、それが実行されていなければそれは 100% 使いものにならない。レジリエンスが無ければ、他は無いも同じだ。 殆どの開発者はレジリエンスという言葉が何を意味するかは知っているが、「今自分たちが作業しているシステムの中で」という文脈と付け足すと、あまりにも多くの開発者がそれが本当に何を意味するのかの根本的な知識を欠如していると言って過言ではない。障害を理解し、管理することが過去に無く重要になってきているため、この状況は非常に残念だと思っている。(様々な意味でのコストを考えても) 障害は損失の大きいもので、時としてビジネス全体を壊滅させることもある。 このセッションではレジリエンスの本質について考察する。レジリエンスとは実際何を意味するのか?その機構や特徴はなにか? 他の分野の科学や産業はどう管理していて、そこから何を学ぶことができるのか?全ての問いは同じ答にたどり着くことを証明する: 失敗は不可避であり許容される必要があり、レジリエンスは設計方針であるということだ。
そして、初日の中で個人的に一番面白いセッション、Typesafe社創業者かつCTOのJonas Bonér(@jboner)さんからの「Without Resilience Nothing Else Matters」に参加しました。
開場からロッキーのテーマ曲を流れて、会場の雰囲気を一気に変わりました。 そこでロッキーの中のセリフを使って、耐障害性とは何かを説明しました。そしてレジリエンスが耐障害性を超えていると主張しました。
こちらもChristopher Huntさんの同じ観点の「レジリエンスが一番重要」について、200ページに近いスライドを使って、その具体的な理由とその実現方法などを話ししました。 その中で、幾つかの観点が凄く印象的でした。 - まず、人間がある限り、複雑なシステムが常に壊れている。 - そして、失敗は一つの状態にすぎない。 - だから、レジリエンスが最初の設計に入るもの。
この後、Jonasさんが生物界と人間社会の例に使って、Error Kernel Patternという多層階状態と失敗管理パターンを説明しました。 Jonasさんのスライドは凄く分かりやすくて、実際いろんなアニメーションも入ってて、本人の説明もとてもいきいきしていて、生で見れて本当に良かったと思いました。
[16:00 - 16:40] The Zen of Akka
www.slideshare.net
同期的実行モデルに慣れた人が非同期プログラムに移行する場合、考え方を根本的に切り替えて物事を少し異なる視点から見る必要がある。Akka を完全に活用するには、アプリケーションの設計に対する考えをまず改める必要があり(コンポーネントを空間と時間に対して疎結合にする)過去に習ったことを見直さなければいけない。このセッションでは、並行分散アプリケーションを設計する際の手引きとなるいくつかのルールを紹介して、それらをAkka にどのように適用して日々のアプリ開発に役立たせることができるかをみていく。
続いて、Typesafe社AkkaチームのKonrad Malawski(@ktosopl)さんのセッション、「禅 of Akka」でした。 前のJonasさんのちょっと抽象的のセッションの反面、KonradさんのセッションはAkkaを使う際の14個のベストプラクティスをまとめて、凄く実用的でした。
その中でも以下の観点は最も印象に残りました。
- 誰の話でも信じるな、計測を信じろ。
- 他人の計測も信じるな、自分で計測しろ。
余談:スライドに幾つ出てきた日本の漫画ネタが凄く面白くて、Konradさん本人も今回ガンダムのプラモデルを買ったらしい。
まとめ
他にも沢山の素晴らしいセッションがありますが、時間と空間の都合で参加できませんでした。 もし興味があたっら、こちらのまとめ(【全収録】資料も反響も総チェックしよう! 日本最大級のScalaカンファレンス #ScalaMatsuri まとめまとめ - Togetterまとめ)とか、ニコ生のタイムシフト試聴を利用してもいいかもしれません。
初めてScala祭りに参加して、どこまでついていけるかをちょっと心配でしたが、スタッフとすべての参加者のおかけで、凄く気持ちのいいコンファレンスでした。 一日のコンファレンスで、Reactiveのシステムを作りたくなりました。まだ課題が沢山ありますが、これから頑張って勉強する所存です。 みんなさんありがとうございました、そしてお疲れ様でした。
ちょっと長文になりましたが、最後まで読んでいただいて、ありがとうございました。
では、まだどこかでお会いしましょう。