2023/06/18

JJUG CCC 2023 Spring

このエントリーをはてなブックマークに追加

2019年からずっと登壇してなかったのですが、久しぶりにJJUG CCCで登壇することになりました。

 

今回のお題はVirtual Threadsです。

話の流れなどは、今年の1月に行われたブリ会議で話したことをベースにしています。ただ、ブリ会議が20分のセッションだったのが、CCCでは45分なので、コンテンツ的にはかなり変更してあります。

 

前半はVirtual Threads導入の背景、後半がVirtual Threadsの使い方になっています。

なぜ今になってVirtual Threadsが導入されたかというのは、歴史的経緯があるので、そこをちゃんと抑えましょうということです。

というのも、Virtual Threadsの目的はスループット向上なのですが、現状の技術でスループットは向上できるからです。たとえば、CompletableFutureやリアクティブ系のライブラリやフレームワークを使えばスループットは向上できます。

これらの技術を使いこなせればいいのですが、なかなか難しい点もあります。たとえば、

  • 関数を連ねて処理を記述するので、従来とは考え方を変えなければならない
  • 例外処理が難しい
  • デバッグが難しい

最初の考え方は慣れてもらうしかないのですが、最後のデバッグはなかなか難しい問題です。というのも、処理が複数のスレッドに分割して実行されるので、スタックトレースが切れてしまうからです。

スタックトレースはスレッドごとに存在するので、スレッドをまたがって処理を行えば当然スタックトレースは分割されてしまいます。それがデバッグを難しくしてしまいます。

そういう問題を解決するのがVirtual Threadsというわけです。

 

とはいっても、Virtual Threadsは今までのスレッドと使い方が同じなので、特にこうしましょうというのはないです。

サーバー系のシステムでリクエストに応じてスレッドをよしなに作ってくれるようなフレームワークを使っているのであれば、なおさらVirtual Threadsを意識する必要はないです。

というわけで、そういうフレームワークがVirtual Threadsに対応してくれるのを待ちましょうというのが結論ですw

フレームワークがVirtual Threadsに対応したら、何もしなくてもスループットが向上するかもしれません。

というようなことをセッションで話したら、今週になってTomcatがVirtual Threadsに対応したというじゃないですか。

Tomcatでさえ対応したのだから、他のフレームワークもVirtual Threadに対応するのは意外に早いかもしれません。

 

ただし、Virtual Threadsに限らず並行処理で注意する点というのもあります。

並行処理で重要になるのは、安全に処理できるかということと、スケールするかどうかということです。しかも、この両者はなかなか両立しません。

同期化やロックなどを使用して安全な処理を記述すると、その部分はスケールせずに並列処理のボトルネックになってしまいがちです。

特にVirtual Threadsを使い始めると、スレッド数が今までとは桁違いに多くなるため、スケールできるかというのは重要になります。

では、どうすればいいか。

設計を見直して、synchronizedを使った同期化をなるべく減らしていくしかありません。そのためには、イミュータブルなデータをベースに考えるようにすればいいと思います。特にJava 16で導入されたRecord型が役に立つはずです。

どうしてもsynchronziedが外せない処理があるのであれば、そこはロックAPIのReentrantLockに書き換えましょう。というのも、synchronizedを使用するとVirtual Threadsが動作するOSのスレッドをブロックしてしまうためです。

ReentrantLockであれば、ブロックするのはVirtual Threadsだけになります。

というようなことを45分で喋ってきました。あまりにも、ギリギリまで喋ってしまったので、質疑応答の時間が取れなくなってしまいました。ごめんなさい。

 

当日は気持ちの余裕がなくて、あまり他のセッションは聞けなかったのですが、ちょっとした感想を書いておきます。

 

Apache Commons Math を使って、機械学習をやってみた

浅野さんの機械学習のセッション。といっても、扱っているの古典的なクラスタリングのk-means。

k-meansぐらいならライブラリ使わなくても、自力で書けるぐらいですね。というか、書いたことがありましたww

やっぱりPythonと比べると記述量が多くなってしまうのはしかたないですね。でも、OpenCVSとか使えば、もうちょっと減らせると思います。

 

浅野さんが列挙してくれた機械学習系のライブラリの1つにWekaがあるのですが、これは使ったことがありました。

でも、Wekaはソースがひどいんですよねぇ...

アルゴリズムをそのままコードに落とした感じで、読みやすさとかそういうのはまったく考慮してない感じ。まぁ、大学で作ってるし、しかたないんですけどね。

 

AI を利用した Java 開発の最新情報

てらださんのOpenAI系のお話なんだけど、なんだかなぁ...

てらださん、もうちょっとプレゼンのしかた考えようよ...

 

Java Bytecode Crash Course

もともとChristoph Engelbertさんのセッションだったのですが彼が体調不良ということで、急遽David Buckさんのセッションに差し替え。

バイトコードの読み方入門的な内容でした。内容的にはほとんど知っていることでしたが、やっぱりこういうのはおもしろいよね。人を選ぶとは思いますがw

 

今回のJJUG CCCは現地開催でストリーミングありでしたが、なかなか大変そうでした。コストもかかるしね。

今回ストリーミングで見ていただいた方も、次回はぜひ現地でお会いしましょう!

0 件のコメント: