サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
CES 2025
n-agetsuma.hatenablog.com
この記事は赤帽エンジニア Advent Calendar 2019の12/11分の記事です。 今日は日本JBossユーザグループでQuarkus入門について話しましたが、スライドはこちらです。今日の記事では、スライドに入りきらなかった qute について紹介します。 背景 今年の4月にGlassFishユーザ会に向けてQuarkus0.14.0を触りながら、実際の開発で使うならば欲しいと思った機能が2つありました。 Hibernate以外のDBアクセスの選択できること スキーマが複雑になるほどSQLを直接書きたいユーザは多い Thymeleafのようなサーバサイドで使えるテンプレートエンジン DBアクセスについては、Quarkus自体のアーキテクチャがVert.xベースになったことにより、スライドでも言及している Quarkus - Reactive SQL Clients が導入され、元
GlassFish Users Group Japan 勉強会 2019 SpringでQuarkusについて紹介しました。話そうと思っていたけれどもスライドに入らなかったことをブログで補足してみます。 Quarkusとは何か とにかく起動が高速な Java EE / MicroProfile ベースのAPIでコードが書けるフレームワークです。スライド中でも言及していますが、GraalVMのnative-imageコマンドによってネイティブコンパイルすると100ミリを切るスピードでJAX-RS/CDI/JPAで構成されるCRUDアプリケーションが起動します。 Javaは起動が遅い、Goのようなシングルバイナリによる起動の方が便利でJavaは手間が掛かると言われる課題を解決しています。 続きについてはスライドを参照してください。ここからは、スライドに入らなかった内容や、当日話そうと思っていた
この記事はElastic stack Advent Calendar 2017の12/6分の記事です。 ElasticスタックによるApacheアクセスログやsar情報などのメトリクス収集を初めて導入した後の頻出トラブルとして、インデックスのオープンしすぎによるJavaヒープメモリ枯渇がある。 検索エンジン用途や、運用監視業務に組み込むような「本気の」運用では、事前にサイジングが行われる。しかし、まずはシステム状況が可視化できるかお試しで導入を始めると、とりあえず運用を始め、インデックスのクローズや削除、スナップショットの定期取得などの運用管理計画はどうしても漏れがちとなる。 では、具体的にElasticsearchはだいたい何ヶ月分のメトリクスが保存できるのが次の疑問になるが、以下のような多様な要素が作用するため、要件に合わせて実機検証が必要となる。 登録するメトリクスの種類 Apach
Elasticsearchには、クライアントから複数のリクエストをまとめて送信するBulk API機能がある。JDBCのexecuteBatchのようなイメージで使える。 JDBCの場合、Oracleのドキュメントでは、バッチ単位のガイドライン*1として「バッチ・サイズを50から100の一般的な範囲に保つことをお薦めします」が示されている。Elasticsearchの場合、バルクサイズごとにどの程度スループットに差が出るのか実測してみた。 測定環境 Elasticsearch 6.0.0-rc2 Elasticsearch6で導入されたJava High Level REST Client JUnit 5 Oracle JDK 1.8.0_152 MacBook Pro (13-inch, Late 2016) テストアプリケーションからlocalhost上のElasticsearchに接
Kafkaのコンシューマグループに、コンシューマを追加すると、各コンシューマがどのパーティションを読み取るか再割り当てするリバランスが行われる。 Kafka0.11.0.1を対象に、以下の観点でKafkaの実装を調べてみた結果をまとめる。 リバランスはいつ行われるのか なぜ新規コンシューマ追加しても、すぐにメッセージ配信が始まらないのか リバランスが起こった時に重複メッセージ処理は発生しないか リバランスはいつ行われるのか KafkaConsumer.poll()メソッドの内部で行われる。 Kafkaのコンシューマの実装はだいたい以下のようになる。コード全体はgist参照。 Kafka Comsumer Sample · GitHub KafkaConsumer<String, String> consumer = new KafkaConsumer<>(properties()); co
Kafkaコンシューマの監視した方が良いメトリクスとして、datadog*1のドキュメントや、HortonworkによるKafkaのベストプラクティス*2ではrecords-lagが紹介されている。 このコンシューマのlagとは具体的にどのように計算された値か、以降にまとめる。以下の内容は、KafkaのJavaクライアント0.11.0.0で調べている。 records-lagについて records-lagとは、Kafkaのコンシューマのメトリクスで、コンシューマプロセスのJMX MBeanとして公開されている。この値は、Kafkaのブローカー側の最大オフセットと、コンシューマが処理済みのオフセットの差分を示す。jconsoleで見ると、以下のようにmy-topic-0.records-lag、my-topic-0.records-lag-avg、my-topic-0.records-la
Kafkaのメッセージロストの原因の1つに、プロデューサの設定のretries(デフォルト0:リトライしない)の未設定がある。 Kafkaクライアントの送信リトライ プロデューサからメッセージ送信時のエラーには、retires設定によりKafkaのクライアントライブラリ内で自動リトライ可能なエラーと、リトライせずにProducer.sendメソッドの呼び出し元に例外を投げるエラーがある。自動リトライ可能なエラーで発生する例外は、org.apache.kafka.common.errors.RetriableExceptionの継承クラスである。代表的なものを以下に示す。 retiresによりリトライするエラー NotLeaderForPartitionException リーダーパーティションではないブローカーにメッセージが送られた場合のエラー応答。ブローカー障害によるフェールオーバ中にメ
Elasticsearch 5.xからはIngest Nodeを使うと、Logstashを使わなくてもElasticsearchでログの変換ができるとElastic社のスライドにまとまっていたので、LogstashからIngest Nodeへの移行についてメモ。 LogstashからIngest Nodeへの移行 今までFilebeatで集めてきたログをLogstashに送ってjson変換していたところ、Elasticsearchで直接json変換できるようになるため、Logstashを使わなくてもログの収集と可視化が可能となる。 Filebeat(収集) -> Logstash(変換) -> Elasticsearch(蓄積) Filebeat(収集) -> Elasticsearch(変換/蓄積) Logstashのfilterプラグインの多くはIngest Nodeの機能にProce
この記事は Java EE Advent Calendar 2016の12/13分の記事です。 昨日はsuke_masaさんの必要最小限のサンプルでThymeleafを完全マスターでした。 明日は@kazuhira_rさんです。 Payara MicroやWildFly Swarmをベースとしたマイクロサービス対応の共通仕様の規定を目指しているmicroprofile.ioでは、Circuit Breakerの仕様盛り込みがこのスレッドで議論されています。 Circuit Breaker実装というとHystrixが有名ですが、上記スレッドでCommons Langに簡易なCircuit Breaker実装が追加されたことに言及があったため紹介します。 2016年10月にリリースされたCommons Lang 3.5より、LANG-1085により、シンプルなBreaker実装が加わっています
トラブルシューティング時に、バッチ取り込みによるKibanaアクセスログ可視化を行う場合、ログの取り込みに掛かる時間は短い程嬉しい。 もちろん測定条件やチューニングにも依存すると思うが、手元のマシン*1においては、Logstash2.2を使うより、Embulk v0.8.5を使った方が早かった*2。 Logstashではgrokのおかげで、たとえばリクエストURLならrequestフィールドなど、フィールド名が固定化されるが、Embulkの場合、各人が自由にパースすると各々の項目に対して微妙に異なるフィールド名を付与し、チームでダッシュボードが共有しにくい。 Logstashの以下のコンフィグで読み込んだフィールドの構成と同じように、EmbulkでElasticsearchにデータをロードできないか考えたのでメモする。 input { stdin {} } filter { grok {
Oracleの公式ドキュメントには、-Xmxが未指定であった場合のエルゴノミクスによる最大ヒープサイズは『32GBを上限として、物理メモリの4分の1』書かれている。32GBは-XX:-UseCompressedOopsにより圧縮Oopを明示的に無効にした場合の最大デフォルトヒープサイズで、何もオプションを付けずに起動した場合は29GBが上限。 ヒープサイズの決定はarguments.cppのArguments::set_heap_size()で計算されている。デフォルトの最大および初期ヒープサイズは、物理メモリ量により異なる。 デフォルト最大ヒープサイズ(-Xmx) 物理メモリが248MB以下の場合 物理メモリの2分の1。 248MBは-XX:MaxHeapSize(デフォルト124MB) x -XX:MinRAMFraction(デフォルト2)の値。 物理メモリが248MBより大きい場合
JavaOne 4日目の夜には、毎年トレジャーアイランドでOracle Appreciation Event(オラクルによる感謝祭?)が行われ、有名な方のライブが行われる。今年はエルトンジョンとBECKだった。毎年寒いので、薄手のダウンなど暖かい服装が必須。 4日目は以下のセッションに参加。 [CON2709] The New HTTP Client API, Including HTTP/2 and WebSocket [CON2809] Deep Dive into Top Java Performance Mistakes in 2015 [CON6446] WebSocket in Enterprise Applications [CON6856] Saving the Future from the Past [CON2709] The New HTTP Client API,
この記事は Java EE Advent Calendar 2015の12/7分の記事です。 明日は@btnrougeさんです。 Java EEのAPIが直接関連する話ではなくて恐縮ですが、サーバサイドJavaでファイルI/Oを含むバッチ処理の性能Tipsをまとめます。 テーマはjava.io.BufferedWriterクラスのバッファサイズについてです。 デフォルトは8KBでBufferedWriterのコンストラクタにおいて変更可能ですが、javadocには以下の記載があります。 バッファのサイズは、デフォルト値のままにすることも、特定の値を指定することもできます。デフォルト値は、通常の使い方では十分な大きさです。 http://docs.oracle.com/javase/jp/8/docs/api/java/io/BufferedWriter.html あまり変更する機会もないせ
JSF2.2のビッグチケットとして盛り込まれたステートレスビューですが、HttpSessionへのアクセス量を減らせるメリットの一方、制約事項もあります。Wildfly-9.0.0.CR2(mojarra-2.2.11)で色々と試してみたので以下にまとめます。 ステートレスビューの使い方 <f:view transient="true">で囲うだけで、対象のビューのフォーム値などの状態をセッションに保持しなくなります。 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"> <f:view transient="true"> <h:head> <title>JSF Hello World</title>
監訳者の@cero-tさんから頂きました。@cero-tさん、ありがとうございます。 Javaパフォーマンス 作者: Scott Oaks,アクロクエストテクノロジー株式会社(監訳),寺田佳央(監訳),牧野聡出版社/メーカー: オライリージャパン発売日: 2015/04/11メディア: 大型本この商品を含むブログ (3件) を見るJavaトラブルシューティングに関する仕事に関わっていると、まだ切り分けができていない性能遅延の原因について、GCが疑われることが良くあります。『自動で動く』ことによるブラックボックス感によりGCは疑われやすくなっていると思います。 しかし、実際に色々な案件の解析を繰り返すと、性能遅延の要因は多種多様です。過去に遭遇した代表的なものには、GC以外にも以下のような遅延要因があります。 アプリケーションの不効率なロジック (ループ過多、オブジェクト生成過多) 過度なロ
まだまだエンタープライズな分野ではJAX-WSがシステム間連携に使われることが多い。wsdlからスタブを生成するMavenプラグインの使い方に関するメモ。 JAX-WS Mavenプラグイン https://jax-ws-commons.java.net/jaxws-maven-plugin/ にJAX-WSの参照実装Metroの一部として提供されている。最新バージョンは2.3。 pom.xml の書き方 wsimport (wsdlからスタブコード生成) の例。設定可能なパラメータの一覧より、よく使う部分だけ以下に記載する。 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema
OracleのJDBCドライバと同様に、PostgreSQLのJDBCドライバにも同様のタイムアウト設定が用意されています。@yamadamnさんがWebLogicServer + Oracle JDBC向けにまとめた資料Oracle JDBCドライバプロパティの活用を参考に、WildFly + PostgreSQL版のタイムアウト設定を以下にまとめます。 データベース接続時のタイムアウト PostgreSQLのデータベース接続時のタイムアウトには2種類のパラメータがあります。いずれもデフォルトは未設定で、Javaのレイヤではタイムアウトの設定はされず、NW障害時やDBハングアップ時にはOSのTCP接続タイムアウトまで待ちます。 loginTimeout=<秒> このタイムアウト設定はTCP接続のタイムアウトではなく、ログイン処理全体のタイムアウトを示します。PostgreSQLへのログイ
2014年4月にCDI仕様のマイナーアップデート CDI1.1 -> CDI1.2 *1が行われ、@java.inject.Singletonが付与されたクラスはデフォルトではインジェクションできるBean対象から外れました。 後方互換性のない変更であるため、以下にまとめます。 default bean-discovery-modeの見直し CDI1.1 (Java EE7) から導入されたbean-discovery-modeについての詳細は過去の記事にまとめていますが、簡単にいうと、以下の場合にどのクラスをインジェクション対象としてスキャンするかの仕様が見直されました。 warやearにbeans.xmlを含めなかった場合 またはbeans.xmlにbean-discovery-mode="annotated"を明示していた場合 @java.inject.Singletonがスキャン対
この記事は JVM Advent Calendar 2014の12/5分の記事*1です。昨日は @jyukutyoさんのJITWatchでJITコンパイルを見よう!でした。 HotSpotには-XX:+DisableExplicitGCというオプションがありますが、この挙動がJDK8のリリースから変わっていたのでまとめます。 -XX:+DisableExplicitGC とは System.gc()でGCリクエストされても無視するオプションです。アプリケーション中でSystem.gc()を実行されるとメジャーGCが発生します。HotSpotに任せた場合はマイナーGCで十分回収できたかもしれないので、アプリケーションでSystem.gc()を呼び出すのはあまり好ましいことではありません。 無視するといっても内部的にそんな難しいことは行われておらず、OpenJDK8のソースを見るとif文でオプ
本書のレビューアの方から頂いたので読んでみました。以下、感想です。 詳解 Tomcat 作者: 藤野圭一出版社/メーカー: オライリージャパン発売日: 2014/12/26メディア: 大型本この商品を含むブログを見る 最近、Twitterのタイムラインで『はじめてのXXXや、XXX 入門じゃなくて、もっと至高のXXXとか終焉のXXXみたいな書籍が欲しい』のような意見を目にした気がしますが、本書はまさに詳解Tomcatでした。設定方法を羅列するのではなく、Tomcatはどういくアーキテクチャで成り立っていて、各機能の詳細な挙動はどのような仕様なのかがまとめられています。 1章 Tomcatとは 〜 2章 Tomcatの基本 までは、背景やインストール方法などの色々な書籍で見かける導入部分の内容です。3章 アーキテクチャからが本番です。 Tomcatアーキテクチャの文書化が嬉しい 普段Tomc
この記事は Java EE Advent Calendar 2014の12/17分の記事です。昨日は @glory_ofさんのJAX-RSのレスポンスでした。明日は@nagaseyasuhitoさんです。 Java EE8では、『使い方が複雑・各APサーバ固有のレルム設定がよくわからん』とあまり評判のよくないセキュリティ周りの機能の再整理*1が行われようとしています。 しかし、Java EE8の仕様がリリースされるのはだいぶ先の2016年。 そんなに待てないので、Apache Shiroを試してみました。 Apache Shiroの既存の他の記事は部分的なコードの抜粋が多く、動かせるコードがあまり見当たらなかったので、GitHubにサンプルコードとしてまとめてみました。 Apache Shiro とは Easy To Useを一番の目的にしたJavaのセキュリティフレームワークです。 歴史
HotSpotJVMの監視・解析OSSツールであるHeapStatsをChefでインストールできるようにクックブックを作ってみた。 n-agetsu/chef-heapstats · GitHub HeapStatsとはなんぞやについては、JJUGナイトセミナーなどのスライドやキャスレー技術ブログ JavaVM監視・解析ツール HeapStatsを使ってみた参照。特に後述のブログには公式のwikiよりも詳しくまとまっている。 簡単にいうと、ヒープダンプのように一気に負荷をかけなくても、FullGC契機に少しずつヒープ情報をロギングしてくれる優れものである。 HeapStatsはアタッチ先のJVMへのオーバーヘッドを抑えるため、対応しているマシンが対応しているCPU命令セット(sse4 or avx or いずれも未対応)に応じてインストールするrpmファイルが異なる。このクックブックを使う
JDK8およびJDK8u20では、GCログに関連する2つの便利な機能が追加されている。いずれの機能も2014/8現在最新のJDK7 update 67 には含まれていないが、JDK7u80にてバックポートされる予定。 GCログにpidと日付を含める (JDK8より) JAVA_OPTS="$JAVA_OPTS -Xloggc:/var/log/wildfly/gc_%p_%t.log" => 実際のファイル名例 : gc_pid31455_2014-08-31_14-20-16.log.0GCログのフォーマットに%pを入れるとpid形式のプロセスIDが付与される。また%tを付与すると"_2014-08-31_14-20-16"のようにGCログファイルを作成した日付時分秒が追加される。かつてGCログはJavaを再起動すると同じファイルが上書きされて消えてしまうため、出力先を-Xloggc:g
OutOfMemoryErrorの主な要因例として、DBMSからデータを取得しすぎがあります。 LASYフェッチによるN + 1 問題を回避するために、結合先テーブルの要素を一気に持ってくるJOIN FETCHを使ったところ、引き換えにJavaヒープ使用量が多くなるのはよくあるケースです。 以下のような、1つのIssueに対して複数のIssueAttributeを持つ1対多関連のエンティティの操作を例に、OutOfMemoryErrorを少しでも避ける方法を考えてみます。 @Entity public class Issue implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue private int issueId; private String tit
Java EE を使っている人なら多くの人が遭遇するクラスローダリーク。EclipseなどのIDEでホットデプロイしながら開発していると、突然APサーバから応答がなくなったり、java.lang.OutOfMemory : PermGenが出力されたりする。 原因についてはnekopさんのスライドやyamadanさんのブログに紹介されているので、ここではクラスローダリークを手元で再現させてみて、どのようなヒープダンプになるか紹介する。 ヒープダンプの解析にはEclipseMemoryAnalyzer(MAT)を使う。 1. Duplicate Classes を確認する クラスローダリークが発生している状況では、同一のクラスが異なるクラスローダよりロードされている事象が起こっている。MATでは重複クラスロードの一覧を表示する機能があるため、1クリックで確認できる。 Tomcatの場合 To
定番のスケジュール実行としてはcronがあるが、Java EEにおいても同様の機能が用意されている。Java EE 5以前では『x秒後に実行する』ような機能しかなかったが、Java EE 6(WLS12c/JBossEAP6など)以降ではcron風にカレンダー形式で設定ができる。 使い方 Java EE 6から導入されたアノテーションによるタイマー設定と、従来からあるAPIによるタイマー設定の両方を紹介する。 @Scheduleによるタイマー設定 昔のcron.dailyのように、毎日4時2分に動かしたい場合。 @Scheduleを付与したメソッドが、対象の時間になるとコールされる。EJBなので、timeout()メソッドはトランザクション・コンテキスト内として実行される。 import javax.ejb.Schedule; import javax.ejb.Singleton; @Si
以前の記事でトラブルが起きた後の初動対応を書いてみたが、いざトラブルに遭遇すると、まず再起動してからどうするか考えるケースが多いと感じている。しかし何も情報がないと『情報がない/再現方法が不明』などの理由からそのままお蔵入りになってしまう。今回はトラブルに事前に備えるために、地味だけど大切なJavaVMのオプションをまとめてみる。 GCログの出力とローテーション OutOfMemoryError発生時のヒープダンプ自動出力と出力パス設定 JavaVMクラッシュログの出力パス設定 JVMオプションの設定 (OpenJDK/OracleJDK) JavaVMにはGCおよびヒープメモリの状態をロギングする仕組みや、OufOfMemoryError時にヒープダンプを自動的に出力するような障害に備えて自動的に情報を出力する機能がある。おすすめのオプション*1は以下の通り。 java -Xms?g -
アプリケーションサーバでありがちなトラブルとしてDB接続プールの枯渇がある。原因はチューニングミスやSQLが長時間化してプールにコネクションが返って来ないなど色々とあるが、負荷試験時にモニタリングしておくと多くの問題は事前に検知・対処できる。JBossAS7以降、JBossにはHTTP API経由でサーバの運用状況を示すjsonを取得できる便利な機能がある。今回は、この機能を使って特にトラブルが起こりやすいデータソースの状況を取得し、GrowthForecastでグラフ化できないか考える。 JBossのHTTP 管理API デフォルトでポート9990からアクセスできる。アクセスには認証が必要で、add-user.shで作成した管理ユーザのアカウントを使う。 以下の例ではデータソース名『PostgresDS』の状態をjson形式で取得する。 curl --digest -D - http:/
次のページ
このページを最初にブックマークしてみませんか?
『n-agetsumaの日記』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く