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

最大100倍高速化!PHPからJavaへのFFIを実現する、JNIを用いた高速なサーバAPIの...

Cygames
August 31, 2023

 最大100倍高速化!PHPからJavaへのFFIを実現する、JNIを用いた高速なサーバAPIの実装方法

2022/08/25 CEDEC2022

Cygames

August 31, 2023
Tweet

More Decks by Cygames

Other Decks in Technology

Transcript

  1. 6/36 経緯 サーバAPIにJWSの署名検証が必要になった サ ー バ 改 竄 チ ェ

    ッ ク ク ラ イ ア ン ト JWS (JSON Web Signature) JOSE Header JWS Payload JWS Signature
  2. 14/36 Jettyによる実装: 構成 Javaプロセス port 3520で Listen HTTP GET JWS文字列

    Load 署名検証 PHP-FPMプロセス リクエスト HTTP Response 署名検証結果 .jar PHP NGINX
  3. 20/36 JNIを使ったFFIの実装: パフォーマンス PHP-FPMプロセス PHP C Extension JNI Load 署名検証

    リクエスト 今回実装したFFI 同一プロセス内で完結 || IPCのオーバヘッドがない Java .jar JITでコンパイル済みの コードが実行され続ける (PHPのプロセスが作り直されるまで) PHP NGINX
  4. 21/36 JNIを使ったFFIの実装: アップデートの容易さ PHP-FPMプロセス PHP C Extension JNI Load 署名検証

    リクエスト 今回実装したFFI ここを差し替えるだけで バージョンアップできる Java .jar PHP NGINX
  5. 22/36 JNIを使ったFFIの実装: アップデートの容易さ ; Java classpath for JVM. separate with

    ':’. verify_jws.d_java.class.path='-Djava.class.path=./:/usr/lib64/php/modules/SomeJavaClass.jar’ ; JVM min. heap size verify_jws.xms='-Xms16m' ; JVM Max heap size. 32MB is sufficient for typical cases. verify_jws.xmx='-Xmx32m’ ; T arget Class Config verify_jws.invoke.class=‘SomeJavaClass' verify_jws.invoke.method=‘methodName' verify_jws.invoke.method_signature='(Ljava/lang/String;)Ljava/lang/String;' PHP extensionのiniで差替え設定可能 PHP extensionの再ビルドも不要
  6. 23/36 JNIを使ったFFIの実装: 運用のしやすさ PHP-FPMプロセス PHP C Extension JNI Load 署名検証

    リクエスト 今回実装したFFI このプロセスだけ監視 (従来通り) Java .jar NGINX PHP
  7. 24/36 JNIを使ったFFIの実装: 他の方式との比較 JNI FFI PHP Extension Jetty Server Pure

    PHP 処理速度 約1ms 約10ms 約100ms メンテナンスの しやすさ Jarを差替える Jarを差替える 移植実装が必要 追加の監視 不要 必要 不要