Найти Π² Π”Π·Π΅Π½Π΅
Java

πŸš€ УскоряСм Spring Boot Π±Π΅Π· измСнСния ΠΊΠΎΠ΄Π°

МногиС прилоТСния тормозят Π½Π΅ ΠΈΠ·-Π·Π° бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ, Π° ΠΈΠ·-Π·Π° логирования. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π»ΠΎΠ³ - это I/O опСрация. ΠŸΡ€ΠΈ высокой Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ это становится ΡƒΠ·ΠΊΠΈΠΌ мСстом. РСшСниС - асинхронноС Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· Logback. Π§Ρ‚ΠΎ происходит: - сообщСния ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ - ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡ… Π² Ρ„ΠΎΠ½Π΅ - основной ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ блокируСтся - мСньшС Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ ΠΈ Π²Ρ‹ΡˆΠ΅ throughput Настройка проста - Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ logback-spring.xml Π²: src/main/resources/ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ: <configuration> <!-- Async wrapper --> <appender name="ASYNC_CONSOLE" class="ch.qos.logback.classic.AsyncAppender"> <appender-ref ref="CONSOLE"/> <queueSize>5000</queueSize> <discardingThreshold>0</discardingThreshold> <includeCallerData>false</includeCallerData> </appender> <!-- Console appender --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern> %d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger - %msg%n </pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="ASYNC_CONSOLE"

πŸš€ УскоряСм Spring Boot Π±Π΅Π· измСнСния ΠΊΠΎΠ΄Π°

МногиС прилоТСния тормозят Π½Π΅ ΠΈΠ·-Π·Π° бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ, Π° ΠΈΠ·-Π·Π° логирования.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π»ΠΎΠ³ - это I/O опСрация. ΠŸΡ€ΠΈ высокой Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ это становится ΡƒΠ·ΠΊΠΈΠΌ мСстом.

РСшСниС - асинхронноС Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· Logback.

Π§Ρ‚ΠΎ происходит:

- сообщСния ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ

- ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡ… Π² Ρ„ΠΎΠ½Π΅

- основной ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ блокируСтся

- мСньшС Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ ΠΈ Π²Ρ‹ΡˆΠ΅ throughput

Настройка проста - Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ logback-spring.xml Π²:

src/main/resources/

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

<configuration>

<!-- Async wrapper -->

<appender name="ASYNC_CONSOLE"

class="ch.qos.logback.classic.AsyncAppender">

<appender-ref ref="CONSOLE"/>

<queueSize>5000</queueSize>

<discardingThreshold>0</discardingThreshold>

<includeCallerData>false</includeCallerData>

</appender>

<!-- Console appender -->

<appender name="CONSOLE"

class="ch.qos.logback.core.ConsoleAppender">

<encoder>

<pattern>

%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger - %msg%n

</pattern>

</encoder>

</appender>

<root level="INFO">

<appender-ref ref="ASYNC_CONSOLE"/>

</root>

</configuration>

Когда это особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ:

β€’ high-load сСрвисы

β€’ микросСрвисы с большим количСством Π»ΠΎΠ³ΠΎΠ²

β€’ API с высокой RPS

β€’ ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½-ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅

⚠️ Π’Π°ΠΆΠ½ΠΎ: ΠΏΡ€ΠΈ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ‡Π°ΡΡ‚ΡŒ Π»ΠΎΠ³ΠΎΠ² ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Π΅Ρ€ΡΡ‚ΡŒΡΡ. Для ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹Ρ… Π»ΠΎΠ³ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» + async.

МалСнькая настройка - большой прирост ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

#SpringBoot #Java #Backend #Performance