Upgrade to Pro — share decks privately, control downloads, hide ads and more …

事業譲渡されたブランドにGo言語を取り入れた話

 事業譲渡されたブランドにGo言語を取り入れた話

Ryuya Ishibashi

December 25, 2023
Tweet

More Decks by Ryuya Ishibashi

Other Decks in Technology

Transcript

  1. 事業譲渡されたブランドに
    Go言語を取り入れた話
    IoT系のプロダクト開発の裏側って?知られざる開発・
    運用ノウハウを2社のエンジニア6名が徹底解説!
    ENECHANGE × Smart Shopping

    View full-size slide

  2. Copyright © ENECHANGE Ltd. All Rights Reserved. | 2
    自己紹介
    Ryuya Ishibashi SES企業にて大小様々なプロジェクトに参画
    ● Ruby on Rails / Vue.js / PHP / C# / .NET / Drupal
    / AWS / Azureなどの技術に触れてきました

    ENECHANGE株式会社
    ● 2022/04 - 2023/03
    ○ Railsエンジニアとして、電気料金シミュレーションのAPI開
    発を中心にお仕事していました
    ● 2023/04 - ←いまここ
    ○ Go・インフラエンジニアとして、EV充電器のスポット情報
    API開発やAWS環境構築を中心にお仕事しています
    (@RubyKaigi2022)
    X / GitHub

    View full-size slide

  3. EVsmartブランドについて

    View full-size slide

  4. Copyright © ENECHANGE Ltd. All Rights Reserved. | 4
    EVsmartブランドについて
    ● EVsmartとは?
    ○ いくつかのサービスの総称 (統一的なブランド名称)です
    ■ EVの充電器検索、充電スタンド・スポット口コミサイト
    ■ 上記のアプリ版 (iOS/Android)
    ● 自動車メーカー様にOEM提供
    ■ 上記のAPI版
    ● マップサービス・カーナビ等に提供
    ● 事業譲渡について
    ○ 2022/09、EVsmartブランドはアユダンテ社から
    ENECHANGE社に事業譲渡されました

    View full-size slide

  5. Copyright © ENECHANGE Ltd. All Rights Reserved. | 5
    EVsmartブランドについて
    ● エネルギークラウド事業部 EV Unitの守備範囲
    ○ 赤字の箇所を主に担当しています
    ■ EVの充電器検索、充電スタンド・スポット口コミサイト
    ■ 上記のアプリ版 (iOS/Android)
    ● 自動車メーカー様にOEM提供
    ■ 上記のAPI版
    ● マップサービス・カーナビ等に提供

    View full-size slide

  6. 従来のEVsmartのアーキテクチャと課題

    View full-size slide

  7. Copyright © ENECHANGE Ltd. All Rights Reserved. | 7
    従来のEVsmartのアーキテクチャ
    mobile app backend
    Management
    Console
    Azure
    vm
    vm
    DB

    View full-size slide

  8. Copyright © ENECHANGE Ltd. All Rights Reserved. | 8
    従来のEVsmartの課題
    ● とにかくコードが読みづらく、保守が困難
    ○ 典型的なスパゲッティコード
    ● 杜撰なブランチ管理
    ○ master, testing, developブランチに謎の大量の差分がある
    ● …And So On!

    View full-size slide

  9. 解決方針と新アーキテクチャ

    View full-size slide

  10. Copyright © ENECHANGE Ltd. All Rights Reserved. | 10
    解決方法(アユダンテ社)
    ● コード自体を一から書き直す
    ○ 従来のコードを改善するのも同じくらいコストがかかる
    ● 言語自体もPHPではなく、Goを選択する
    ○ それなら、モダンで高速な静的型付け言語であるGoを採用しよう
    ● インフラも一から作り直そう
    ○ VMでなく、コンテナオーケストレーションサービスを利用しよう
    ● クラウドサービス自体もAzureではなく、GCPを選択する
    ○ それなら、今時のGKEを採用しよう

    View full-size slide

  11. Copyright © ENECHANGE Ltd. All Rights Reserved. | 11
    解決方法(ENECHANGE社)
    ● 基本的にはアユダンテ社の対応を踏襲するが、赤字の箇所だけ変更した
    ● コード自体を一から書き直す
    ○ 従来のコードを改善するのも同じくらいコストがかかる
    ● 言語自体もPHPではなく、Goを選択する
    ○ それなら、モダンで高速な静的型付け言語であるGoを採用しよう
    ● インフラも一から作り直そう
    ○ VMでなく、コンテナオーケストレーションサービスを利用しよう
    ● クラウドサービスは自社で強みのあるAWSを利用しよう
    ○ 既に開発運用実績のあるECS on Fargateを採用しよう

    View full-size slide

  12. Copyright © ENECHANGE Ltd. All Rights Reserved. | 12
    新しいEVsmartのアーキテクチャ
    mobile app
    backend
    Management
    Console
    Azure
    DB
    Gin Web
    Framework
    fargate
    frontend
    Gin Web
    Framework
    fargate
    AWS
    fargate
    backend

    View full-size slide

  13. Go言語の優れた要素

    View full-size slide

  14. Copyright © ENECHANGE Ltd. All Rights Reserved. | 14
    Go言語の優れた要素
    ● 高速性
    ○ 静的型付け言語で、事前コンパイルされているため、実行時の処理が速い
    ○ 参考) 実際のエンドポイントを用いた実験結果

    View full-size slide

  15. Copyright © ENECHANGE Ltd. All Rights Reserved. | 15
    Go言語の優れた要素
    ● 表現のシンプル性
    ○ 例) ループ処理はfor文しかない
    ■ Rubyのループ処理
    ● for, times, while, each, upto, downto, step, loop…
    ○ 誰が書いても似たようなコードになり、
    ■ 保守性に優れている
    ■ PRレビューも容易になりうる

    View full-size slide

  16. Copyright © ENECHANGE Ltd. All Rights Reserved. | 16
    Go言語の優れた要素
    ● Goroutineによる非常に軽量なスレッドの実現
    ○ 特徴
    ■ 少ないメモリ消費
    ■ 低い生成・破壊コスト
    ■ M:Nモデルによる、低いコンテキストスイッチ
    ○ 業務活用例
    ■ 1分毎の充電器の満空情報の更新処理に利用
    ■ 10 routinesによる同時実行により、
    確実に処理が数秒で終わるようになった

    View full-size slide

  17. Copyright © ENECHANGE Ltd. All Rights Reserved. | 17
    Go言語の優れた要素
    ● Interfaceを利用した柔軟なDependency Injectionの実現
    ○ Interfaceを活用することで非常に簡単にDIを実装できます
    ○ 業務活用例
    ■ 外部APIにリクエストするユースケースで、状況に応じて
    モックレスポンス ←→ 実リクエストを切り替えるようにしました
    type Client interface {
    Request(url URL, token string) ([]byte, error)
    }
    type RealClient struct{}
    type MockClient struct{}
    func NewClient() Client {
    cnf := config.GetConfig()
    if cnf.OcpiMockServer {
    return MockClient{}
    } else {
    return RealClient{}
    }
    }
    func (rc RealClient) Request(url URL, token string) ([]byte, error){
    // 実際のエンドポイントに対する通常のリクエスト
    }
    func (mc MockClient) Request(url URL, token string) ([]byte, error) {
    switch url {
    case "http://mock.com/api/versions":
    return mc.mockVersionsResponse()
    case "http://mock.com/api/2.2":
    return mc.mockVersionDetailResponse()
    default:
    return nil, errors.New("invalid API endpoint")
    }
    }

    View full-size slide

  18. Gin / GORMを利用するメリット

    View full-size slide

  19. Copyright © ENECHANGE Ltd. All Rights Reserved. | 19
    Gin / GORMを利用するメリット
    ● 前提
    ○ Ginとは?
    ■ Go言語によるWebアプリケーションフレームワーク
    ○ GORMとは?
    ■ Go言語によるORMライブラリ
    ● Gin / GORMを利用するメリット
    ○ 非常に簡単にMVCベースのWebアプリを構築できる
    ■ MVCフレームワークに馴染みのある開発者にとって理解が容易
    ■ Rails, Laravel等を採用している企業のファーストチョイスとしては
    良さそう
    ○ 両者とも最もメジャーなパッケージの1つであるため、ドキュメントやコミュニ
    ティが充実している

    View full-size slide

  20. Copyright © ENECHANGE Ltd. All Rights Reserved. | 21
    まとめ
    Goの開発は楽しい!

    View full-size slide

  21. Copyright © ENECHANGE Ltd. All Rights Reserved. | 22
    Goエンジニアを募集しています!
    We are currently hiring Go Engineers!!!

    View full-size slide