Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Session] SpotifyとRelaymが正しく同期を取れているかチェックする機構を追加 #39

Closed
2 of 3 tasks
p1ass opened this issue May 5, 2020 · 1 comment
Assignees
Labels

Comments

@p1ass
Copy link
Member

p1ass commented May 5, 2020

概要

Spotify側のアプリを操作されると同期が取れなくなるので、それをキャッチできるようにする

要件

  • PRD を参照

API仕様 (あれば)

https://github.com/camphor-/relaym-server/blob/master/docs/api.md#interrupt

タスク

@p1ass p1ass added the feature label May 5, 2020
@p1ass p1ass self-assigned this May 6, 2020
@p1ass
Copy link
Member Author

p1ass commented May 6, 2020

同期処理

前提となる考え

Relaym側を完全に正として扱うのは技術的に極めて難しいので、Spotify側で操作されたら同期をとるのは諦める。

また、Webサイトのスクロールをハックするのと一緒であまりUXが良くない(個人的考え)

方針

  • 同期のチェックは現在再生している曲とされる曲の終了時間 + 5秒後に行う。
    • 次の曲が存在する場合、Spotify側の「次に再生する曲」に曲が詰まれていてそれがこのタイミングで再生されているはず。
    • ここで違う曲が流れていたらSpotify側で操作されたとみなす。
    • 想定される曲が流れていた場合、現在の再生時間から次のチェック時間を計算してタイマーをセットする 。

プロセスが死ぬときの対処

状況

  • デプロイやスケールイン時にプロセスにSIGTERMなどが飛んできてwebサーバがgraceful shutdownされるとタイマー処理の完了を待たずしてプロセスが死ぬ。
  • 一度タイマーの更新が途切れると一生そのセッションの同期判定がなされなくなる。

対応策

  1. DBやジョブキューにジョブを積んでwebサーバ側がポーリングで取得
    • 必ず同期判定はされるがポーリングの実装がしんどい
  2. 指定時間後にWebhookを叩いてくれるサービスを使う
    • これが一番まともそう
    • コンテナなので別プロセスを起動するのはだめ。 sleep 10;curl ... とやってもコンテナごと死んだら意味がない。
    • これをうまくできるクラウドサービスを知らない
  3. WebSocketの接続が開始されたときに、タイマーが存在しない場合は再度作り直す
  • タイマー処理はWSのコネクションが貼られているときだけ必要なので、このタイミングで復帰させれば良さそう
  • スケールアウトしたらだめだが、一旦の方法としてはあり

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant