Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

Rustで実装してみた(mpsc) •

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

appendix-その他所感 • actix-webのホットリローディングの仕組みが少し大変 • vscodeのRLSが遅い • actix-webは(PHP,Nodejs)のwebフレームワークより少し取り回しが大 変 • Dockerのビルドが10分以上かかる • マルチステージビルド必須 • ステージ1. →主要なライブラリダウンロード・コンパイル • ステージ2. →ステージ1のキャッシュを使い差分のみビルド • actix-webについて • 豊富なサンプルがついているので実装で特に困ることなかった。

Slide 27

Slide 27 text

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