Rustで10日でwebサービスを

つくった話

Shinjuku.rs  #6

CTO  at TRUNK

自己紹介

now

ex

ふだりゅうすけ

=   教育と採用の会社
     (創業4年のスタートアップ)

2018夏合宿

去年

弊社TRUNKでは毎年夏に開発合宿をして、
なんとなく使ったことない技術で、
なんとなくサービスの開発をしてみています。

オンライン学習システム

㊗️ちょうど一昨日リリース㊗️

2019夏合宿

今年

今年はRustとelm web component やるぞ!

自問自答QAサイト

メンバー

私ふだ

Rust 2名

通称モロオカッティ

通称タックマン

通称テラハ

web components 2名

技術選定その1

  • フレームワーク

    • actix-web vs rocket
      • HTTP2が使えるということで actix-web
  • データベース
    • MySQL vs その他
      • 全員が使えるということでMySQL
  • フロントとバックエンドの通信
    • REST API vs gRPC
      • 当初gRPCを使おうと思ったが、公式にサポートされていないのでREST APIを採用。プロジェクト自体はあるけど、 still under development状態

技術選定その2

  • その他

    • マイグレーションツール

      • diesel (これしかない感)
    • パッケージ管理
      • cargo (これしかない感)

構成図

web backend

web frontend

DB

KVS

json

やったこと/環境構築

docker-composeによる環境構築、Dockerfileはすごいシンプル

FROM rust:1.36

WORKDIR /app

COPY Cargo.toml  .
COPY Cargo.lock .

# Avoid Compilor Error
RUN mkdir src && \
    echo "fn main() {}" > src/main.rs

RUN cargo build

# Development Tools
RUN cargo install cargo-edit

# For Hot Reloading
RUN cargo install catflap cargo-watch

# Migration Tools
RUN cargo install diesel_cli --no-default-features --features mysql

COPY . .

EXPOSE 8080

CMD ["catflap", "--", "cargo", "watch", "-x", "run"]

 やったこと/開発/辛かったこと

  • とにかく慣れてないので、すぐ詰まる
    • 詰まったときに救いがない
      • 河原で体育座りすると直ることもある
         
  • actix-webとactixの棲み分けがイマイチはっきりしない
    • httpサーバ, sessionあたり
      • モジュールのディレクトリ毎なくなってたりする
         
  • 通信回りの非同期処理もまぁまぁ手こずる
    • futureを粛々と書いていたが、tokioを使うともっと楽?
       
  • 普段使っている技術ならすぐ実装できるところに3hとかかかると徐々に性格が歪んでくる
    • "一旦寝かせよう" を合言葉に乗り切る

  cargo.toml

[package]
name = "ponderqa"
version = "0.1.0"
authors = ["ryusukefuda"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[[bin]]
name = "ponderqa"
path = "src/main.rs"

[dependencies]
actix-web = { version = "1.0", features = ["ssl"] }
actix-cors = "0.1.0"
actix-session = "0.2.0"
actix-redis = { version = "0.6.0", features = ["web"] }
env_logger = "0.6"
serde = { version = "1.0", features = ["derive"] }
failure_derive = "=0.1.5"
diesel = { version = "1.0.0", features = ["mysql", "chrono"] }
dotenv = "0.9.0"
listenfd = "0.3"
chrono = { version = "0.4.7", features = ["serde"] }
futures = "0.1"
serde_json = "1.0"
validator = "0.6.3"
validator_derive = "0.6.5"

 やったこと/開発/よかったこと

  • だいたい自分たちで書いていくのでフレームワーク依存の謎のエラーみたいなものはない
     
  • コンパイルが通るという忘れていた幸せを再確認できる
     
  • 一通りwebサービスに必要なものは揃ってるのを確認できた

demo

 次回LTできたら

デプロイ編

エンジニアも募集中です!

Made with Slides.com