(レポート)MBL314:世界レベルでクラウドにつながったワイヤレススピーカー「Sonos」を開発する #reinvent

2015.10.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ワイヤレススピーカーを展開している Sonos 社が行ったデータ処理パイプラインの再構築についての事例をレポートします。

MBL314 - Building World-Class, Cloud-Connected Products: How Sonos Leverages Amazon Kinesis

パイプラインを

  • Collect
  • Store
  • Process
  • Consume

という4つのフェーズに分割し、新旧アーキテクチャーが比較されます。

資料

Sonos データパイプライン V1

設計のゴール

  • ユーザーがどのような音楽をどのような媒体(地元ラジオ番組など)聞いているのか
  • スパイクなどがあっても、データロストしない
  • パイプライン下流のデータ処理が元データを破壊的に更新しない(バックアップからのデータ再投入が可能であること)

sonos_data_pipeline_v1

(1)Collect : Data Collector すべてのデータを SQS に放り込む

(2)Store : Initial SQS queue キューのペイロードによって、対応する Process 用 SQS に放り込む

(3)Process : SQS queues

Consume フェーズ向けにデータ加工して送信

(4)Consume:Visualization

  • Splunk
  • Google Analytics

などプロプライエタリ・ソフトウェアを利用

V1 の問題点

  • データをザクっと見られるようになったことで、データについてより深く知りたいという要求が社内から出てきた(導入に対して、好ましいサイクルではある)
  • データソースが増えるたびに追加改修が必要(汎用的な作りになっていない)
  • 費用がかかりすぎる

Sonos データパイプライン V2

設計のゴール

  • 集約型のレポートからイベントベースのレポート
  • どんなデータ型でも処理できる
  • 生データはセキュアに保存
  • 費用を削減する

sonos_data_pipeline_v2

パイプライン V1 のアーキテクチャーの問題

V1 Collect の問題

V1 パイプラインでは Collect フェーズが Store/Processフェーズも見越した責任範囲の広い大きな処理を行っていた。

Amazon Kinesis と Kafka の比較

sonos_amazon_kinesis_vs_kafka

Sonos は lean devops を実践 自社サービスのコアではない運用にリソースを取られたくない。一番最後のマネージドサービスを利用することが重要。

V2 Store の特徴

データはS3に保存 データレイクとしてデータをただひたすら貯めこむ。 データ構造を意識する必要はなく、処理する側が知っていれば十分。

Kinesis Record の処理に関して

kinesis Consumer library は必要な物が全て揃っている シャード・イテレーターを意識することなくデータ処理でき、 データをアグリゲートするのでスループットも上がる

我々にとって重要なのはデータ処理方法ではなく、データそのもの

V2 Process  の特徴

Spark を利用すうる データソースを指定して処理するだけ

V2 Consume の特徴

直ぐに分析結果を見れるようにする

  • Splunk
  • Redshift
  • Kibana

等を利用

Data Pipeline v2 のメリット

  • データをトレースしやすくなった
  • Collect/Store フェーズの処理能力が EC2/Kinesis/S3 の追加で線形にスケール
  • 費用が1/20になった

パイプラインの V1 から V2 への移行プラン

sonos_transition_plan

並行運用でデータの不一致を探す

V1 パイプラインのコレクトフェーズで Kinesis にデータをコピーし、V1/V2 パイプラインを並行で走らせる

V2の運用コストはV1に比べてかなり安いので、平行運用の追加コストもそれほど気にならない。

V1/V2 のベンチマーク

10億イベントあたりのV1/V2比較

処理時間については 2700% の性能向上

費用は V1 : > $5,000 V2 : $650

今後の改善点

  • データパイプライン V1 を落とす
  • Kinesis が落ちた時の対応。Circuit Breakerパターン
  • データコレクターをC++でかき、Kinesis Produer Librarとの親和性を良くする
  • EC2上で動いているSparkを EMR に引っ越す

Final takeaways

Separation of concerns。各システムの責任範囲を明確にする 分析システムは自前で実装し、社内の要望にきめ細かにこたえられるようにする AWSのマネージドサービスを活用し、DevOpsのオーバーヘッドを小さくする

その他

Q&Aによると、リシャーディングは手動で行い、Consumer フェーズでは KCL を利用しているので、リシャーディングによるシャード変動は意識せずにすんでいるそうです。