$30 off During Our Annual Pro Sale. View Details »

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

morimorikochan
November 09, 2019

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

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

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

morimorikochan

November 09, 2019
Tweet

More Decks by morimorikochan

Other Decks in Technology

Transcript

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

    View Slide

  2. • 名前
    • morifuji
    • twitter : @marooon88
    • 仕事
    • atma株式会社
    • PHP/Nodejs/Vuejs
    • 趣味
    • Rust(勉強中the bookとチャリ本1週しただけ)
    • NitendoSwitchのインディーゲーム
    • katana zero
    • The friends of Ringo Ishikawa
    • moon
    • Celeste
    自己紹介

    View Slide

  3. 会社紹介
    絶賛採用中
    • Vue.jsフロントエンドエンジニア
    • Pythonサーバーサイドエンジニア
    特徴
    • 西中島のAI系ベンチャー
    • 服装自由
    • フレックス勤務(朝11時から)
    • 週2リモート勤務 etc...

    View Slide

  4. • 現状の課題
    • 解決策
    • 新たな課題
    • Rustで実装してみた
    • Rustで実装してみた(mpsc)
    • まとめ
    • appendix-その他所感
    • appendix-わからなかったこと
    目次

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  17. Rustで実装してみた
    フレームワークは?
    →actix-webを採用
    • 理由
    • 他に比べてスター数が多い
    • actorモデル というのがキューを処理するのに適してそう
    • ベンチマーク最速?速そう
    • 安定しているらしい
    • 懸念点
    • クエリ・ボディのデータの取り出しが大変そう

    View Slide

  18. Rustで実装してみた
    実装しました✍

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  22. Rustで実装してみた(mpsc)
    mpscとは?
    >Multi-producer, single-consumer FIFO queue communication primitives
    複数の生産者が単一の消費者に投げるのに特化したキュー
    リクエストから発生するタスクを
    同一のスレッドで捌くのにぴったり!
    同様にspmcというものも存在するらしい

    View Slide

  23. Rustで実装してみた(mpsc)

    View Slide

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

    View Slide

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

    View Slide

  26. appendix-その他所感
    • actix-webのホットリローディングの仕組みが少し大変
    • vscodeのRLSが遅い
    • actix-webは(PHP,Nodejs)のwebフレームワークより少し取り回しが大

    • Dockerのビルドが10分以上かかる
    • マルチステージビルド必須
    • ステージ1. →主要なライブラリダウンロード・コンパイル
    • ステージ2. →ステージ1のキャッシュを使い差分のみビルド
    • actix-webについて
    • 豊富なサンプルがついているので実装で特に困ることなかった。

    View Slide

  27. appendix-わからなかったこと
    • actorモデルの使いどころがわからなかった
    • 結局メッセージを送るのに従来のStateを使用せざるをえなさそう
    • →可読性ではmpscの方がよい?

    View Slide