Spring Fest '19講演メモ「Reactive Spring」by Josh Long

springfest2019.springframework.jp

Josh Longさんの3時間コースのメモ。
とてもおもしろいセッション。
「美しい」と感じるライブコーディングを生で見たのは、はじめてかもしれない。
もう一度見たい内容。
ちなみに、英語で日本人を笑わせていているのすごい。

タイムテーブルから講演者のプロフィールを引用

Josh (@starbuxman) is the Spring Developer Advocate at Pivotal and a Java Champion.
He's host of "A Bootiful Podcast" (https://soundcloud.com/a-bootiful-podcast),
host of the "Spring Tips Videos" (http://bit.ly/spring-tips-playlist),
co-author of 6+ books (http://joshlong.com/books.html),
and instructor on 8+ Livelessons Training Videos (http://joshlong.com/livelessons.html).

メモ

  • APIリクエストが増えてきた時に、どう対応するか?
  • 需要が増えてきている
  • 簡単にやるには、今までは水平スケールアウト
  • 他にもオプションがある
  • CPUアイドル状態のアクティビティ多い
    • Input/Outputの待ち時間が多い
    • 本当はもっとコンピューティングできるはず
    • スレッドをたくさん使ってしまっていて、待ち状態になってしまっている
    • スレッドが問題
  • 持っているスレッドを効率よく使うという考え方。
  • Reactiveプログラミングはコンピューティングマルチスレッド
  • スレッドがデータを待っている状態に、他の人が待たなくていい
  • これが理想的
  • nioはjava 1.4 出てから18年経っている
    • 何故これを使わないのか?
    • ひとつは、使いにくい
  • Netty使っている方はいますか?
  • ここでやろうとしているのはリソースの効率化
  • そうなると、ロードバランサを使う
  • JDK9以降にReactiveStream入っている
  • Hibernate Entityがある
  • 1対多の場合、util.collectonを嫌っている
  • java.util.Setを使うと例外をthrowして、カーネルエラーになってしまう
  • そうなると、別のものを使っていく
  • これから改善する
  • ReactiveStreamが全てのものに対応する
  • ReactiveTimeが入っている
  • E2Eのサポートが入っている

Spring Initializr

  • jar or war
    • パッケージの選択肢わからない?
    • もしあなたが過去に急に飛んでしまったとしましょう。
    • その時は、warを利用してください。
    • そうではなく、2019年を生きているならjarを選んでください
    • 私にとっては大事な哲学 jar for all
  • Javaバージョン
    • 13,11,8 この中で正しいのは2つ
    • 私は答えを言いません。ヒントだけ言います。みなさん考えてくださいね。
    • (ここで画面拡大芸)
  • どれが正しくないJavaのバージョンか?
    • 正しくないのは8ですね
  • 8は安定しているが、よくないバージョン
  • あなたが意気地無しなら、Java11を
  • ベストな回答は、Java13
    • 最新版は、高速になってよりセキュア
    • 道徳的に倫理的に優れたバージョン
  • 子供に「Java8を使っている」と言えますか?
  • 言えないですよね
  • 恥だと思ってください
  • 13を使ってください


  • R2JDBC
  • Mongo
  • Mono
    • ReactiveStreamではなくReactiveからきている
    • フローコントールでは、バックプレッシャーとも言われる
    • マーケティングから言葉が出てきたんだと思う
    • 出すのは、Complete futureと同じ
    • 0 or 1
  • Flux
    • 0〜無限まで
    • Infinity Streamにも対応
    • Fluxのコードは9899行ある。
      • これを自分で書くのは大変ですよね?
      • 使った方がいい。
  • “Maki-san”
  • 「これはデモだからです。デモは常にうまくいきます」
  • 深刻なバグ
    • アートワークの無効化は誰も期待していない


  • Netty
  • 効率的な非同期のアプリ
  • RouterFunction
  • 例えば、株価は情報をすぐ知りたい
  • ユーザ数には限度がある
  • ソケット
  • Subscribe
  • スレッドスケジューラ
    • スレッドプール
  • CPUに負荷がかかる
    • 特にSlack
  • デフォルトでノンブロッキング
  • どこでブロッキングしているか知りたいのか
    • Reactor/BlockHound
      • CPUのスレッドをブロックしているものを見つけたら、例外にする
      • ブロックを検出してくれるので便利
  • konichiwa
  • sweet♪
    • (固定マイクから無線マイクに変更)
  • 私はこれからやらないといけないことがあります
    • みなさん、いい人なので失礼かなと思っている
    • JavaScriptを書きます」

空と同じ
海と同じ
星と同じ
皆さんとコードと同じでバグと同じ
無限に続く
宇宙の終わりまで続く

ここまで前半

  • セルフィーとっていいですか?
    • 15歳の娘がいる
    • 娘に「彼らは私の話聞いてくれる。あなたは私の話聞かないけど」と言いたい
  • エッジサービスの場合
    • 共通的なサービス
  • Api Gateway
  • RouteLocator
    • プロキシを作る
    • Host Filterでアクセスコントロールかける
  • RequestRateLimiter
  • Principal Name Key Resolver
  • パスワードのエンコーディング
    • BCrypeがデフォルト
    • MapReacitiveUseDetailServie
    • 私がこれをやる時、SpringSecurityの統括者は
      • @rob_winch becomes sad :-(
    • ハードコードされたユーザネームパスワードを使わないでください
    • (デモでパスワードをハードコーディング)
  • X-Rヘッダ
  • 429 Too many Request
    • 429 429 429
  • これまでは、ThreadLocalに依存していた
  • ReactiveTransactionManager
  • R2dbcTransactionManager
  • TrancationaOperator
  • 皆さんが、誰も見ていないところでも絶対やっちゃいけないことをします。
    • コピペです。
  • LBへのコール
    • 有効でなかったら onError
    • EEEK!
    • retryBackoff
  • ハロウィンはアメリカの祝日です
  • サーキットブレイカ
    • 使えるサービスがない場合、そこで止めるといい
    • 継続的にリトライするか、そこで諦めるか選べる
    • 4つくらいある
      • Resilience4j
      • Hystrix
      • Alibaba
      • Reactive Circuit Breaker
  • 仮にエッジサービスとしましょう
    • 依存サービスをコールしている場合、SLAはどうなるでしょう?
    • 実際半分
    • 私なら、デフォルトではタイムアウトは使わない。スケーラビリティがついてこない
  • “I hedged my bet.I put some money on red and some on black in the casino.”
  • Flux first( host1, host2, host3)
    • 3つすべてにリクエスト送って、レスポンスが早いものからとる。他はキャンセルする。これは、副作用がないサービスに限る
    • 副作用がないサービスに限る。
    • Http1 テキスト
    • Http2が解決した
  • RSocket
    • 真なるバックプレッシャーなリアクティブを実現する
    • 常にコネクションを有効にする
    • gRPCに変わる
    • gRPCはコードの生成が必要になる
    • Webソケットはヘッダがない
      • 例えば、トークンを利用できない
    • RSocketはNetflixからFacebookに転職した人が作った
    • ペイロードに異存はありません
    • ダウンストリームのサービス
    • WebSocketは途中で切れない
    • RSocketであればresumeが可能
      • モバイルでトンネルに入ってしまった時
      • RSocketの場合、ポインタを持っているため、再開できる
      • Facebookで、どれだけサーバーコストを削減できるでしょうか
  • Aribaba
    • 組織全部がSpringベース
    • 10年以上そんな感じ
    • 24時間で300億ドル儲けた
    • 6年前に「SpringBoot」
    • 次に「SpringCloud」
    • 一年前に「RSocket」の話した
    • 今多くのサービスがRSocketを使っている
  • ここにクレイジーなチャンスがあると捉えてください
  • KotlinにはCoroutineがある
    • 同期的書けるのに非同期
  • strong.io にYouTube動画がある。70本くらい・
  • Spring MVC
  • WebFluxをTomcatやJettyで使うことはできるが、メリットをフルに使えない
    • エンドポイントはいいけど、大変なのはデータアクセス部分
  • It’s OK
  • Fun!