社内ツールを Rustに書き換えてみた件

社内ツールを Rustに書き換えてみた件

Rust Kansai Meetup Osaka #0 にてLTで発表したスライドです

https://rust-kansai.connpass.com/event/152446/

Bde09eb5aa93e53c91a88fc1573cd99f?s=128

morimorikochan

November 09, 2019
Tweet

Transcript

  1. 社内ツールを Rustに書き換えてみた件 morifuji koudai

  2. • 名前 • morifuji • twitter : @marooon88 • 仕事

    • atma株式会社 • PHP/Nodejs/Vuejs • 趣味 • Rust(勉強中the bookとチャリ本1週しただけ) • NitendoSwitchのインディーゲーム • katana zero • The friends of Ringo Ishikawa • moon • Celeste 自己紹介
  3. 会社紹介 絶賛採用中 • Vue.jsフロントエンドエンジニア • Pythonサーバーサイドエンジニア 特徴 • 西中島のAI系ベンチャー •

    服装自由 • フレックス勤務(朝11時から) • 週2リモート勤務 etc...
  4. • 現状の課題 • 解決策 • 新たな課題 • Rustで実装してみた • Rustで実装してみた(mpsc)

    • まとめ • appendix-その他所感 • appendix-わからなかったこと 目次
  5. • 誰がどのぐらいどのPJで何をしているか把握が困難だった • 作業時間の明確な記録がなくPJの振り返りが困難に • 誰が何をやっているかわかりにくい • いくつかのPJでは毎日作業報告書に記載する作業が必要だった 現状の課題

  6. 現状の課題 • 誰がどのぐらいどのPJで何をしているか把握が困難だった • 作業時間の明確な記録がなくPJの振り返りが困難に • 誰が何をやっているかわかりにくい • いくつかのPJでは毎日作業報告書に記載する作業が必要だった 誰でも気軽にPJに紐づく作業時間の記録の仕組みづくりがあれば...

  7. 解決 →誰でも気軽にPJに紐づく作業時間の記録の仕組みづくり SlackBot GoogleAppScript GoogleSpreadSheet 作業時間 作業内容

  8. 解決策 slackで /workと打つ spreadsheetに記録され responseが返る

  9. 解決策 これで平和になりました

  10. 解決 これで平和になりました

  11. 新たな課題 1,2ヶ月後から徐々にタイムアウトエラーの発生が増えて来た

  12. 新たな課題 1,2ヶ月後から徐々にタイムアウトエラーの発生が増えて来た GASからのレスポンスが 遅くなりすぎてSlackBotが レスポンスを受付けず タイムアウトエラー

  13. 新たな課題 ←理想 GoogleAppScriptは同期的なので実現できない

  14. 新たな課題 Rustを使って....

  15. 新たな課題 →Rustを使って非同期で処理させる Rust

  16. Rustで実装してみた Rustでやりたいこと 1. 即座にレスポンスする     2. gasに対してリクエストを投げる 実現方法 →リクエストをキューに入れ  即座にレスポンス。  別スレッドでキューから取り出し、gasにリクエストを投げる

    Rust
  17. Rustで実装してみた フレームワークは? →actix-webを採用 • 理由 • 他に比べてスター数が多い • actorモデル というのがキューを処理するのに適してそう

    • ベンチマーク最速?速そう • 安定しているらしい • 懸念点 • クエリ・ボディのデータの取り出しが大変そう
  18. Rustで実装してみた 実装しました✍

  19. Rustで実装してみた ←別スレッドでキューからタス クを取り出し、gasにリクエスト を投げる処理

  20. できたけど微妙なコード... →actixを使ったactorモデルはなんとなく理解できたが使い方で詰まった →諦めてオレオレキュー(Arc<Mutex<VecDeque<Task>>>)を作ってし まった Rustで実装してみた

  21. Rustで実装してみた できたけど微妙なコード... →actixを使ったactorモデルはなんとなく理解できたが使い方で詰まった →諦めてオレオレキュー(Arc<Mutex<VecDeque<Task>>>)を作ってし まった (rust-jpのactix-webチャンネルにて) 「一般的なRustプログラムの場合はmpscを使いますよ」

  22. Rustで実装してみた(mpsc) mpscとは? >Multi-producer, single-consumer FIFO queue communication primitives 複数の生産者が単一の消費者に投げるのに特化したキュー リクエストから発生するタスクを

    同一のスレッドで捌くのにぴったり! 同様にspmcというものも存在するらしい
  23. Rustで実装してみた(mpsc) •

  24. Rustで実装してみた(mpsc) mpscは • 可読性が高い • APIが簡単で書きやすい

  25. • 改善した結果→エラーがなく作業時間を記録できて気持ちいい • rust-jpのスラックは優しい方がたくさんいらっしゃる • mpscはキューを実装する場合に便利 • actorモデルを理解するとよりactix-webがわかる repository↓ https://gitlab.com/morifuji/rust-practime-log/tree/master/time-tracking

    まとめ
  26. appendix-その他所感 • actix-webのホットリローディングの仕組みが少し大変 • vscodeのRLSが遅い • actix-webは(PHP,Nodejs)のwebフレームワークより少し取り回しが大 変 • Dockerのビルドが10分以上かかる

    • マルチステージビルド必須 • ステージ1. →主要なライブラリダウンロード・コンパイル • ステージ2. →ステージ1のキャッシュを使い差分のみビルド • actix-webについて • 豊富なサンプルがついているので実装で特に困ることなかった。
  27. appendix-わからなかったこと • actorモデルの使いどころがわからなかった • 結局メッセージを送るのに従来のStateを使用せざるをえなさそう • →可読性ではmpscの方がよい?