Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ²

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² ΠΌΠΈΡ€Π΅ java. ΠŸΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

Основной ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ программирования гласит: Π½Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π°Ρ‚ΡŒ вСлосипСд. Но ΠΈΠ½ΠΎΠ³Π΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ происходит ΠΈ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ инструмСнт Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. БСгодня ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π°Π΅ΠΌ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ выполнСния Π·Π°Π΄Π°Ρ‡.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ вас которая Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ процСссора:

ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ быстрСС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ряд Ρ‚Π°ΠΊΠΈΡ… Π·Π°Π΄Π°Ρ‡, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ*:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ²

ВрСмя выполнСния 104 сСк.

Как Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСссора Π½Π° ΠΎΠ΄ΠΈΠ½ java-процСсс с ΠΎΠ΄Π½ΠΈΠΌ выполняСмым ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ составляСт 100%, Π½ΠΎ общая Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° процСссора Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ пространствС составляСт всСго 2,5%, ΠΈ Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… систСмных рСсурсов.

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ большС, Π΄ΠΎΠ±Π°Π²ΠΈΠ² большС Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ²

ThreadPoolExecutor

Для ускорСния ΠΌΡ‹ использовали ThreadPool β€” Π² java Π΅Π³ΠΎ Ρ€ΠΎΠ»ΡŒ ΠΈΠ³Ρ€Π°Π΅Ρ‚ ThreadPoolExecutor, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ нСпосрСдствСнно ΠΈΠ»ΠΈ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² классС Utilities. Если ΠΌΡ‹ заглянСм Π²Π½ΡƒΡ‚Ρ€ΡŒ ThreadPoolExecutor, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΉΡ‚ΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ:

Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ, Ссли Π·Π°ΠΏΡƒΡ‰Π΅Π½ΠΎ большС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Ρ‡Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡƒΠ»Π°. Если Π·Π°ΠΏΡƒΡ‰Π΅Π½ΠΎ мСньшС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΏΡƒΠ»Π°, ΠΏΡƒΠ» ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚ ΡΡ‚Π°Ρ€Ρ‚ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ:

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ addWorker запускаСт Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ с Π·Π°Π΄Π°Ρ‡Π΅ΠΉ Runnable, которая ΠΎΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ workQueue Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ ΠΈ выполняСт ΠΈΡ….

ThreadPoolExecutor ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ понятный javadoc, поэтому Π½Π΅Ρ‚ смысла Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Ρ„Ρ€Π°Π·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ВмСсто этого, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ наш собствСнный:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Ρ‚Ρƒ ΠΆΠ΅ Π·Π°Π΄Π°Ρ‡Ρƒ, Ρ‡Ρ‚ΠΎ ΠΈ Π²Ρ‹ΡˆΠ΅, с нашим ΠΏΡƒΠ»ΠΎΠΌ.
МСняСм строку Π² MultithreadClient:

ВрСмя выполнСния практичСски ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ β€” 15 сСкунд.

Π Π°Π·ΠΌΠ΅Ρ€ ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π΅Ρ‰Π΅ большС ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ количСство Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² ΠΏΡƒΠ»Π΅ β€” Π΄ΠΎ 100.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ врСмя выполнСния ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»ΠΎΡΡŒ Π΄ΠΎ 28 сСкунд β€” ΠΏΠΎΡ‡Π΅ΠΌΡƒ это ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ?

БущСствуСт нСсколько нСзависимых ΠΏΡ€ΠΈΡ‡ΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠ³Π»Π° ΡƒΠΏΠ°ΡΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ·-Π·Π° постоянных ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ контСкста процСссора, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ приостанавливаСт Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π°Π΄ ΠΎΠ΄Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ, ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ сохранСниС состояния ΠΈ восстановлСниС состояния. Пока процСссор ​​занято ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ состояний, ΠΎΠ½ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ.

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ контСкста процСсса ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, посмотрСв Π½Π° csw ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ top.

На 8 ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…:
Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ²

На 100 ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…:
Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ²

Как Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡƒΠ»Π°?

Π Π°Π·ΠΌΠ΅Ρ€ зависит ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° выполняСмых Π·Π°Π΄Π°Ρ‡. РазумССтся, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Ρ€Π΅Π΄ΠΊΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π·Π°Ρ…Π°Ρ€Π΄ΠΎΠΊΠΎΠΆΠ΅Π½, скорСС ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ настраиваСмый Π° ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ выводится ΠΈΠ· ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° пропускной способности исполняСмых Π·Π°Π΄Π°Ρ‡.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°, Π½Π΅Ρ‚ Ρ†ΠΈΠΊΠ»ΠΎΠ² оТидания I/O, ΠΈ врСмя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π·Π°Π΄Π°Ρ‡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ, ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² = Runtime.getRuntime().availableProcessors() + 1.

Если ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π² основном ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ I/O, Ρ‚ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡƒΠ»Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ Π½Π° ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ оТидания процСсса ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ вычислСния. НапримСр. Π£ нас Π΅ΡΡ‚ΡŒ процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ 50% Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² iowait, Ρ‚ΠΎΠ³Π΄Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡƒΠ»Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ 2 * Runtime.getRuntime().availableProcessors() + 1.

Π”Ρ€ΡƒΠ³ΠΈΠ΅ Π²ΠΈΠ΄Ρ‹ ΠΏΡƒΠ»ΠΎΠ²

ΠŸΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ памяти, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠΎΠ³Π΄Π° Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ слишком ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°Π΄Π°Ρ‡ MemoryAwareThreadPoolExecutor

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠŸΡƒΠ» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² для Java-ΠΎΠ±ΠΎΠ»ΠΎΡ‡Π΅ΠΊ ΠΈ строк

Как Π²Ρ‹ всС ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π·Π½Π°Π΅Ρ‚Π΅, ΠΈΠ½ΠΎΠ³Π΄Π° Java ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡƒΠ»Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² для ΠΎΠ±ΠΎΠ»ΠΎΡ‡Π΅ΠΊ ΠΈ строковых Ρ‚ΠΈΠΏΠΎΠ², ΠΈΠ½ΠΎΠ³Π΄Π° это Π½Π΅ Ρ‚Π°ΠΊ.

Как Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, бокс ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² Π±Π΅Ρ€Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· ΠΏΡƒΠ»Π°, созданиС строк Ρ‡Π΅Ρ€Π΅Π· строковый Π»ΠΈΡ‚Π΅Ρ€Π°Π» Ρ‚Π°ΠΊΠΆΠ΅ Π±Π΅Ρ€Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· ΠΏΡƒΠ»Π°. Π’Π°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ фактичСски ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ == Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true Π½Π° Π½ΠΈΡ…).

Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ создания ΠΎΠ±ΠΎΠ»ΠΎΡ‡Π΅ΠΊ ΠΈ строк Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Ρ‹ ΠΈΠ· бассСйна. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, созданныС этими способами, Π½Π° самом Π΄Π΅Π»Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ == Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ false Π½Π° Π½ΠΈΡ…).

мСня смущаСт Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΡƒΠ» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ частично.

Если это ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡƒΠ» всС врСмя? Если это Π½Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° памяти-Π·Π°Ρ‡Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅?

вопрос Π² Ρ‚ΠΎΠΌ-ΠΊΠ°ΠΊΠΎΠ²Ρ‹ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΊΠΎΠ³ΠΎ повСдСния (=частичноС использованиС ΠΏΡƒΠ»Π°)?

5 ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²

Π΅Π³ΠΎ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΎΠ·Π°Π±ΠΎΡ‡Π΅Π½Π½ΠΎΡΡ‚ΡŒ, выдСляя Π½ΠΎΠ²Ρ‹ΠΉ Integer ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‚ΠΎΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‚Π°ΠΊ ΠΈ памяти. Но ΠΏΠΎ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ запускС слишком ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈ запускС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ½Π½Ρ‹ памяти ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€-ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊ Π²Ρ‹ нашли.

Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ являСтся этот странный компромисс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρƒ нас Π΅ΡΡ‚ΡŒ. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ Ρ‚Π°ΠΊΠΎΠ³ΠΎ повСдСния ΠΎΠ±ΡΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² стандартС Java. (5.7)

для Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ эта Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠ° Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ Π»ΡŽΠ±Ρ‹Π΅ прСдполоТСния ΠΎ тоТдСствС ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ со стороны программиста. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ (Π½ΠΎ Π½Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚) совмСстного использования Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ»ΠΈ всСх этих ссылок.

tl; dr

Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ идСально, ΠΈ это слишком странно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π²ΠΎΠΎΠ±Ρ‰Π΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρƒ нас это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ «Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ» Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Если это ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡƒΠ» всС врСмя?

объСдинСниС всСго всС врСмя Π΄ΠΎΡ€ΠΎΠΆΠ΅, Ρ‡Π΅ΠΌ простой кэш, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ½ΠΎΠ³Π΄Π° Ρ‚Π΅Ρ€ΠΏΠΈΡ‚ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ: Π²Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Π±ΠΎΠ»Π΅Π΅ слоТныС структуры Π΄Π°Π½Π½Ρ‹Ρ… (объСдинСниС Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ†Π΅Π»Ρ‹Ρ… чисСл ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ простого ΠΈ нСбольшого массива) ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹, ΠΈ Π²Ρ‹ всСгда Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ΄Ρ‚ΠΈ, хотя эта ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° ΠΏΡƒΠ» Π½Π΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ понадобятся снова, Ρ‡Ρ‚ΠΎ являСтся пустой Ρ‚Ρ€Π°Ρ‚ΠΎΠΉ памяти: Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ большС (бСсполСзных) записСй кэша, ΠΈ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ этим кэшСм (ΠΈΠ»ΠΈ ΡΡ‚Ρ€Π°Π΄Π°Ρ‚ΡŒ ΠΎΡ‚ сохранСния бСсполСзных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²).

Если это Π½Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ-Π·Π°Ρ‡Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅?

Π­Ρ‚ΠΎ is ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. Вакая оптимизация экономит ΠΌΠ½ΠΎΠ³ΠΎ памяти. ОбъСдинСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ использованиС памяти, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ. Π­Ρ‚ΠΎ ΠΎΠ±ΠΌΠ΅Π½. ΠŸΠΎΠ΄Ρ…ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» принят, экономит Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ сумму памяти для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… распространСнных случаСв использования, Π±Π΅Π· замСдлСния Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎ ΠΈΠ»ΠΈ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ памяти.

ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ сообраТСния. НапримСр, использованиС памяти, Π½ΠΎ ΠΈ сСмантика языка.

являСтся явным созданиСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π—Π°ΠΌΠ΅Π½Π° этого ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ «get from pool» ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ сСмантику языка.

Ссли Π²Ρ‹ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя, работая Π½Π°Π΄ числСнными вычислСниями Π½Π° Java, Π²Ρ‹ do почувствуйтС Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ влияниС автобоксинга. Для чисСл высокой эффСктивности, ΠΏΠ΅Ρ€Π²ΠΎΠ΅ эмпиричСскоС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ любой Π²ΠΈΠ΄ autoboxing. НапримСр, GNU Trove ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ…ΡΡˆ-ΠΊΠ°Ρ€Ρ‚Ρ‹ ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ структуры для ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², Π° прСимущСства срСды выполнСния ΠΈ памяти Π½Π΅ΠΎΠ±ΡŠΡΡ‚Π½Ρ‹ΠΉ.

Ρ‡Ρ‚ΠΎ касаСтся строк, компилятор Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡ… ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π² Ρ„Π°ΠΉΠ»Π΅ класса. Π˜Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π²Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚Π΅ строку Π² Ρ„Π°ΠΉΠ»Π΅ класса? Π‘Π°ΠΌΡ‹ΠΉ простой способ-ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ это:

ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ полагаСтся Π½Π° Π»ΡŽΠ±ΡƒΡŽ ΠΌΠ°Π³ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ String Ρ‚ΠΈΠΏ. Π­Ρ‚ΠΎ просто Π·Π°Π²Π΅Ρ€Π½ΡƒΡ‚Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ². И, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ строку Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π² классС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ класса ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ.

Π­Ρ‚ΠΎ случай памяти ΠΈ скорости. Π’Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ 4 ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Π° цСлочислСнных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΡ€ΠΈ запускС JVM, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΠ½ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

для строк Ρ‚Π°ΠΊΠΆΠ΅ сущСствуСт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° поиска ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… строк Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡƒΠ»Π΅.

строковыС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ Π² исходном ΠΊΠΎΠ΄Π΅ просты, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ компилятор ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π½ΠΎ Ссли я создаю строку динамичСски Π²ΠΎ врСмя выполнСния, JVM придСтся ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΏΡƒΠ» ΠΈ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ строка, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, соотвСтствуСт Π»ΠΈ ΠΎΠ½Π° ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ использована, Π° строки ΠΌΠΎΠ³ΡƒΡ‚

ΠΏΠΎΠΊΠ° Π΅ΡΡ‚ΡŒ структуры Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ, это Π²ΠΎΠΎΠ±Ρ‰Π΅ просто ΠΏΡ€ΠΎΡ‰Π΅ ΠΈ быстрСС ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

см., ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ сСгмСнт ΠΊΠΎΠ΄Π°:

, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠŸΡƒΠ»Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² Java

Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π²Π΅Π±-сСрвСры, ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ запросы ΠΎΡ‚ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², ΠΈ ΠΎΠ½ΠΈ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ большого количСства ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… Π·Π°Π΄Π°Ρ‡. ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ созданию сСрвСрного прилоТСния Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² создании Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° поступаСт запрос, ΠΈ обслуТивании этого Π½ΠΎΠ²ΠΎΠ³ΠΎ запроса Π²ΠΎ вновь созданном ΠΏΠΎΡ‚ΠΎΠΊΠ΅. Π₯отя этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ каТСтся простым для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ сущСствСнныС нСдостатки. Π‘Π΅Ρ€Π²Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ запроса, Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒ большС систСмных рСсурсов ΠΏΡ€ΠΈ создании ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ фактичСских запросов.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡŽΡ‚ систСмныС рСсурсы, JVM, ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π°Ρ слишком ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠ΅ памяти Π² систСмС. Π­Ρ‚ΠΎ обуславливаСт Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ограничСния количСства создаваСмых ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ThreadPool Π² Java?

ΠŸΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ€Π°Π½Π΅Π΅ созданныС ΠΏΠΎΡ‚ΠΎΠΊΠΈ для выполнСния Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… Π·Π°Π΄Π°Ρ‡ ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈΠ·Π΄Π΅Ρ€ΠΆΠ΅ΠΊ Ρ†ΠΈΠΊΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ пСрСрасхода рСсурсов. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊ ΡƒΠΆΠ΅ сущСствуСт, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ запрос, Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°, вызванная созданиСм ΠΏΠΎΡ‚ΠΎΠΊΠ°, устраняСтся, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΡ‚Π·Ρ‹Π²Ρ‡ΠΈΠ²Ρ‹ΠΌ.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² с Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ = 3 ΠΏΠΎΡ‚ΠΎΠΊΠ°. ΠžΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π·Π°Π΄Π°Ρ‡ = 5 запускаСмых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² исполнитСля

Π’ случаС фиксированного ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ссли всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ исполнитСлСм, ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ становится свободным.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΡƒΡ€ΠΎΠΊΠ΅ ΠΌΡ‹ рассмотрим Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ исполнитСля ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² β€” FixedThreadPool.

Π¨Π°Π³ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ

// Java-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ
// ThreadPool

// Π—Π°Π΄Π°Ρ‡Π° класса для выполнСния (Π¨Π°Π³ 1)

class Task implements Runnable

private String name;

public Task(String s)

// ΠŸΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ имя Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ спит Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ 1 с

// Π’Π΅ΡΡŒ этот процСсс повторяСтся 5 Ρ€Π°Π·

for ( int i = 0 ; i 5 ; i++)

SimpleDateFormat ft = new SimpleDateFormat( «hh:mm:ss» );

System.out.println( «Initialization Time for»

// ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ врСмя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ

SimpleDateFormat ft = new SimpleDateFormat( «hh:mm:ss» );

// ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ врСмя выполнСния для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ

catch (InterruptedException e)

// МаксимальноС количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² ΠΏΡƒΠ»Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

static final int MAX_T = 3 ;

public static void main(String[] args)

// создаСт ΠΏΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡

Runnable r1 = new Task( «task 1» );

Runnable r2 = new Task( «task 2» );

Runnable r3 = new Task( «task 3» );

Runnable r4 = new Task( «task 4» );

Runnable r5 = new Task( «task 5» );

// создаСм ΠΏΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ MAX_T ΠΈΠ·

// ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΊΠ°ΠΊ фиксированный Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡƒΠ»Π° (шаг 2)

ExecutorService pool = Executors.newFixedThreadPool(MAX_T);

// ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Task Π² ΠΏΡƒΠ» для выполнСния (шаг 3)

// Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΏΡƒΠ»Π° (шаг 4)

ΠžΠ±Ρ€Π°Π·Π΅Ρ† исполнСния

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π·Π°Π΄Π°Ρ‡Π° 4 ΠΈΠ»ΠΈ Π·Π°Π΄Π°Ρ‡Π° 5 Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ Π² ΠΏΡƒΠ»Π΅ становится свободным. Π”ΠΎ этого Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ.

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ²

ΠŸΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ²

ΠŸΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ 4 ΠΈ 5

Риски ΠΏΡ€ΠΈ использовании ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Ρ… ΠΏΡƒΠ»ΠΎΠ²

Π’Π°ΠΆΠ½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹

Вюнинг-ΠΏΡƒΠ»

ΠŸΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² β€” ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ инструмСнт для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ сСрвСрных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Он довольно прост ΠΏΠΎ своСй ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, Π½ΠΎ Π΅ΡΡ‚ΡŒ нСсколько ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ², Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ использовании, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Ρ‚ΡƒΠΏΠΈΠΊ, ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° рСсурсов. ИспользованиС слуТбы executor ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ.

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, Ссли Π²Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅, ΠΈΠ»ΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎ обсуТдаСмой Π²Ρ‹ΡˆΠ΅ Ρ‚Π΅ΠΌΠ΅.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Руководство ΠΏΠΎ ΠΏΡƒΠ»Ρƒ строк Java

Π£Π·Π½Π°ΠΉΡ‚Π΅, ΠΊΠ°ΠΊ JVM ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ объСм памяти, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ для хранСния строк Π² ΠΏΡƒΠ»Π΅ строк Java.

1. ΠžΠ±Π·ΠΎΡ€

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ String являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ классом Π² языкС Java.

2. Π˜Π½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ строк

Благодаря нСизмСняСмости Π‘Ρ‚Ρ€ΠΎΠΊ Π² Java JVM ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ объСм Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ для Π½ΠΈΡ… памяти, храня Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ копию ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Π² ΠΏΡƒΠ»Π΅ . Π­Ρ‚ΠΎΡ‚ процСсс называСтся ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ .

Когда ΠΌΡ‹ создаСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ String ΠΈ присваиваСм Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, JVM ΠΈΡ‰Π΅Ρ‚ Π² ΠΏΡƒΠ»Π΅ String Ρ€Π°Π²Π½ΠΎΠ³ΠΎ значСния.

Если ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½, компилятор Java просто Π²Π΅Ρ€Π½Π΅Ρ‚ ссылку Π½Π° свой адрСс памяти, Π½Π΅ выдСляя Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ памяти.

Если ΠΎΠ½ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² ΠΏΡƒΠ» (ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚), ΠΈ Π΅Π³ΠΎ ссылка Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π°.

Π”Π°Π²Π°ΠΉΡ‚Π΅ напишСм нСбольшой тСст, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ это:

3. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора

КаТдая строка |, созданная ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти со своим собствСнным адрСсом.

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, Ρ‡Π΅ΠΌ это отличаСтся ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ случая:

4. Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹ΠΉ Π»ΠΈΡ‚Π΅Ρ€Π°Π» ΠΏΡ€ΠΎΡ‚ΠΈΠ² строкового ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

Когда ΠΌΡ‹ создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ String с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new () , ΠΎΠ½ всСгда создаСт Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² памяти ΠΊΡƒΡ‡ΠΈ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли ΠΌΡ‹ создадим ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с использованиСм синтаксиса String literal, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€œBaeldung”, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ· ΠΏΡƒΠ»Π° строк, Ссли ΠΎΠ½ ΡƒΠΆΠ΅ сущСствуСт. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ создаст Π½ΠΎΠ²Ρ‹ΠΉ строковый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ помСстит Π΅Π³ΠΎ Π² ΠΏΡƒΠ» строк для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования.

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ String Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ссылку.

Π—Π°Ρ‚Π΅ΠΌ Π΄Π°Π²Π°ΠΉΡ‚Π΅ создадим Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ new ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ Π½ΠΈΡ… Ρ€Π°Π·Π½Ρ‹Π΅ ссылки:

5. Ручная Π‘Ρ‚Π°ΠΆΠΈΡ€ΠΎΠ²ΠΊΠ°

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ввСсти String Π² ΠΏΡƒΠ» строк Java, Π²Ρ‹Π·Π²Π°Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ intern() для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Π ΡƒΡ‡Π½ΠΎΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ строки | сохранит Π΅Π΅ ссылку Π² ΠΏΡƒΠ»Π΅, ΠΈ JVM Π²Π΅Ρ€Π½Π΅Ρ‚ эту ссылку ΠΏΡ€ΠΈ нСобходимости.

Π”Π°Π²Π°ΠΉΡ‚Π΅ создадим тСстовый случай для этого:

6. Π‘Π±ΠΎΡ€ ΠœΡƒΡΠΎΡ€Π°

7. ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ оптимизация

Π’ Java 6 СдинствСнная оптимизация, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ, – это ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ пространства PermGen Π²ΠΎ врСмя Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° MaxPermSize JVM:

Π’ Java 7 Ρƒ нас Π΅ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для изучСния ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ/ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΏΡƒΠ»Π°. Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° просмотра Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΏΡƒΠ»Π°:

Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡƒΠ»Π° с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π²Π΅Π΄Π΅Ρ€, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ StringTableSize JVM:

Π”ΠΎ Java 7u40 Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡƒΠ»Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ составлял 1009 Π²Π΅Π΄Π΅Ρ€, Π½ΠΎ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½ΠΎ нСскольким измСнСниям Π² Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ… вСрсиях Java. Если Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡƒΠ»Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ с Java 7u40 Π΄ΠΎ Java 11 составлял 60013, Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ½ увСличился Π΄ΠΎ 65536.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΏΡƒΠ»Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒ большС памяти, Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ прСимущСство Π² сокращСнии Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ для вставки Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Π² стол.

8. ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ О Java 9

Π’ Java 9 прСдоставляСтся Π½ΠΎΠ²ΠΎΠ΅ прСдставлСниС, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ Compact Strings. Π­Ρ‚ΠΎΡ‚ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΌΠ΅ΠΆΠ΄Ρƒ char[] ΠΈ byte[] Π² зависимости ΠΎΡ‚ сохранСнного содСрТимого.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½ΠΎΠ²ΠΎΠ΅ прСдставлСниС String Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ UTF-16 Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² случаС нСобходимости, объСм ΠΊΡƒΡ‡ΠΈ памяти Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΠΈΠΆΠ΅, Ρ‡Ρ‚ΠΎ, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ мСньшим Π·Π°Ρ‚Ρ€Π°Ρ‚Π°ΠΌ Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊΠ° мусора Π½Π° JVM.

9. Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ этом руководствС ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ, ΠΊΠ°ΠΊ JVM ΠΈ компилятор Java ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² String Ρ‡Π΅Ρ€Π΅Π· ΠΏΡƒΠ» строк Java.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ПонимаСм соСдинСния ΠΈ ΠΏΡƒΠ»Ρ‹

ΠŸΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².: Π°Π²Ρ‚ΠΎΡ€ этой ΡΡ‚Π°Ρ‚ΡŒΠΈ β€” тСхничСский Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΠΎΡ€ Sudhir Jonathan β€” рассказываСт ΠΎΠ± ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Ρ‚Π΅Ρ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ², с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ сталкиваСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈ систСмный администратор. Однако Π΄ΠΎ возникновСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… (ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° довольно спСцифичных) ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π½Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ всё Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Β«ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌΒ». Автор устраняСт этот ΠΏΡ€ΠΎΠ±Π΅Π», ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ популярныС Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ, сСрвСры Π‘Π” ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² качСствС понятных ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ².

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ². Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈΠ½Ρ‚ΠΎΠ²

БоСдинСния β€” это скрытый ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Π΅ систСмы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ для общСния Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ. Они стали Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΎΡ‚ΡŠΠ΅ΠΌΠ»Π΅ΠΌΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ нашСй ΠΆΠΈΠ·Π½ΠΈ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ часто Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ, насколько ΠΎΠ½ΠΈ Π²Π°ΠΆΠ½Ρ‹, Π½Π΅ Π·Π°ΠΌΠ΅Ρ‡Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΈ тСрпят Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ. Часто ΠΌΡ‹ Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ ΠΎ Π½ΠΈΡ… Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. ΠŸΡ€ΠΈ этом ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½Π° проявляСтся массовым ΠΎΡ‚ΠΊΠ°Π·ΠΎΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² Ρ‚ΠΎ врСмя, ΠΊΠΎΠ³Π΄Π° систСмы Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ сильнСС всСго. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ соСдинСния Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ²ΡΡŽΠ΄Ρƒ ΠΈ ΠΎΠ½ΠΈ Π²Π°ΠΆΠ½Ρ‹ практичСски для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ систСмы, стоит ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° ΠΈΡ… ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅.

БоСдинСния β€” Ρ‡Ρ‚ΠΎ это?

Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ β€” это ΡΠ²ΡΠ·ΡƒΡŽΡ‰Π΅Π΅ Π·Π²Π΅Π½ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя систСмами, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ ΠΈΠΌ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½ΡƒΠ»Π΅ΠΉ ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†: ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π±Π°ΠΉΡ‚Ρ‹.

Π’ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ располоТСны систСмы ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ Π΄Ρ€ΡƒΠ³ ΠΊ Π΄Ρ€ΡƒΠ³Ρƒ, комбинация Π½ΠΈΠΆΠ΅Π»Π΅ΠΆΠ°Ρ‰Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΈ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ обСспСчСния Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ физичСскоС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, абстрагируя Π΅Π΅. НапримСр, ΠΏΡ€ΠΈ взаимодСйствии Π΄Π²ΡƒΡ… Unix-процСссов Π·Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти для ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ ΠΏΡ€ΠΈΡ‘ΠΌ/доставку Π±Π°ΠΉΡ‚ΠΎΠ² с ΠΎΠ±Π΅ΠΈΡ… сторон ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ систСма мСТпроцСссного взаимодСйствия (IPC). Если систСмы располоТСны Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°Ρ…, ΠΎΠ½ΠΈ скорСС всСго Π±ΡƒΠ΄ΡƒΡ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ TCP, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈ обСспСчит ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΠΏΡ€ΠΎΠ²ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ»ΠΈ бСспроводной систСмС связи ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°ΠΌΠΈ. Π”Π΅Ρ‚Π°Π»ΠΈ совмСстной Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ² для Π½Π°Π΄Ρ‘ΠΆΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈ ΠΏΡ€ΠΈΡ‘ΠΌΠ° Π΄Π°Π½Π½Ρ‹Ρ… скорСС относятся ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ стандартизации, ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ систСм ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ, прСдоставляСмыС ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌΠΈ UDP ΠΈ TCP. Π’ΠΎ, ΠΊΠ°ΠΊ эти соСдинСния ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΠΊΠΎΠ½Ρ†ΠΎΠ², являСтся Π±ΠΎΠ»Π΅Π΅ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. О Π½Π΅ΠΉ ΠΌΡ‹ ΠΈ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ сСйчас.

Π“Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ соСдинСния?

БоСдинСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ прямо сСйчас. Π’Π°Ρˆ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ установил соСдинСниС с Π²Π΅Π±-сСрвСром, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ этот Π±Π»ΠΎΠ³, ΠΈ ΠΏΠΎ Π½Π΅ΠΌΡƒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Π±Π°ΠΉΡ‚Ρ‹, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ HTML, CSS, JavaScript ΠΈ изобраТСния, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ сСйчас смотритС. ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ HTTP/1.1 Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ устанавливал мноТСство соСдинСний с сСрвСром β€” ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» HTTP/2 ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всС Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ соСдинСнию (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ). Π’ΠΎ всСх этих случаях Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ выступал ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, Π° сСрвСр Π±Π»ΠΎΠ³Π°, собствСнно, Π±Ρ‹Π» сСрвСром.

Но сСрвСр, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Ρ‚Π°ΠΊΠΆΠ΅ устанавливал соСдинСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ эту страницу. Π’Π°ΠΊ, ΠΎΠ½ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΡΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» Π΅ΠΉ запрос, содСрТащий URL страницы. Π’ ΠΎΡ‚Π²Π΅Ρ‚ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Π΅Ρ‘ содСрТимоС. Π’ Π΄Π°Π½Π½ΠΎΠΌ сцСнарии сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ выступал ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, Π° Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… β€” сСрвСром. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΌΠΎΠ³ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ соСдинСния с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ сторонними сСрвисами, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ сСрвис подписки ΠΈΠ»ΠΈ ΠΎΠΏΠ»Π°Ρ‚Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ сСрвис опрСдСлСния мСстополоТСния.

ΠžΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Β«ΠΎΡ‚Π³Ρ€ΡƒΠ·ΠΊΡƒΒ» статичСских Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ JS, CSS ΠΈ изобраТСния, ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ CDN-систСма, располоТСнная ΠΌΠ΅ΠΆΠ΄Ρƒ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠΌ ΠΈ сСрвСром Π±Π»ΠΎΠ³Π°. Π‘Ρ€Π°ΡƒΠ·Π΅Ρ€ (ΠΊΠ»ΠΈΠ΅Π½Ρ‚) установил соСдинСниС с блиТайшим сСрвСром CDN, ΠΈ, Ссли Π½ΡƒΠΆΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π΅ оказалось Π² кэшС CDN-сСрвСра, Ρ‚ΠΎΡ‚ (выступая ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚) связался с сСрвСром Π±Π»ΠΎΠ³Π° (сСрвСр).

Если Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° систСмы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΡ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΈΠ»ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ создаём, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ мноТСство всСвозмоТных соСдинСний. Часто ΠΎΠ½ΠΈ скрыты ΠΎΡ‚ Π³Π»Π°Π·, ΠΈ, забывая ΠΎΠ± ΠΈΡ… Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌ сущСствовании ΠΈ ограничСниях, ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹, ΠΊΠΎΠ³Π΄Π° мСньшС всСго этого оТидаСшь.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π²Π°ΠΆΠ½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° соСдинСний?

ПониманиС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ вСдСтся Ρ€Π°Π±ΠΎΡ‚Π° с соСдинСниями, Π²Π°ΠΆΠ½Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΡ… ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ асиммСтрична: ΠΈΠ·Π΄Π΅Ρ€ΠΆΠΊΠΈ, связанныС с созданиСм соСдинСния, ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ сСрвСра. Π’ ΠΎΠ΄Π½ΠΎΡ€Π°Π½Π³ΠΎΠ²ΠΎΠΉ (P2P) систСмС это Π½Π΅ Ρ‚Π°ΠΊ, ΠΈ соСдинСния ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡƒΡŽ Β«ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΒ» Π½Π° ΠΎΠ±ΠΎΠΈΡ… ΠΊΠΎΠ½Ρ†Π°Ρ…, Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π±Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π΅Π΄ΠΊΠΎ. Π’ΠΈΠΏΠΈΡ‡Π½ΠΎΠ΅ использованиС соСдинСний всСгда ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ сСрвСра, ΠΏΡ€ΠΈ этом ΠΈΠ·Π΄Π΅Ρ€ΠΆΠΊΠΈ, связанныС с созданиСм соСдинСния, Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ сСрвСра.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ соСдинСний, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΠ²Π΅ΠΆΠΈΡ‚ΡŒ знания ΠΎ способах запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°Ρ… ΠΈ ΠΎΠ± ΠΈΡ… ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅.

ΠŸΡ€ΠΈ стартС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ опСрационная систСма запускаСт ΠΊΠΎΠ΄ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ экзСмпляр процСсса. Π’ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ процСсс Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ ядро CPU ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±ΡŠΡ‘ΠΌ памяти, ΠΈ Π½Π΅ дСлится своСй ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π½ΠΈ с ΠΊΠ°ΠΊΠΈΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ процСссами.

ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ threads (ΠΏΠΎΡ‚ΠΎΠΊΠΈ выполнСния) β€” Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ элСмСнты процСсса, способныС Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ. ΠŸΠΎΡ‚ΠΎΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ совмСстно с процСссом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡ… ΠΏΠΎΡ€ΠΎΠ΄ΠΈΠ» (Ρ‚ΠΎΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ большС памяти для ΠΈΡ… использования).

Π’Π°ΠΊΠΆΠ΅ процСсс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ event loop (Ρ†ΠΈΠΊΠ» событий), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выглядит ΠΊΠ°ΠΊ систСма с ΠΎΠ΄Π½ΠΈΠΌ процСссом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ отслСТиваСт ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ задания, Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎ ΠΈ бСсконСчно пСрСбирая ΠΈΡ…. ΠŸΡ€ΠΈ этом ΠΎΠ½ выполняСт Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ задания ΠΈ пропускаСт Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅.

Π”Ρ€ΡƒΠ³ΠΎΠΉ способ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ использованиС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… конструкций, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ fibers (Ρ„Π°ΠΉΠ±Π΅Ρ€Ρ‹), green-threads (Π·Π΅Π»Ρ‘Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ), coroutines (сопрограммы) ΠΈΠ»ΠΈ actors (Π°ΠΊΡ‚ΠΎΡ€Ρ‹). КаТдая ΠΈΠ· этих конструкций Ρ‡ΡƒΡ‚ΡŒ отличаСтся ΠΎΡ‚ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… (Π² Ρ‚ΠΎΠΌ числС, Π² смыслС ΠΈΠ·Π΄Π΅Ρ€ΠΆΠ΅ΠΊ), Π½ΠΎ всС ΠΎΠ½ΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ процСссом ΠΈ Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ соСдинСний, Π΄Π°Π²Π°ΠΉΡ‚Π΅ сначала рассмотрим ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Для сСрвСра ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π² Π΄Π°Π½Π½ΠΎΠΌ случаС) установка TCP-соСдинСния связана с Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ нСбольшого ΠΎΠ±ΡŠΡ‘ΠΌΠ° памяти для Π±ΡƒΡ„Π΅Ρ€Π° ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ€Ρ‚Π°.

Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ PostgreSQL, Π½Π° сторонС сСрвСра ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ соСдинСниС обрабатываСтся ΠΏΡƒΡ‚Ρ‘ΠΌ создания Π½ΠΎΠ²ΠΎΠ³ΠΎ процСсса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ занимаСтся всСми запросами, ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠΌΠΈ ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΌΡƒ соСдинСнию. Π’Π°ΠΊΠΎΠΉ процСсс Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ядро процСссора ΠΈ ΠΎΠΊΠΎΠ»ΠΎ 10 Мб памяти (ΠΈΠ»ΠΈ большС).

MySQL для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ создаёт ΠΏΠΎΡ‚ΠΎΠΊ Π²Π½ΡƒΡ‚Ρ€ΠΈ процСсса. ВрСбования ΠΊ памяти Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π½ΠΈΠΆΠ΅ Π² ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π½ΠΎ ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π° это приходится постоянным ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ контСкстов.

Redis ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ соСдинСниС ΠΊΠ°ΠΊ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ Π² Ρ†ΠΈΠΊΠ»Π΅ событий, Ρ‡Ρ‚ΠΎ сниТаСт трСбования ΠΊ рСсурсам, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π° это приходится Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ соСдинСниС доТидаСтся своСй ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, ΠΏΡ€ΠΈ этом Redis ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ запросы строго ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС запрос ΠΊ сСрвСру ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π‘Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΠ΅Ρ‚ TCP-соСдинСниС Π² качСствС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° (это Π΅ΠΌΡƒ обходится Π΄Ρ‘ΡˆΠ΅Π²ΠΎ β€” нСбольшой ΠΎΠ±ΡŠΡ‘ΠΌ памяти для Π±ΡƒΡ„Π΅Ρ€Π° ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ€Ρ‚). На сторонС сСрвСра ситуация ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ иная:

Если сСрвСр ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ruby on Rails, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ соСдинСниС обрабатываСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, ΠΏΠΎΡ€ΠΎΠΆΠ΄Ρ‘Π½Π½Ρ‹ΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ фиксированного числа Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… процСссов (Π² случаС Π²Π΅Π±-сСрвСра Puma), ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΈΠΌ процСссом (Unicorn).

Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ PHP, систСма CGI запускаСт Π½ΠΎΠ²Ρ‹ΠΉ PHP-процСсс для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ соСдинСния, Π° Π±ΠΎΠ»Π΅Π΅ популярная рСализация FastCGI ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ нСсколько Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… процСссов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π½ΠΎΠ²Ρ‹Ρ… соСдинСний.

Π’ случаС Go для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ соСдинСния создаСтся goroutine (Π΄Π΅ΡˆΡ‘Π²Π°Ρ ΠΈ лСгковСсная потокоподобная структура, управляСмая & планируСмая исполняСмой срСдой Go).

Π’ Node.js/Deno входящиС соСдинСния ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² Ρ†ΠΈΠΊΠ»Π΅ событий ΠΏΡƒΡ‚Ρ‘ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π° запросы ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π·Π° Ρ€Π°Π·.

Π’ систСмах Π²Ρ€ΠΎΠ΄Π΅ Erlang/Elixir ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ соСдинСниС обрабатываСтся Π°ΠΊΡ‚ΠΎΡ€ΠΎΠΌ β€” Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎΠΉ лСгковСсной ΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅-ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ конструкциСй.

АрхитСктуры ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ соСдинСний

Из ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π²Ρ‹ΡˆΠ΅ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ нСсколько Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Ρ… стратСгий ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ соСдинСний:

ΠŸΡ€ΠΎΡ†Π΅ΡΡΡ‹. КаТдоС соСдинСниС обрабатываСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ процСссом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π»ΠΈΠ±ΠΎ создаСтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для этого соСдинСния (CGI, PostgreSQL), Π»ΠΈΠ±ΠΎ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π½Π΅ΠΊΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ доступных процСссов (Unicorn, FastCGI).

ΠŸΠΎΡ‚ΠΎΠΊΠΈ. КаТдоС соСдинСниС обрабатываСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π»ΠΈΠ±ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ создаётся, Π»ΠΈΠ±ΠΎ бСрётся ΠΈΠ· ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅Π·Π΅Ρ€Π²Π°. ΠŸΠΎΡ‚ΠΎΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ распрСдСлСны ΠΏΠΎ нСскольким процСссам, ΠΏΡ€ΠΈ этом всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ эквивалСнтны ΠΌΠ΅ΠΆΠ΄Ρƒ собой (Puma/Ruby, Tomcat/Java, MySQL).

Π¦ΠΈΠΊΠ» событий. КаТдоС соСдинСниС Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ†ΠΈΠΊΠ» событий Π² Π²ΠΈΠ΄Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΈ соСдинСния с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ для чтСния ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ (Node, Redis). ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ систСмы β€” однопроцСссныС ΠΈ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Π΅, Π½ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях Π±Ρ‹Π²Π°ΡŽΡ‚ многопроцСссными, ΠΊΠΎΠ³Π΄Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс дСйствуСт ΠΊΠ°ΠΊ полунСзависимая систСма с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ событий.

Coroutines / Green-Threads / Fibers / Actors. КаТдоС соСдинСниС обрабатываСтся лСгковСсной конструкциСй с Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ (Go, Erlang, Scala/Akka).

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ сСрвСр ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ соСдинСния, ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для понимания Π΅Π³ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ ΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ. Π”Π°ΠΆΠ΅ Π±Π°Π·ΠΎΠ²ΠΎΠ΅ использованиС ΠΈΠ»ΠΈ настройка Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ понимания Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ соСдинСния: Redis ΠΈ PostgreSQL, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΡƒΡŽ сСмантику Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Π»ΠΈΡΡŽΡ‚ ΠΈΡ… ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ соСдинСний. Π‘Π΅Ρ€Π²Π΅Ρ€Ρ‹, основанныС Π½Π° процСссах ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…, ΠΌΠΎΠ³ΡƒΡ‚ Β«ΡƒΠΏΠ°ΡΡ‚ΡŒΒ» ΠΈΠ·-Π·Π° исчСрпания рСсурсов, Ссли ΠΈΡ… максимальноС количСство Π½Π΅ Π·Π°Π΄Π°Π½ΠΎ Π² Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹Ρ… ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ…. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, установка ΠΏΡ€Π΅Π΄Π΅Π»ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½ΠΎΠΌΡƒ нСдоиспользованию сСрвСров ΠΈΠ·-Π·Π° слишком Π½ΠΈΠ·ΠΊΠΈΡ… Π»ΠΈΠΌΠΈΡ‚ΠΎΠ². БистСмы, основанныС Π½Π° Ρ†ΠΈΠΊΠ»Π°Ρ… событий, Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°ΡŽΡ‚ ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π° 64-ядСрных CPU (Ссли, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΈΡ… 64 ΠΊΠΎΠΏΠΈΠΈ Π½Π΅ настроСны Π½Π° ΡΠΎΠ²ΠΌΠ΅ΡΡ‚Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ β€” Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² случаС Π²Π΅Π±-сСрвСров, Π½ΠΎ ΠΏΠ»ΠΎΡ…ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…).

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· этих способов ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ соСдинСний ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ проявляСт сСбя ΠΏΡ€ΠΈ использовании Π² сСрвСрах ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π±Π°Π·Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ·-Π·Π° распрСдСлённой ΠΈΠ»ΠΈ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ систСмы. НапримСр, сСрвСры ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ…ΠΎΡ€ΠΎΡˆΠΎ подходят для Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ β€” ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ΄ΠΈΠ½ Π»ΠΈ Ρƒ вас сСрвСр, 10 ΠΈΠ»ΠΈ 10000. Π’ этих случаях ΠΎΡ‚ΠΊΠ°Π· ΠΎΡ‚ ΠΌΠΎΠ΄Π΅Π»ΠΈ процСссов/ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ росту ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большС Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ использованиСм памяти ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ контСкста процСссором.

ΠŸΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ Π½Π° Ρ†ΠΈΠΊΠ»Π°Ρ… событий Π²Ρ€ΠΎΠ΄Π΅ Node ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ Π·Π°Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π»ΠΈ сСбя Π½Π° одноядСрных сСрвСрах, ΠΈ для использования Π½Π° многоядСрных сСрвСрах ΠΈΡ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΠ»Π°ΡΡ‚Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. БистСмы, основанныС Π½Π° сопрограммах/Π°ΠΊΡ‚ΠΎΡ€Π°Ρ…, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Go ΠΈΠ»ΠΈ Erlang, Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»Π΅Π³Ρ‡Π΅ Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ ядра процСссора, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для этого: Π½Π° ΠΎΠ΄Π½ΠΎΠΉ машинС ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ тысячи Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½ ΠΈ Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ².

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°ΡŽΡ‚ ΠΎΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π° основС процСссов/ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²/Ρ†ΠΈΠΊΠ»ΠΎΠ² событий, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠ·-Π·Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ систСмы Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ мноТСство соСдинСний Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ с ΠΎΠ΄Π½ΠΈΠΌΠΈ ΠΈ Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ врСмя. Π’ случаС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, происходящих Π½Π° мноТСствС соСдинСний, придётся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π²ΠΎ врСмя Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊ транзакциям этапов ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стратСгии Π²Ρ€ΠΎΠ΄Π΅ MVCC, поэтому Ρ‡Π΅ΠΌ мСньшС число Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² соСдинСний, Ρ‚Π΅ΠΌ Π»ΡƒΡ‡ΡˆΠ΅. Π­Ρ‚ΠΈ систСмы ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΌΠ°Π»ΠΎΠ΅ число соСдинСний Π½Π° ΠΎΠ΄Π½ΠΎΠΉ машинС.

На ΠΊΡ€ΡƒΠΏΠ½ΠΎΠΌ сСрвСрС PostgreSQL ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ нСсколькими сотнями соСдинСний, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ MySQL способСн ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Ρƒ тысяч. Redis способСн ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ наибольшСС количСство соСдинСний (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, дСсятки тысяч), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ†ΠΈΠΊΠ» событий ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π΅ΠΌΡƒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…, Π½ΠΎ ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π° это приходится Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ выполняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° опСрация.

РаспрСдСлённыС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠ³ΡƒΡ‚ ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ΠΎΠΉΡ‚ΠΈ ΠΎΡ‚ ΠΌΠΎΠ΄Π΅Π»ΠΈ, основанной Π½Π° процСссах ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Π°Π½Π½Ρ‹Π΅ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎ нСскольким машинам, ΠΎΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΡ‚ΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ сСкционирования (partitioning). Π’Π°ΠΊΠΈΠ΅ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… способны ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ мноТСство соСдинСний ΠΌΠ΅ΠΆΠ΄Ρƒ большим числом сСрвСров. НапримСр, AWS DynamoDB ΠΈΠ»ΠΈ Google Datastore, Π° Ρ‚Π°ΠΊΠΆΠ΅ распрСдСлСнныС Π‘Π”, написанныС Π½Π° Go, с Π³ΠΎΡ‚ΠΎΠ²Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈΠΌΡƒΡ‚ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Ρ‹ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Ρ‹ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

Однако всС эти Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈΠΌΠ΅ΡŽΡ‚ послСдствия β€” ΠΎΠ½ΠΈ ΠΆΠ΅Ρ€Ρ‚Π²ΡƒΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ опСрациями (join’Ρ‹, ad-hoc-запросы) ΠΈ гарантиями согласованности, прСдоставляСмыми Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ/односСрвСрными Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Но, идя Π½Π° эту ΠΆΠ΅Ρ€Ρ‚Π²Ρƒ, ΠΎΠ½ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ соСдинСния сСкционированным, Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ, практичСски Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌ способом, позволяя Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ, которая ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ мноТСство соСдинСний Π½Π° мноТСствС машин. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° соСдинСний Π² Π΄Π°Π½Π½ΠΎΠΌ случаС снимаСтся: ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ сСрвСр Π΄ΠΎΠ»ΠΆΠ΅Π½ сам Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΠ± ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅, Π½ΠΎ Π² совокупности, с тысячами ΠΈ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π°ΠΌΠΈ машин с ΡƒΠΌΠ½ΠΎΠΉ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Π΄Π°Π½Π½Ρ‹Π΅ систСмы часто Π²Π΅Π΄ΡƒΡ‚ сСбя Ρ‚Π°ΠΊ, словно ΠΎΠ½ΠΈ бСсконСчно ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡƒΠ» ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½?

Β«Π”ΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΈΠ·Π½Π°Β» соСдинСний Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΈΡ… эффСктивного ΠΈ экономного использования. Часто Π±Ρ‹Π²Π°Π΅Ρ‚ слоТно ΠΏΠΎΠ½ΡΡ‚ΡŒ, насколько Π΄ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ΠΈ обходятся. Бвязано это с асиммСтриСй: с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° соСдинСниС стоит Π΄Ρ‘ΡˆΠ΅Π²ΠΎ, ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΡ‚ ΠΈΡ… Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ числа страдаСт ΠΈΠΌΠ΅Π½Π½ΠΎ сСрвСр.

Π’ процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ сСбС Ρ€ΠΎΡΠΊΠΎΡˆΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ соСдинСниС для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. НапримСр, сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Устанавливая для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ запроса Π½ΠΎΠ²ΠΎΠ΅ соСдинСниС, ΠΎΠ½ искусствСнно ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ» Π±Ρ‹ сСбя возмоТностями Π‘Π” (ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ) ΠΏΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ соСдинСний. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ способ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ эффСктивСн β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ являСтся прокси-сСрвСром для Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ сСрвСры ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΊΡƒΡ‡Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹: ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ поступлСния Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° сСрвСр, Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ Π΅Π³ΠΎ, Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ запрос, ΠΏΠ΅Ρ€Π΅ΡΡ‹Π»Π°ΡŽΡ‚ Π΅Π³ΠΎ Π² Π‘Π” ΠΏΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ соСдинСнию, ΠΆΠ΄ΡƒΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ², ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΈΡ…, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ HTML/JSON/RPC, ΠΏΠΎΡΡ‹Π»Π°ΡŽΡ‚ сСтСвыС запросы Π΄Ρ€ΡƒΠ³ΠΈΠΌ сСрвисам, ΠΈ Ρ‚.Π΄. ΠžΡΠ½ΠΎΠ²Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ соСдинСниС простаиваСт β€” Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, дорогостоящий рСсурс ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ нСэффСктивно. И это ΠΌΡ‹ Π΅Ρ‰Ρ‘ Π½Π΅ ΡƒΡ‡Π»ΠΈ ΠΈΠ·Π΄Π΅Ρ€ΠΆΠΊΠΈ, связанныС с созданиСм соСдинСния (запуск процСсса, аутСнтификация) ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π° сторонС сСрвСра.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ использования соСдинСний, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ connection pools (ΠΏΡƒΠ»Ρ‹ соСдинСний). ΠŸΡƒΠ» β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ соСдинСний, Π½Π΅ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ прямого доступа ΠΈΠ»ΠΈ использования. ΠŸΡƒΠ» Π²Ρ‹Π΄Π°Π΅Ρ‚ соСдинСния, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ²ΡΠ·Π°Ρ‚ΡŒΡΡ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. БоСдинСния Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΏΡƒΠ» послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹. ΠŸΡƒΠ» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ числом соСдинСний, ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΠΎ нСобходимости. ИдСальноС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΡƒΠ»Π° соСдинСний выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: ΠΊΠΎΠ΄ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ соСдинСниС Ρƒ ΠΏΡƒΠ»Π° (checkout), ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ Π΅ΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ ΠΈ сразу Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π² ΠΏΡƒΠ» (release). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ΄ Π½Π΅ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ соСдинСниС, ΠΏΠΎΠΊΠ° выполняСтся Ρ€Π°Π±ΠΎΡ‚Π°, Π½ΠΈΠΊΠ°ΠΊ с Π½ΠΈΠΌ Π½Π΅ связанная, Ρ‡Ρ‚ΠΎ сущСствСнно ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ. Π­Ρ‚ΠΎ позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ мноТСство Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ с использованиСм ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… соСдинСний. Если всС соСдинСния Π² ΠΏΡƒΠ»Π΅ заняты, ΠΊΠΎΠ³Π΄Π° происходит ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ запрос (checkout), Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ сторонС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ приходится ΠΆΠ΄Π°Ρ‚ΡŒ (block), ΠΏΠΎΠΊΠ° соСдинСниС Π½Π΅ освободится.

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΡƒΠ»ΠΎΠ² ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… языках ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°Ρ…:

Ruby on Rails, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, автоматичСски выдСляСт ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ соСдинСния Π² ΠΏΡƒΠ», ΠΏΡ€ΠΈ этом Π½Π΅ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ нюансов Π΄Π°Π½Π½ΠΎΠ³ΠΎ процСсса ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ нСэффСктивному ΠΊΠΎΠ΄Ρƒ. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ запрос ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ сСтСвой запрос ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ сСрвису, ΠΈ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ запрос ΠΊ Π‘Π”. Π’ этом случаС соСдинСниС простаиваСт Π²ΠΎ врСмя выполнСния сСтСвого запроса (автоматичСскоС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Rails Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ консСрвативным ΠΈ остороТным, Π° ΠΏΠΎΡ‚ΠΎΠΌΡƒ β€” нСэффСктивным).

Π’ Go Π΅ΡΡ‚ΡŒ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π‘Π”, входящий Π² ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΏΡƒΠ»ΠΎΠΌ соСдинСний. Однако Π½Π΅ΡƒΡ‡Π΅Ρ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ соСдинСния Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΏΡƒΠ» ΠΌΠ΅ΠΆΠ΄Ρƒ обращСниями ΠΊ Π‘Π”, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΌ ΠΈ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ воспроизводимым Π±Π°Π³Π°ΠΌ. Иногда Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ исходят ΠΈΠ· прСдполоТСния, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ запросС ΠΈΠ΄ΡƒΡ‚ ΠΏΠΎ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ соСдинСнию, ΠΎΠ΄Π½Π°ΠΊΠΎ автоматичСский ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ соСдинСния ΠΈΠ· ΠΏΡƒΠ»Π° (Π³Π΅ΠΉΠ·Π΅Π½Π±Π°Π³ Π² Go, связанный с Postgres advisory locks).

Π’Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΡƒΡΡƒΠ³ΡƒΠ±Π»ΡΡŽΡ‚ Π΄Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ: Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… часто ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΊ соСдинСнию (ΠΈΠ½ΠΎΠ³Π΄Π° это Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ session β€” сСссиСй). Начав Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΅Ρ‘ Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (commit) ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ°Ρ‚ΠΈΡ‚ΡŒ (roll back) Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ соСдинСнию, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½Π° ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Π»Π°ΡΡŒ. АвтоматичСскоС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡƒΠ»ΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ этот Ρ„Π°ΠΊΡ‚ΠΎΡ€ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ соСдинСниС Π² ΠΏΡƒΠ» Π²ΠΎ врСмя выполнСния Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. Π’ зависимости ΠΎΡ‚ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹Π΅ выраТСния (prepared statements), Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ привязку ΠΊ соСдинСниям.

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ эффСктивный ΠΊΠΎΠ΄, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡƒΠ»ΠΈΠ½Π³ соСдинСний Π² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΌ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ΅, ΠΊΠ°ΠΊΠΈΠ΅ дСйствия Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ автоматичСски, ΠΈ ΠΊΠΎΠ³Π΄Π° Π°Π²Ρ‚ΠΎΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΠ»ΠΈ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΈΠ²Π½ΠΎ. Pooling-прокси (Π²Ρ€ΠΎΠ΄Π΅ pgBouncer, Odyssey ΠΈΠ»ΠΈ AWS RDS Proxy) β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ· инструмСнтов, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰ΠΈΠΉ Π·Π°Π±Ρ‹Ρ‚ΡŒ ΠΎΠ± этих Π½ΡŽΠ°Π½ΡΠ°Ρ…. Π­Ρ‚ΠΈ систСмы ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ соСдинСний с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…, сколько Π½ΡƒΠΆΠ½ΠΎ, Π½Π΅ Π·Π°Π±ΠΎΡ‚ΡΡΡŒ ΠΎΠ± ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΈΠΌΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ выдСляСмыС соСдинСния Π½Π΅ настоящиС, Π° ΠΈΡ… Β«Π΄Π΅ΡˆΡ‘Π²Π°ΡΒ» имитация, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π°Ρ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… рСсурсов. Когда ΠΊΠ»ΠΈΠ΅Π½Ρ‚ пытаСтся Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΠΉ, pooling-прокси ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ настоящСС соСдинСниС ΠΈΠ· Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ ΠΏΡƒΠ»Π° ΠΈ сопоставляСт ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΡŽ с Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ соСдинСниСм. Когда прокси Π·Π°ΠΌΠ΅Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ соСдинСниС большС Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΎΠ½ оставляСт ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ соСдинСниС с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, Π½ΠΎ агрСссивно освобоТдаСт ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ соСдинСниС с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. Число соСдинСний ΠΈ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ «агрСссивности» ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ, Π² Ρ‚ΠΎΠΌ числС с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ Ρ‚Π°ΠΊΠΈΡ… нюансов, ΠΊΠ°ΠΊ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹Π΅ выраТСния ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ.

Π Π΅ΡˆΠΈΡ‚Π΅ Π»ΠΈ Π²Ρ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свой ΠΊΠΎΠ΄ ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² Π½Π΅Π³ΠΎ эффСктивноС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ соСдинСниями, ΠΈΠ»ΠΈ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚Π΅ инструмСнт Π²Ρ€ΠΎΠ΄Π΅ pgBouncer, Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счётС Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΌ компромиссом ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ развСртывания. Π›ΡŽΠ±ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Ρ‘Ρ‚ Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, сколько ΠΊΠΎΠ΄Π° Π²Ρ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ, насколько ΡƒΠ΄ΠΎΠ±Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ соСдинСниями Π² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΌ языкС программирования ΠΈ насколько эффСктивным Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.

Pooling Π½Π΅ ограничиваСтся ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…. ΠœΡ‹ Π½Π°Π·Ρ‹Π²Π°Π»ΠΈ соСдинСния Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Β«Π΄Π΅ΡˆΡ‘Π²Ρ‹ΠΌΠΈΒ», Π½ΠΎ β€” ΡƒΠ²Ρ‹ β€” ΠΎΠ½ΠΈ Π½Π΅ бСсплатны. Они Ρ‚ΠΎΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΏΠΎΡ€Ρ‚Ρ‹ ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ дСскрипторы Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° β€” рСсурсы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹. По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ языки/Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡƒΠ»Ρ‹ для HTTP-соСдинСний с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ сСрвСром, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΡƒΠ»Ρ‹ для Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Ρ… рСсурсов. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, эти ΠΏΡƒΠ»Ρ‹ скрыты ΠΎΡ‚ Π³Π»Π°Π· Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° систСма Π½Π΅ исчСрпаСт ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ рСсурс, ΠΈ Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΎΠ½Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠ°Π΄Π°Π΅Ρ‚. Π—Π½Π°Π½ΠΈΠ΅ ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ спСцификС сильно ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ β€” ΠΏΠΎΠΌΠΈΠΌΠΎ соСдинСний, Π²ΠΈΠ½ΠΎΠ²Π½ΠΈΠΊΠ°ΠΌΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ часто Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ дСскрипторы.

Настройка ΠΎΠ±Ρ‰ΠΈΡ… ΠΏΡƒΠ»ΠΎΠ²

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ соСдинСния, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… комбинациях сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ + Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΠ°ΠΊΡΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ количСство запросов, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Π½Π° сСрвСрС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, минимизируя количСство ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Π₯отя эта ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ· Π½ΠΈΡ… ΠΏΠΎΡ…ΠΎΠΆΠΈ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΈΡ… ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌΠΈ комбинациями. Π”Π°ΠΉΡ‚Π΅ ΠΌΠ½Π΅ Π·Π½Π°Ρ‚ΡŒ, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ я Π΄ΠΎΠ±Π°Π²ΠΈΠ» большС ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ/систСм.

1. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° основС процСссов ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

Puma, популярный сСрвСр для запуска Ruby-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΏΠ°Ρ€Ρƒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² для управлСния ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ входящих HTTP-запросов. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ β€” это число запускаСмых процСссов, прСдставлСнноС Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ workers. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс сСрвСра нСзависим ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ стСк прилоТСния Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ N Мб памяти, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π½Π° машинС ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ доступно workersΓ—N Мб памяти для запуска всСх ΠΊΠΎΠΏΠΈΠΉ. Π•ΡΡ‚ΡŒ способ ΡΠΌΡΠ³Ρ‡ΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ: Ruby 2+ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ копирования ΠΏΡ€ΠΈ записи (copy-on-write), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ мноТСство процСссов ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ Ρ€Π°Π·Π²Π΅Ρ‚Π²Π»ΡΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° Π½ΡƒΠΆΠ½ΠΎΠ΅ число Π±Π΅Π· нСобходимости ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всю ΠΏΠ°ΠΌΡΡ‚ΡŒ β€” ΠΎΠ±Ρ‰ΠΈΠ΅ области памяти Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ совмСстно Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π² Π½ΠΈΡ… Π½Π΅ внСсут измСнСния. Активация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ copy-on-write с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ preload_app! ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΎΠΉ (workersΓ—N). Однако Π½Π΅ стоит Π²ΠΎΠ·Π»Π°Π³Π°Ρ‚ΡŒ Π½Π° Π½Π΅Ρ‘ слишком большиС Π½Π°Π΄Π΅ΠΆΠ΄Ρ‹, Π½Π΅ протСстировав ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ°Ρ….

Π‘Π΅Ρ€Π²Π΅Ρ€Ρ‹, основанныС ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π° процСссах, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Unicorn, ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° этом ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ β€” ΠΊΠ°ΠΊ ΠΈ популярныС сСрвСры для Python, PHP ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… языков, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΈΠ»ΠΈ построСнныС ΠΏΠΎ схСмС ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ/ΠΎΠ΄ΠΈΠ½ процСсс. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ запрос Π·Π° Ρ€Π°Π·, Π½ΠΎ это Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»Π½ΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ: ΠΏΠΎΠΊΠ° процСсс доТидаСтся выполнСния запроса ΠΊ Π‘Π” ΠΈΠ»ΠΈ сСтСвого запроса ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ сСрвису, ΠΎΠ½ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ запросы, ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ядро процСссора Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡΡ‚Π°ΠΈΠ²Π°Ρ‚ΡŒ. Для устранСния этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ большС процСссов, Ρ‡Π΅ΠΌ имССтся ядСр CPU (Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ΠΈΠ·Π΄Π΅Ρ€ΠΆΠΊΠ°ΠΌ, связанным с ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ контСкста), ΠΈΠ»ΠΈ Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ.

Π§Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ нас ΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Puma β€” числу ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² для запуска Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ процСссС/worker’e. Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° threads позволяСт Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ минимальноС ΠΈ максимальноС число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² ΠΏΡƒΠ»Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ worker’Π°. ИспользованиС Π΄Π²ΡƒΡ… этих Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² позволяСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰Π΅Π΅ число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ запросов для прилоТСния. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, ΠΎΠ½ΠΎ Ρ€Π°Π²Π½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡŽ числа worker’ΠΎΠ² Π½Π° число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

ЭмпиричСскоС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ доступноС ядро CPU приходится ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ worker’Ρƒ β€” ΠΏΡ€ΠΈ условии, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρ‡Ρ‚ΠΎ для этого достаточно памяти. Π­Ρ‚ΠΎ позволяСт эффСктивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΊΠΈΠ½ΡƒΡ‚ΡŒ, сколько RAM Π½ΡƒΠΆΠ½ΠΎ, провСдя нСсколько тСстов с этим Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ CPU β€” ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ, увСличивая максимальноС количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Как ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ совмСстно с процСссом, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΈΡ… числа Π½Π΅ слишком отраТаСтся Π½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠΈ памяти. ВмСсто этого большСС число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ всё сильнСС Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ процСссор, ΠΏΠΎΠΏΡƒΡ‚Π½ΠΎ позволяя ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ большС запросов ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Π­Ρ‚ΠΎ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ, ΠΏΠΎΠΊΠ° ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ спит Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² запроса ΠΊ Π‘Π” ΠΈΠ»ΠΈ сСтСвого запроса, ядро CPU ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ процСсса. Но ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ большоС число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ†ΠΈΠΈ Π·Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ процСссов, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ придСтся ΠΎΠΏΡ‹Ρ‚Π½Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ, сколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ для Π·Π½Π°Ρ‡ΠΈΠΌΠΎΠ³ΠΎ увСличСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Но ΠΊΠ°ΠΊ всС эта конфигурация влияСт Π½Π° количСство соСдинСний с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…? Rails ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ автоматичСскоС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ потрСбуСтся собствСнноС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… для эффСктивной Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π±Π΅Π· оТидания, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ. Он ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΡƒΠ» соСдинСний (Π΅Π³ΠΎ настройки хранятся Π² Ρ„Π°ΠΉΠ»Π΅ database.yml ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ процСсса/worker’Π°). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ€Π°Π²Π½ΠΎΠ΅ 5, Rails Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ максимум 5 соСдинСний для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ worker’Π°. Π’Π°ΠΊΠΎΠΉ Π»ΠΈΠΌΠΈΡ‚ Π½Π΅ слишком Ρ…ΠΎΡ€ΠΎΡˆΠΎ сработаСт, Ссли ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ максимальноС число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² β€” всС ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ Π·Π° эти ΠΏΡΡ‚ΡŒ соСдинСний Π² ΠΏΡƒΠ»Π΅. ЭмпиричСскоС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ число соСдинСний Π² ΠΏΡƒΠ»Π΅ Ρ€Π°Π²Π½Ρ‹ΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ количСству процСссов, ΠΊΠ°ΠΊ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½ΠΎ Π² руководствС ΠΏΠΎ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΡŽ Heroku Puma.

Но Ρ‚ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ другая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: количСство соСдинСний, Ρ€Π°Π²Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡŽ числа worker’ΠΎΠ² Π½Π° число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (workers Γ— threads), Π±Π»Π°Π³ΠΎΡ‚Π²ΠΎΡ€Π½ΠΎ влияСт Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ сСрвСра ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π½ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ€ΠΎΠ΄Π΅ PostgreSQL ΠΈ, Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях, для MySQL. Π’ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, сколько Ρƒ вас ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти (Π² случаС Postgres) ΠΈ сколько CPU (Π² случаС MySQL), данная конфигурация ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΡΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. МоТно ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΡ‘ΠΌ ΠΏΡƒΠ»Π° (pool) ΠΈΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ threads, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ число соСдинСний, ΠΈΠ»ΠΈ число worker’ΠΎΠ², ΠΈΠ»ΠΈ ΠΎΠ±Π° этих ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Π’ зависимости ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ прилоТСния, всС эти Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, вСроятно, Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ эффСкт: Ссли ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ запрос Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, количСство ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΊ Π‘Π” всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΡƒΠ·ΠΊΠΈΠΌ мСстом, ограничивая число запросов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Но Ссли Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ запросы ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π±Π΅Π· ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ ΠΊ Π‘Π”, Ρ‚ΠΎ число worker’ΠΎΠ² ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ высоким, Π° ΠΎΠ±ΡŠΡ‘ΠΌ ΠΏΡƒΠ»Π° ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΠΈΠ·ΠΊΠΈΠΌ β€” Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ мноТСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ запросы, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСбольшая ΠΈΡ… Ρ‡Π°ΡΡ‚ΡŒ станСт ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π‘Π” Π² ΠΏΡƒΠ»Π΅ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости.

Π­Ρ‚Ρƒ идСю ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠΌ способом: пСрСвСсти ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ соСдинСниями Π² ΠΊΠΎΠ΄ ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ эффСктивно Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΡŽΡ‚ΡΡ (checkout) ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ (release). Π­Ρ‚ΠΎ особСнно Π²Π°ΠΆΠ½ΠΎ, Ссли ΠΌΠ΅ΠΆΠ΄Ρƒ обращСниями ΠΊ Π‘Π” Π΄Π΅Π»Π°ΡŽΡ‚ΡΡ сСтСвыС запросы.

Если станСт понятно, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ соСдинСниями Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΠ»ΠΈ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ эти Ρ†ΠΈΡ„Ρ€Ρ‹ Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΈ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ искусствСнно ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ ΠΏΡ€Π΅Π΄Π΅Π»ΠΎΠΌ Π½Π° количСство ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΊ Π‘Π”, ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ инструмСнтом Π²Ρ€ΠΎΠ΄Π΅ pgBouncer, Odyssey, AWS RDS Proxy. Запуск pooling-прокси ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡƒΠ»Π° Ρ€Π°Π²Π½Ρ‹ΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ числу ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ ΠΏΠΎΠΏΡƒΡ‚Π½ΠΎ обСспСчит ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ прокси-сСрвСр сдСлаСт всС максимально эффСктивно.

Π§Ρ‚ΠΎ касаСтся Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, PostgreSQL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π½Π° основС процСссов, поэтому приходится ΠΏΡ€ΠΎΡΠ²Π»ΡΡ‚ΡŒ ΡΠ΄Π΅Ρ€ΠΆΠ°Π½Π½ΠΎΡΡ‚ΡŒ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ числа соСдинСний ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с этой Π‘Π”. MySQL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ количСство соСдинСний ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ β€” хотя это ΠΈ способно привСсти ΠΊ сниТСнию ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠ·-Π·Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ контСкста ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ.

2. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° основС Ρ†ΠΈΠΊΠ»Π° событий

Node / Deno β€” ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ сСрвСр Π½Π° основС Ρ†ΠΈΠΊΠ»Π° событий (event loop), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ рассмотрим. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ сСрвСр с конфигурациями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ способСн вСсьма эффСктивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ядро процСссора, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ практичСски ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. Π”Π°, Π΅Π³ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ подсистСмы ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ядра, Π½ΠΎ сСйчас ΠΌΡ‹ большС заинтСрСсованы Π² ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅, ΠΈ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π² этом кластСризация (clustering). Она достигаСтся ΠΏΡƒΡ‚Π΅ΠΌ запуска ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ всС входящиС соСдинСния, Π° Π·Π°Ρ‚Π΅ΠΌ дСйствуСт ΠΊΠ°ΠΊ прокси-сСрвСр ΠΈ распрСдСляСт соСдинСния ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ процСссам, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΌ Π½Π° Ρ‚ΠΎΠΉ ΠΆΠ΅ машинС. Π£ Node имССтся ΠΌΠΎΠ΄ΡƒΠ»ΡŒ кластСризации, входящий Π² ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, ΠΈ популярныС сСрвСры Π²Ρ€ΠΎΠ΄Π΅ PM2 Π΅Π³ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚. ОсновноС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ здСсь состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΆΠ΅ процСссов, сколько ядСр CPU доступно (ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ памяти достаточно).

Stripe выпустил интСрСсный ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Einhorn, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт собой ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ соСдинСний, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π²Π½Π΅ стСка, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ ΠΊΠΎΠ΄. Он запускаСт собствСнный процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ соСдинСния, ΠΈ распрСдСляСт ΠΈΡ… ΠΏΠΎ экзСмплярам прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ запускаСт ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ управляСт ΠΊΠ°ΠΊ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌΠΈ процСссами. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ Π²Ρ€ΠΎΠ΄Π΅ этого ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π² систСмах, основанных Π½Π° Ρ†ΠΈΠΊΠ»Π°Ρ… событий, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ возмоТности всСгда Π±ΡƒΠ΄Π΅Ρ‚ максимально ΠΏΠΎΠ»Π½ΠΎ Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ядро процСссора. Однако сам ΠΏΠΎ сСбС ΠΎΠ½ Π½Π΅ Ρ‚Π°ΠΊ ΠΏΠΎΠ»Π΅Π·Π΅Π½ с Ruby/Python, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ, хотя ΠΈ позволяСт Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ нСсколько процСссов, отсутствиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· процСссов ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ запрос Π·Π° Ρ€Π°Π·.

ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π° основС кластСризации Ρ†ΠΈΠΊΠ»Π° событий ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ систСмами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Π½ΡΡŽΡ‚ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для языка, основанного Π½Π° процСссах. Π‘Π΅Ρ€Π²Π΅Ρ€ Tornado для Python, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ запросов Python Π² систСму Π½Π° основС Ρ†ΠΈΠΊΠ»Π° событий, Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ·Π²Π΅ΡΡ‚Π½ΡƒΡŽ ΠΊΠ°ΠΊ non-blocking I/O. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΊΠ»Π°ΡΡ‚Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ Π½Π° всС доступныС ядра CPU (ΠΏΡ€ΠΈ условии достаточного количСства памяти).

Аналогичный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π²Π΅Π±-сСрвСрС Falcon для Ruby. Π’ Π½ΠΎΠ²Ρ‹Ρ… вСрсиях Ruby имССтся Π°Π½Π°Π»ΠΎΠ³ Π·Π΅Π»Π΅Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (green-thread), Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ±Π΅Ρ€ΠΎΠΌ (fiber), ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ входящий запрос Falcon ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ruby-ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π°. Π€Π°ΠΉΠ±Π΅Ρ€Ρ‹ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ автоматичСски ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС ядра CPU, поэтому Falcon запускаСт копию прилоТСния Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ доступном ядрС процСссора (ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅, ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ памяти достаточно).

Π’ΠΎ всСх этих случаях Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡƒΠ»Ρ‹ соСдинСний Π² Π°Π΄Π°ΠΏΡ‚Π΅Ρ€Π°Ρ… Π‘Π” с Ρ†Π΅Π»ΡŒΡŽ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ число ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, доступноС для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ процСсса. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ pooling-прокси, Ссли сСрвСры ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ Π»ΠΈΠΌΠΈΡ‚ΠΎΠΌ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° соСдинСния, ΠΈΠ»ΠΈ Ссли ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΈ высвобоТдСниСм соСдинСний становится Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.

Redis ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ соСдинСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ†ΠΈΠΊΠ»Π° событий. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ соСдинСний, сколько имССтся доступных ΠΏΠΎΡ€Ρ‚ΠΎΠ², Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскрипторов ΠΈ памяти, ΠΏΡ€ΠΈ этом каТдая опСрация ΠΎΡ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ соСдинСния обрабатываСтся ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

3. Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ / ΠšΠ°ΡΡ‚ΠΎΠΌΠ½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°

ΠžΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС выступаСт Go, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ всСх Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ свободСн ΠΎΡ‚ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ запросов β€” ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎ-максимуму ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ доступныС рСсурсы CPU ΠΈ памяти. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ входящий запрос обрабатываСтся Π½ΠΎΠ²ΠΎΠΉ Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½ΠΎΠΉ (goroutine) β€” лСгковСсной ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ конструкциСй. ИсполняСмая срСда Go управляСт Π΅ΠΉ, ΠΏΡ€ΠΈ этом ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°Π΅Ρ‚ ΠΏΠΎ эффСктивности Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈΠ»ΠΈ процСссов. Go автоматичСски «раскидываСт» Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ ΠΏΠΎ всСм доступным ядрам CPU, хотя Π΅Π³ΠΎ Π°ΠΏΠΏΠ΅Ρ‚ΠΈΡ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ нСсколько ΠΎΠ±ΡƒΠ·Π΄Π°Ρ‚ΡŒ, Π·Π°Π΄Π°Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ runtime.GOMAXPROCS. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС происходит Π² Ρ€Π°ΠΌΠΊΠ°Ρ… исполняСмой срСды, ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π΅ копируСтся. Go Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° всСх ядрах CPU ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ запуска ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ прилоТСния Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ядрС.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Go ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с дСсятками тысяч ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… запросов Π΄Π°ΠΆΠ΅ Π½Π° совсСм ΠΌΠ°Π»Π΅Π½ΡŒΠΊΠΈΡ… сСрвСрах, Π΅Π³ΠΎ сопряТСниС с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° основС процСссов, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ PosgreSQL, ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ с ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΎΠΉ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π³ΠΎΠ½ΠΎΡ‡Π½Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒ Π½Π° ΠΏΠΎΠ»Π½ΠΎΠΉ скорости врСзаСтся Π² ΠΊΠΈΡ€ΠΏΠΈΡ‡Π½ΡƒΡŽ стСну. Если каТдая Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ SQL-ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π±ΡƒΠ΄Π΅Ρ‚ создано ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ соСдинСний, сколько насчитываСтся Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½ β€” вСдь ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡƒΠ»Π° Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½.

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с Π»ΡŽΠ±Ρ‹ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π½Π° Go, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΌ с SQL-Π±Π°Π·ΠΎΠΉ, β€” Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π΅Π» соСдинСний с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SetMaxOpenConns ΠΈ связанных ΠΎΠΏΡ†ΠΈΠΉ. Go ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΠΏΡƒΠ» с ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ sql, поэтому ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ запрос Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ соСдинСниС ΠΈΠ· ΠΏΡƒΠ»Π°, ΠΈ сразу послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ запроса ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Π² ΠΏΡƒΠ». Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ρ‡Ρ‚ΠΎΠ±Ρ‹ провСсти Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ, придСтся Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Β«ΠΎΠ±Ρ‘Ρ€Ρ‚Ρ‹Π²Π°Π΅Ρ‚Β» ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ соСдинСниС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ транзакция Π±Ρ‹Π»Π° Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° β€” это СдинствСнный способ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Π² дальнСйшСм Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ°Ρ‚ΠΈΡ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ. Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ большоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΡ€ΠΈ использовании Π΄Ρ€ΡƒΠ³ΠΈΡ… завязанных Π½Π° соСдинСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹Π΅ выраТСния ΠΈΠ»ΠΈ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ (advisory locks).

ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ автоматичСский ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π΄Π°Ρ‘Ρ‚ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠ΅ прСимущСство: ΠΎΠ½ устраняСт Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² pooling-прокси, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ соСдинСниями ΡƒΠΆΠ΅ осущСствляСтся ΠΊΡ€Π°ΠΉΠ½Π΅ агрСссивно. Π’ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π‘Π” ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ встроСно эффСктивноС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ соСдинСниями, ΠΈ соСдинСниС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π°ΠΊ ΠΆΠ΅ эффСктивно, ΠΊΠ°ΠΊ ΠΈ Π² pooling-прокси. БистСмы, устроСнныС ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ эффСктивно, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ приходится Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ с ΠΏΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹ΠΌΠΈ случаями, ΠΊΠΎΠ³Π΄Π° Ρ€ΡƒΡ‡Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ.

Помимо ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹Ρ… нюансов, связанных с ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ выраТСниями ΠΈ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ (advisory locks), ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ Ρ€ΡƒΡ‡Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ соСдинСниями Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ, связанным со Π²Π·Π°ΠΈΠΌΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ. Если Π·Π°Π΄Π°Π½ΠΎ максимальноС число соСдинСний, ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ запросам для Ρ€Π°Π±ΠΎΡ‚Ρ‹ трСбуСтся Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ соСдинСния, сущСствуСт Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ попадания Π² ΠΏΠΎΡ€ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΡ€ΡƒΠ³, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ запросы бСсконСчно Π΄ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ΡΡ, ΠΏΠΎΠΊΠ° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ запросы освободят соСдинСния. Π’ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ°Ρ… ΠΎΠ± ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΏΡƒΠ»Π° для HikariCP приводятся Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ справится с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ Π²Ρ€ΠΎΠ΄Π΅ этой.

Π”Ρ€ΡƒΠ³ΠΈΠ΅ языки Π½Π° основС VM, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Java, Scala/Akka, Clojure, Kotlin (всС Π½Π° JVM) ΠΈ Elixir/Erlang (Π½Π° BEAM VM) Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: задСйствованиС всСх доступных ядСр CPU Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π±Π΅Π· запуска ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ прилоТСния для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ядра. РСализация ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ систСмы ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΊ Π‘Π” ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ свои тонкости, ΠΎΠ΄Π½Π°ΠΊΠΎ с Π½ΠΈΠΌΠΈ Π»Π΅Π³ΠΊΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ΄Π½Ρƒ ΠΈΠ»ΠΈ нСсколько ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ, ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅.

Π‘Π²ΡΠΆΠΈΡ‚Π΅ΡΡŒ со ΠΌΠ½ΠΎΠΉ Π² Twitter, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΡ… систСм, Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ вопросы/замСчания/поТСлания, ΠΈΠ»ΠΈ Π²Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *