
技育展2022 MeetHack 感想戦🔥
こんにちは mahiroです
今回は技育展2022に参加した感想記事を書こうと思います!
この記事では技術的な内容が多めです、予めご了承ください🙇
また、技術について、まだまだ勉強中の身なので
もし間違い等あればご指摘いただけますと幸いです
先に結果!!🎉
優秀賞をいただきました🏆
すごく悔しいですが、技術的なトライをいろいろできてよかったです!!
MeetHackで優秀賞いただきましたー!!🏆
— Sino (@sino0042900) September 23, 2022
めっちゃ悔しいけど、技術的に色々チャレンジできてすごく良かった!!!
デザインなどさらに洗練させてくれたチームメイトには感謝しかないです、みんなありがとう!!#技育展 https://t.co/5XHSOLdTIr
作ったプロダクトの紹介
このアプリを一言でいうと
「交流会の最初から最後までサポートするアプリ」です
このアプリで以下のような課題を解決できます

アプリの使い方
チームメイトがおしゃれなHow To Useを作ってくれたのでお借りします🙇
アプリの使い方は以下のような流れです



技術的なお話
技術構成

フロント、サーバーはGCPのk8sに、DBはrenderにデプロイしました
認証回りはFirebaseで行っています
技術的なトライ
kubernetesへのデプロイ
k8sを利用するメリットとして、
可用性や拡張性、冗長性の向上などがあります
単語の意味を以下で軽く説明します
可用性
システムが継続して稼働できるか
拡張性 (スケーラビリティ)
負荷の増大に適応できるか
冗長性
耐障害性の高さ

Auto Scalingについて
k8sを使ってアプリのオートスケールを行っています
コードはこの辺です
以下の図のようにリクエストが少ないときはサーバーが2台構成ですが
リクエストが増え、負荷が大きくなったときに
自動でサーバーの台数が増えるようになっています

アプリの監視、自動復旧
k8sを使ってコンテナの監視を行います
コードはこのあたりです
今回は以下の2つの監視を行っています
livenessProbe
コンテナが動いているかどうか確認する
動いてない場合は再起動する
readinessProbe
コンテナがリクエストに応答できるか確認する
応答できない場合はリクエストが送られてこないようにする

Web Socket
交流会待機画面でweb socketを導入しています
正直今回はredisを利用せず、goでgorilla/websocketを使って実装しても良かったのですが
ふれたことのない技術を使ってみたい欲に負けて今回導入しましたw
実際、redisのPub/Subのコードはすごくシンプルでわかりやすく
Goで書くより何をしているのかイメージしやすかったです
(個人的な意見ですが)
コードはこの辺です

nginxをリバースプロキシとして利用
メリットとしては
自分の好きな形式でログをとることができたり、
またサーバーダウン時などの高度なルーティング処理も行えます

と、上記で理由を並べましたが
こちらも触ったことのない技術を使ってみたかった自分のわがままで導入しましたw
導入後にいろいろ知ったのですが
nginxがリバースプロキシとして利用されることは、最近あまりないらしいです
その理由としてはマネージドサービスで上記のことが代用できるためです
今回の場合はCloud Load Balancingで代用でき、
ログをとったり、ロードバランサとしての役割もこなしてくれます
しかしフロントの前にnginxを置き、
キャッシュサーバーとしての利用は現在もされているようです
関数型プログラミングライブラリの導入
チームメイトのF#を使いこなすつよつよエンジニアが導入してくれました👏

アーキテクチャ
毎度のことながら今回もクリーンアーキテクチャです
個人的に好きなのでよく導入しているのですが最近は
ハッカソンで導入するのが正解なのか悩んでます
ハッカソンではプロダクトの完成が最優先なので
ソースコードに関してはある程度責務が分離されているレベルで良い気がします
なのでクリーンアーキテクチャにこだわりすぎず、
レイヤードアーキテクチャなどの実装でも良いかなーと思ったりします

テスト / 負荷試験
フロントはVitestを使ってテストしてます
バックエンドはk6を使ってシナリオテストを書き、負荷試験を行いました

最後に
技育展、めちゃくちゃ楽しかったです!!!!
開発ももちろん楽しかったですが、ほかのチームの発表が自分にとって
すごく良い刺激になりました🔥
また、ハッカソンで作ったプロダクトをさらに成長させるという経験はとても勉強になりました
これまではハッカソンで作ったプロダクトは放置していたので
コードのリファクタリングやデプロイ先の変更、
新機能追加などの過程でいろいろな知見を得ることができました
おまけ
今回はDo'erとして技育展に参加しました
同志社生なら年齢関係なく誰でも入れます!
興味があればDMとかで連絡ください~
(ちゃっかり宣伝)