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

HipChat のメッセージ履歴取得を高速化する方法を検討する #5

Closed
2 tasks done
inouetakuya opened this issue Feb 11, 2018 · 3 comments
Closed
2 tasks done

Comments

@inouetakuya
Copy link
Contributor

inouetakuya commented Feb 11, 2018

課題の整理

制約 (1) 1リクエストに時間がかかる

こちら にあるように、

メモ)1000件ずつ取得するには、HipChat からレスポンスが返ってくるのに数秒 〜 十数秒かかる

つまり、遅い

制約 (2) 次のリクエストのオフセットを事前に計算できない

こちら にあるように、HipChat API からレスポンスを受け取った後に、次のリクエストのオフセットの date を計算しないといけない

(次のリクエストのオフセットを事前に計算できない)

制約 (3) トータルでたくさんリクエストを投げる必要がある

こちら にあるように、HipChat API にリクエスト送る、レスポンスを受け取る、JSON ファイル保存、次のリクエストを送る... と直列に処理していたら、

  • メッセージ数: 166,368
  • 所要時間: 47分53秒

というような結果になる。そして、

仮に 10,000 メッセージのルームを 300件処理するとして、300万メッセージの処理時間を概算すると、
エクスポート: 50分 x 300万 / 16万 = およそ 16時間

となる。

どげんかするぞ

これらの制約を踏まえて、どげんかして高速化する方法を考える。

この Issue の完了条件

  • 高速化する方法についていくつか案を考える
  • 高速化する方法を決める
@inouetakuya inouetakuya self-assigned this Feb 11, 2018
@inouetakuya
Copy link
Contributor Author

inouetakuya commented Feb 11, 2018

検討

まず、

制約 (2) 次のリクエストのオフセットを事前に計算できない

については、これに対抗する方法を思いつかなかった。

つまり、1ルームあたりのメッセージ数が多いときは、もうどうにもならない。

トータルでの処理時間を減らすことしか思い付いていない。

そうすると、

メモ)1000件ずつ取得するには、HipChat からレスポンスが返ってくるのに数秒 〜 十数秒かかる

下手すると、20秒とかかかっていたので、Rate limits(5分で 500 リクエスト)いっぱいまでリクエストを送ろうと考えると、マルチスレッドだと 20 〜 30 スレッドとかにする必要があり、メモリがたくさん必要。

時間がかかっているのは(いま見えている限りでは)HipChat からのレスポンスを待つところのみなので、これに素直に対応しようとしたら、「案 (1) コールバック」が効率が良いだろうなという所感。

使用言語については一旦ペンディング

やっぱり Node.js で書くのが素直かなあ...

と思っているけど、中間処理に DB が不要か、先に考えたい(CSV 作成処理とか)

理由: DB を扱うんだったら、Node.js より Ruby 使うほうが得意。Ruby というか ActiveRecord 使いたい。

@inouetakuya
Copy link
Contributor Author

使用言語について

#6 (comment)

DB をいきなり使っても、いったん DB なしでチャレンジしても良いと思うが、DB が必要になる可能性があるという前提で進んだほうが良さそう。

という判断をしたので、Ruby を採用する。

まずは、一旦、高速化は横に置いてシンプルに実装してみて、そこから、高速化という作戦をとる。

@inouetakuya
Copy link
Contributor Author

inouetakuya commented Feb 11, 2018

start-index というオプション

(次のリクエストのオフセットを事前に計算できない)

HipChat - API - View room history
https://www.hipchat.com/docs/apiv2/method/view_room_history

INTEGER start-index
The offset for the messages to return. Only valid with a non-recent data query.Defaults to 0.

というのが見えた。これを使えばなんとかなる...!?

room statistics と組み合わせたとしても、時間範囲を指定してメッセージを取得するのは厳しそう

いまのところ、イイ感じの方法が思い浮かばない。仮に下記と組み合わせたとして。全履歴を取るのはイケそうな気がするが、時間範囲を指定するのは厳しそう。

HipChat - API - Get room statistics
https://www.hipchat.com/docs/apiv2/method/get_room_statistics

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

No branches or pull requests

1 participant