Yoshi.dev

技術系の趣味、またはやった仕事やそこから学んだことを忘れないために

技術日記6/10-6/14

ドメインオブジェクトの設計にテーブル設計もある程度引っ張られるのかと思ってたけどDDDにおけるドメインオブジェクトの設計とテーブル設計は全く別物として考えていいっぽい
これなら割とお試し?的にDDDやっていけるかも
ドメインオブジェクトはガンガン変更加えていくやつっぽいし

デザインができてきたのでここでgraphqlの設計を一部修正加えた

boostnoteでいろんなノートを取るようにしたら作業ログを取りにくくなってきた
作業ログ用専用ツールがほしい

javaの日付系ライブラリ何使えばいいのかずっと整理できてなかったけどやっぱりjava8以降では標準のTime Api使えば良いっぽい
ただ機能過多感が...
しかもまだまだjava8が広まりきってないのか知らんけど、protocol buffersのTimestampではjoda time使ってるし...

graphql×grpc通信のマイクロサービス×RDBという構成で作ってるけど、graphqlのオブジェクト設計とprotocol buffersの設計とtable設計で三箇所ほどでオブジェクトの設計をすることになっている
graphqlとtable設計でデータの持ち方(粒度)が違うのだけど(graphqlオブジェクトを取得するのにtable2,3個見る必要があるとか)
このときprotocol buffersはどんなふうに設計するかと言うのをちょろっと考えたけど、今回はgraphqlとprotocol buffersの設計粒度は基本揃えることにした
理由としてはまずgraphql apiゲートウェイサーバー)の仕事をシンプルにしたかったから
graphqlとprotocol buffersの粒度が揃っていない場合、別のgrpc呼び出しで取得したものをgraphqlサーバーで加工する必要が出てくると思う
ただなるべくそういったロジックのようなものはgraphqlサーバーではやりたくないなと思った
protocol buffersの設計粒度を細かくすれば、graphql意外の呼び出しとかにも対応できそうだけど、そのシチュエーションはあまり思いつかなかった
graphqlの設計変更につられて修正を入れるということはありそうだけど、そこはまあgraphqlの設計がミスってるせいだから
それにオブジェクトの設計がそれぞれのレイヤーでバラバラになりすぎると管理がめんどくさくなりそうだったから、揃えられそうなところはなるべく揃えたいというのもあった
ただテーブル設計は上のレイヤーの設計には引っ張られずにちゃんと正規化するべき

今更だけど初めてbinary search使った
この前アルゴリズムの勉強したからな
binary searchなんて基礎中の基礎だけど大事だわ
やっといてよかった
もっとアルゴリズムのちから伸ばしたいしAtcoderとかもやっていきたい

作業ログ残すときエラーメッセージと対応したときのコードも残せる場合は記録するようにした
ブログに落とし込むときとかそのまま貼れそうだし

graphql javaはslf4j使ってるのでlogback入れた
ログないとデバッグきつかったのでもっと早くやっといても良かった

テストコード書くのにkotlintestを使っていたけど、DIにKoin使っていて、両方共クラスの継承使ってて、なんか書き方が競合してるような感じで上手く一緒に使えなかったのでkotlintestは使うのやめた
Koinのテストとmockkは一緒に使えた
mockkはかなり使いやすいから安心した
kotlinはデフォルトでassert()関数持ってたけどログが微妙だったのでassertk入れた

殴り書き終了! Koinとmockkの部分は別記事にまとめたいな

AppSyncとはなんぞや

AppSync

  • マネージドgraphql
  • AWS AppSync(アプリデータをリアルタイムで保存、同期)| AWS
  • データソースにDynamoDB, Elasticsearch Service(ESS), Lambda, HTTP, Aurora Serverlessが使える
  • GraphQL Schema(クエリ定義)とResolverを与えるだけっぽい
  • 使用した分に対してのみ支払いが発生
  • クエリとデータ変更操作
    • クエリ及びデータ変更操作100万回につき4.00USD
  • リアルタイム更新
    • 動機状態を維持したいデータへのリアルタイム更新を受信できる
    • リアルタイム更新100万回につき2USD
    • AppSyncへの接続100万分につき0.08USD
  • 安い
  • Data Loaderのようなモノ、BatchInvokeというものがあるらしい
    • Lambdaデータソース限定
    • 本来複数回必要だったLambdaの実行を一回で済ませることができる
    • その他のリソースではData Loaderを使う必要がありそう

技術日記6/3-6/7

先週からちゃんと技術ノートを作るように意識し始めた 自分は記憶力がないから身につけた知識はある程度まとめておいていつでも引っ張り出せるようにしておかないとダメだなと思って ついでにある程度まとまったものはブログにコピペしてpublicに公開していこう

Firebaseのクラウドメッセージングのサーバー実装を軽くやってみた しっかりしたプッシュサーバーを整えるのにはもうちょっとちゃんと設計したほうがいいんだろうけどリソースの関係で一旦カジュアルに使っていきたい所存

DDDに最近興味があって勉強しているけどまだまだ実践に入れていくだけの知識と自信がない 有用性がもう少し感じられたらチームメンバーと勉強会とかして実践していきたい気持ちもあるけどそこまで行けるかどうか

JVM基礎

Jvm

メモリ空間

  • JVM上にJavaヒープ、Cヒープ、スレッドスタックの3つのメモリ領域がある。基本的にヒープと呼ばれているのはJavaヒープのこと
  • ヒープが一杯になるとOOME(Out Of Memory Error)

ヒープの再利用

  • 参照のなくなったオブジェクトはGCが掃除してメモリを開放してくれる
  • GCは自動で行われるが、System.gc()メソッドで任意に実行させることもできる(ただやる必要はない)
  • GC後もメモリ使用量が増加してしまうことをメモリリークという。これはプログラムの実行に必要ないにもかかわらず参照が残ってしまい、メモリがうまく開放できないときに起こる。メモリリークが起きるとGCが頻繁に起こる。
  • メモリリークが発生してるとわかった場合は原因の特定に務める
  • ファイナランザfinalize()メソッドをoverrideしてGC回収前に行う処理を実装できる

システムトラブル

  • システムトラブルの原因として考えられること
    • リソース不足
    • コネクションやスレッドのプール数不足
    • GCへ与えるスレッド数が足りずCPUを使い切れていない
  • GCはヒープの空きメモリ量が少ないと頻繁に実行される。つまり生きてるオブジェクト(参照があるオブジェクト)が大量にあり、空きヒープがないとGCが頻発する
  • GCの種類によってはGCが発生中はアプリケーションが停止する。
  • 停止問題にはスループット(単位時間(1秒とか))あたりの処理量)とレスポンスタイムの2つの観点からの対処アプローチ方法がある
  • 1処理のレスポンスタイムは同タイミングでGCが発生する可能性があることを考えると、最悪GCの実行時間+処理の実行時間になってしまう
  • スループットを求める場合は、GCの回数を減らして一回あたりのGCの時間は長くなるが、トータルとして単位時間あたりのGC実行時間は減らせばスループットが上がるというアプローチ
  • レスポンスタイムを短縮したい場合はGCの回数は増えるが、一回一回のGCは短い時間で終わるため、アプリケーションのレスポンスタイム(処理の実行時間+GCの実行時間)は短く保てる

3つのGC

  • シリアルGC
    • 一つのスレッドによるGC
    • スレッド一つで行うためGCの時間が長くなる
    • その分アプリケーションスレッド(アプリケーションの処理)の停止時間も長くなる
  • パラレルGC
    • 複数のスレッドによるGC
    • シリアルGCより短い時間でGCが終わる(ただしGCスレッド間の同期処理等のオーバーヘッドがあるためシリアルGCでの停止時間/GCスレッド数とはならない
  • コンカレントGC
    • アプリケーションスレッドを停止せずにGCスレッドを動作させる方法
    • アプリケーションスレッドの停止時間が短縮できる。しかし完全に停止時間をなくすことはできない

GCの4つのアルゴリズム

  • マーク&スイープGC
    • マークフェーズとスイープフェーズという2つのフェーズを実行するアルゴリズム
    • マークフェーズでは生きているオブジェクトにマーク付をする
    • スイープフェーズではマークのついてないオブジェクトを削除する
    • ヒープの空きは増えるがメモリの断片化問題が発生する
  • コンパクション
    • メモリの断片化を直すアルゴリズム
    • ヒープ内にバラバラに配置されたオブジェクトを並べ替えて、メモリ空間の断片化をなくす
  • コピーGC
    • そもそもメモリの断片化が起きないようにするためのアルゴリズム
    • ヒープをFrom領域とTo領域に分ける
    • コピーGC実行のタイミングで生きているFrom領域のオブジェクトをTo領域に断片化が起きないようにコピーする
    • 終わったらFrom領域を空にする
    • 最後にFrom領域とTo領域をスイッチする
    • デメリットとしては、From領域とTo領域に分けるため、使える容量が半分になる
  • 世代別GC
    • ヒープ領域を若い世代と古い世代に分けてそれぞれ別でGC管理する
    • 世代を分けて管理することでGCの処理時間を短くできる(参照が残り続けるオブジェクトを何度GCしても無駄なので)
    • オブジェクトがGCされた回数=年齢と呼ぶ(生きたオブジェクト)
    • 若い世代で一定年齢上がったオブジェクトは古い世代となる
    • 古い世代のGC頻度は低く、若い世代のGC頻度は多い

技術日記5/27-5/31

(めっちゃ亀ログ...)

今週はstaging環境作った

skaffold devでローカルのコード反映させるときにimageのtagとか意識しなきゃいけないのが結構つらみ..

Kotlin Ktorでサーバー作ってるけどspring bootのプロファイルみたいに便利に環境毎にpropertiesの値を切り替える方法は流石になさそう

とりあえずKoinでmodule定義するときに環境によって切り替えるようにした

マイクロサービスの開発においてgrpcのデバッグツール(クライアントツール)があったほうが良さそう

とりあえずGUIで使いやすそうでスター数、メンテ状況からbloomrpc使ってみてる

github.com

ただprotoファイルのimportがフォルダまたいでできないみたいなのがちょっと微妙かも

IntteliJ使ってたとき急にcommnad+shift+Aでコマンド検索するときターミナルが開くようになった

なんかmacのアプデでショートカットが追加されててそれと競合してたみたいなのでソッコーで無効化

Knativeのpodをkillしてもまた復活してくる

ksvcを削除したら大丈夫

spring-boot-gradle-pluginのアップデートでdistTarタスクがなくなって既存のビルドジョブが動かなかった問題も解決した

application pluginを使うとうまいことやってくれると docs.spring.io

Distributing with the application pluginのところにapplication pluginを使えと書いてあった

graphql java tools使ってgraphqlsファイルでスキーマ定義してるんだけど、schemaのコメントがうまく反映されない。バグ?

作業ログのとり方変えた

今週から作業ログのとり方を変えてみた 今までslackの個人chにログ書いてたけどslackだと他の部屋を行ったり来たりする必要があり

作業ログは取りたいときにサッと書きたかったのでそういった意味でいちいち個人chを都度開くというのがめんどくさかった

なので今はboostnoteを使うようにしてみた

上記の手間がなくなったおかげか今までより細かく作業のログを取るようになった

markdownで書けるしフォルダ管理も嫌いじゃない

ただ検索がファイル名検索とファイル内検索別々なのでそのへんがちょっと微妙かも(一発の検索でファイル名検索かつファイル開いたらファイル内の検索ワードもハイライトしてほしい)

それと作業ログなので書き込んだ時刻が勝手に記入されたほうがいい気もするのでその点ではやっぱslackがいいのかも、とか思った

あんま良いツールも見つからないのでもうこうなったら専用のエディタ自分で作るしかない?

とりあえずログのとり方が変わって今までより情報の整理ができるようになった気がする

Nginx Unit

Nginx Unitとか言うキーワードを初めて見たので軽くググって調べたことをメモ程度に軽く残しておく

www.nginx.com

https://www.nginx.com/wp-content/uploads/2017/09/dia-FM-2018-04-11-what-is-nginx-unit-03_1024x725.png この図イメージ掴みやすい

  • RESTful JSON API経由で動的に設定を変えられるっぽい
    • Programmability
  • 複数の言語とバージョンが動く
    • 一つのサーバーで複数のアプリケーションが動かせる
    • 複数の言語をサポート
  • Dynamic application process management
    • つまりアプリケーションの入れ替えや、バージョンの変更を動的に行えるっぽい
  • SSL/TLS support (OpenSSL 1.0.1 and later)
  • TCP, HTTP, HTTPS, HTTP/2 routing and proxying (調べたときのタイミングではcoming soon)
  • サービスメッシュの土台として使うことを想定してるっぽい

技術日記5/20-5/24

typescript×nodejsのデバッグ環境をvscodeで作った しかしexpressを使っている場合うまくブレークポイントが動かなかった

innodbでデータ削除時にストレージ容量が開放されない件を気にしていたけど、このスペースは後で再利用されるので、データの削除と登録を繰り返す分には問題なさそう

boostnote使い始めた

k9s使ってみた podの状態がリアルタイムで見れるのがいい感じ