レポート

まさにお祭りの3日間! 「ScalaMatsuri 2019」レポート

この記事を読むのに必要な時間:およそ 2.5 分

2019年6月27日から29日までの3日間,プログラミング言語Scalaに関するカンファレンスScalaMatsuri 2019が開催されました。

本稿では,2日目となる「カンファレンスDAY」におけるさまざまなセッションのなかから,実サービスへのScalaの応用に関する3つのセッションをピックアップして紹介します。本稿を読み,自らの携わるサービスにおけるScalaの利用に興味を持っていただけると嬉しいです。

画像

QRコード決済サービスでのAkka Cluster利用事例

まず紹介するセッションは,根来和輝氏による「決済サービスでAkka Cluster使ってみた」です。先行リリースされた伝統的なCRUD構成のQRコード決済サービスを,Akkaをはじめとするソフトウェアスタックを使って置き換えた事例が紹介されました。

根来和輝氏

画像

ここでポイントとなるのは,Akkaを用いたEvent Sourcing+CQRSなアーキテクチャの採用です。同氏はこの2つの用語について説明します。

まずはEvent Sourcingについて。おおざっぱに言えば,決済の開始や入金など,システムの中で起きた「イベント」を順次データストアに記録していくというものです。状態を持たず(つまりRDBMSにおけるUPDATEがなく)INSERTしか起こらないため,ロック不要で複数ノードへの分散書込みが可能という利点を持ちます。

もちろんこのようなしくみを採用することの欠点も存在します。イベントしか永続化されていないため,データの集計や一覧を作るためにコストがかかってしまうのです。QRコード決済サービスにおいては「店舗がこれまでの決済を一覧する」といったの機能も必要になってきますから,この欠点を放置しておくことはできません。

これを解決するのがCQRS(Command and Query Responsibiliry Segregation,コマンド/クエリ責務分離)というしくみです。文字通り「コマンド=書き込み」「クエリ=読み込み」を分離するというもので,コマンドサイドのデータストア(今回で言えば,Cassandraへのイベントの書込み)からクエリサイドのデータストア(今回はMariaDBを使用)へと非同期でデータを反映し,集計や一覧が必要になった場合はクエリサイドへ問い合わせる……という形になります。

しかし,コマンドサイドからクエリサイドへのデータの反映には一定の遅延が発生するため,一時的に整合性が保たれない場合があります。結果整合性しか担保されないということです。この場合,実装しようとしているシステムが結果整合性を許容できるよう設計する必要が出てくるでしょう。

今回のプロジェクトでは,一部の場面で結果整合性を許容できない場合があったといいます。そこで登場するのがAkka Persistenceで,コマンドサイドのデータストアへのイベントの記録と同時に,遅延のない情報取得に必要な情報を持った「エンティティ」の状態を遷移させます。Akka Persistenceの持つ諸々の特長により,安全なスケールアウトが可能になり,遅延なく状態を確認できるようになりました。

以上,Event SourcingおよびCQRSのしくみについて,セッションの内容をもとに簡単に紹介しました。このあとも設計・実装にあたっての経験が述べられるなど,Akkaの活用事例として充実したセッションとなりましたので,気になる方はぜひスライドも参照してみてください。

本発表のスライド

SpotifyにおけるScioを使ったデータ処理

続いては,SpotifyのデータエンジニアであるJulien Tournay氏による「Data Processing @Spotify using Scio」というセッションを紹介します。

Julien Tournay氏

画像

ふだんから同サービスを利用している方であればご存知のとおり,Spotifyは,新しい音楽との出会いを助けてくれる「Discover Weekly」や,よく聴くジャンルの音楽をまとめた「Daily Mix」といった,さまざまなレコメンド機能を持っています。

もちろんこうした機能の実現のためには,大量のデータをうまく扱うしくみの構築・運用が不可欠です。分析や処理をすばやく簡単に行えることはもちろん,コストも抑えなければなりませんし,GDPRへの対応などプライバシーへの配慮も必要……などなど,数多くの乗り越えるべき課題があります。同氏はこれを「データ処理は難しく,そして高価である」とまとめました。

そして,こうした課題を解決するためにSpotifyで開発されたのがScioです。Google Cloud Platformのデータ処理基盤であるCloud DataflowのScala APIといった位置付けのソフトウェアで,OSSとして公開されています。

同氏はScioのゴールとして「充実したドキュメント」⁠予測性」⁠パフォーマンス」⁠生産性⁠⁠,そしてScalaならではの特長として「型安全性」を挙げました。Spotifyではこれらのゴールを達成するために,意欲的にScioをアップデートしつづけているのです。

セッションの後半では,Scioの最近のアップデートのなかから,シリアライズの効率化および型安全性の向上や,巨大なデータセットどうしのJOINの効率化,より使いやすく型安全なクエリ機能などを紹介しました。

月間アクティブユーザが2億人を超えるような,世界中の人たちが利用するサービスの運用において,Scalaがその特長を活かしながら積極的に活用されていることがわかるセッションとなったのではないでしょうか。