[ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄] Envoy модСль ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (Envoy threading model)

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ: Envoy threading model β€” https://blog.envoyproxy.io/envoy-threading-model-a8d44b922310

Данная ΡΡ‚Π°Ρ‚ΡŒΡΡ показалась ΠΌΠ½Π΅ достаточно интСрСсной, Π° Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Envoy Ρ‡Π°Ρ‰Π΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ Β«istioΒ» ΠΈΠ»ΠΈ просто ΠΊΠ°ΠΊ Β«ingress controllerΒ» kubernetes, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ людСй Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ с Π½ΠΈΠΌ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΆΠ΅ прямого взаимодСйствия ΠΊΠ°ΠΊ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с Ρ‚ΠΈΠΏΠΎΠ²Ρ‹ΠΌΠΈ установками Nginx ΠΈΠ»ΠΈ Haproxy. Однако Ссли Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ломаСтся, Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ устроСнно ΠΈΠ·Π½ΡƒΡ‚Ρ€ΠΈ. Π― постарался пСрСвСсти ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большС тСкста Π½Π° русский Π² Ρ‚ΠΎΠΌ числС ΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ слова, для Ρ‚Π΅Ρ… ΠΊΠΎΠΌΡƒ больно Π½Π° Ρ‚Π°ΠΊΠΎΠ΅ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ я оставил ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Ρ‹ Π² скобках. Π”ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚.

ВСхничСская докумСнтация Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня ΠΏΠΎ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Π΅ Envoy Π² настоящСС врСмя довольно скудная. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ это, я ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΡŽ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ΅Ρ€ΠΈΡŽ статСй Π² Π±Π»ΠΎΠ³Π΅ ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… подсистСмах Envoy. Π’Π°ΠΊ ΠΊΠ°ΠΊ это пСрвая ΡΡ‚Π°Ρ‚ΡŒΡ, поТалуйста, Π΄Π°ΠΉΡ‚Π΅ ΠΌΠ½Π΅ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅ ΠΈ Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹Ρ‚ΡŒ интСрСсно Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΡΡ‚Π°Ρ‚ΡŒΡΡ….

Один ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных тСхничСских вопросов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ ΠΎ Envoy, это запрос Π½Π° Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ΅ описаниС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (threading model). Π’ этом постС я ΠΎΠΏΠΈΡˆΡƒ ΠΊΠ°ΠΊ Envoy сопоставляСт соСдинСния с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ описаниС систСмы локального Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (Thread Local Storage), которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.

ОписаниС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (Threading overview)

[ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄] Envoy модСль ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (Envoy threading model)

Envoy ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²:

  • Основной (Main): Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΡ‚ΠΎΠΊ управляСт запуском ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ процСсса, всСй ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ XDS (xDiscovery Service) API, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ DNS, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ работоспособности (health checking), ΠΎΠ±Ρ‰Π΅Π΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ кластСром ΠΈ процСссом Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСрвиса (runtime), сбросом статистики, администрированиС ΠΈ ΠΎΠ±Ρ‰Π΅Π΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ процСссами β€” Linux сигналы, горячий пСрСзапуск (hot restart) ΠΈ Ρ‚. Π΄. ВсС, Ρ‡Ρ‚ΠΎ происходит Π² этом ΠΏΠΎΡ‚ΠΎΠΊΠ΅, являСтся асинхронным ΠΈ Β«Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌΒ». Π’ Ρ†Π΅Π»ΠΎΠΌ основной ΠΏΠΎΡ‚ΠΎΠΊ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ всС критичСскиС процСссы Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, для выполнСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ трСбуСтся большого количСства ЦПУ. Π­Ρ‚ΠΎ позволяСт Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° управлСния ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½ Π±Ρ‹Π» ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΌ.
  • Π Π°Π±ΠΎΡ‡ΠΈΠΉ (Worker): По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Envoy создаСт Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ(worker thread) для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² систСмС, это ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΡ†ΠΈΠΈ --concurrency. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ запускаСт Β«Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉΒ» Ρ†ΠΈΠΊΠ» событий (event loop), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π½ΠΈΠ΅ (listening) ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Ρ‚Π΅Π»Ρ (listener), Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания ΡΡ‚Π°Ρ‚ΡŒΠΈ (29 июля 2017 Π³.) Π½Π΅Ρ‚ сСгмСнтирования (sharding) ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Ρ‚Π΅Π»Ρ (listener), ΠΏΡ€ΠΈΠ΅ΠΌ Π½ΠΎΠ²Ρ‹Ρ… соСдинСний, созданиС экзСмпляра стСка Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ всСх ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° (IO) Π·Π° врСмя сущСствования соСдинСния. ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, это позволяСт Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ соСдинСний ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½ Π±Ρ‹Π» ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΌ.
  • Π€Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ (File flusher): ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΈΡˆΠ΅Ρ‚ Envoy, Π² основном ΠΆΡƒΡ€Π½Π°Π»Ρ‹ доступа (access logs), Π² настоящСС врСмя ΠΈΠΌΠ΅Π΅Ρ‚ нСзависимый Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ запись Π² Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмой Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ использовании O_NONBLOCK ΠΈΠ½ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ (Π²Π·Π΄ΠΎΡ…). Когда Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Ρ„Π°ΠΉΠ», Π΄Π°Π½Π½Ρ‹Π΅ фактичСски ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² Π±ΡƒΡ„Π΅Ρ€ Π² памяти, Π³Π΄Π΅ ΠΎΠ½ΠΈ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΡΠ±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΡ‚ΠΎΠΊ file flush. Π­Ρ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· областСй ΠΊΠΎΠ΄Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ тСхничСски всС Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ (worker threads) ΠΌΠΎΠ³ΡƒΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (block) ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ (lock), ΠΏΡ‹Ρ‚Π°ΡΡΡŒ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ памяти.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° соСдинСний (Connection handling)

Как ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»ΠΎΡΡŒ Π²ΠΊΡ€Π°Ρ‚Ρ†Π΅ Π²Ρ‹ΡˆΠ΅, всС Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°ΡŽΡ‚ всСх ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Π΅ΠΉ (listeners) Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ сСгмСнтирования. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ядро ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π³Ρ€Π°ΠΌΠΎΡ‚Π½ΠΎΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ принятых сокСтов Π² Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ. Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ядра Π² Ρ†Π΅Π»ΠΎΠΌ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈ Π² этом, ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ‚Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠ°ΠΊ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° (IO), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°ΡŽΡ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ сокСт, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ»ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ (Spinlock) для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ запроса.
Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ соСдинСниС принято Π½Π° Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ (worker thread), ΠΎΠ½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΠΎΠΊΠΈΠ΄Π°Π΅Ρ‚ этот ΠΏΠΎΡ‚ΠΎΠΊ (thread). Вся дальнСйшая ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° соСдинСния ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ обрабатываСтся Π² Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ (worker thread), Π²ΠΊΠ»ΡŽΡ‡Π°Ρ любоС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ пСрСсылки (forwarding behavior).

Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько Π²Π°ΠΆΠ½Ρ‹Ρ… послСдствий:

  • ВсС ΠΏΡƒΠ»Ρ‹ соСдинСний Π² Envoy относятся ΠΊ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, хотя ΠΏΡƒΠ»Ρ‹ соСдинСний HTTP/2 Π΄Π΅Π»Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ соСдинСниС с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ Π²Ρ‹ΡˆΠ΅ΡΡ‚ΠΎΡΡ‰ΠΈΠΌ хостом Π·Π° Ρ€Π°Π·, Ссли Π΅ΡΡ‚ΡŒ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ соСдинСния HTTP/2 Π½Π° Π²Ρ‹ΡˆΠ΅ΡΡ‚ΠΎΡΡ‰ΠΈΠΉ хост Π² устойчивом состоянии.
  • ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Envoy Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ, сохраняя всС Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΏΠΎΡ‡Ρ‚ΠΈ вСсь ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ написан Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΈ ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ ΠΎΠ½ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ. Π­Ρ‚ΠΎΡ‚ Π΄ΠΈΠ·Π°ΠΉΠ½ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ написаниС большого количСства ΠΊΠΎΠ΄Π° ΠΈ нСвСроятно Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ числа Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².
  • Однако, ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· основных Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ² являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния эффСктивности ΠΏΡƒΠ»Π° памяти ΠΈ соСдинСний Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ --concurrency. НаличиС большСго количСства Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρ‡Π΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΏΠΎΡ‚Π΅Ρ€Π΅ памяти, созданию большСго количСства Π±Π΅Π·Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… соСдинСний ΠΈ сниТСнию скорости попадания Π² ΠΏΡƒΠ» соСдинСний. Π’ Lyft наши envoy sidecar ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с ΠΎΡ‡Π΅Π½ΡŒ Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠΎΠΌ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ соотвСтствуСт слуТбам, рядом с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΠ½ΠΈ сидят. ΠœΡ‹ запускаСм Envoy Π² качСствС ΠΏΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π½ΠΎΠ³ΠΎ прокси-сСрвСра (edge) Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ максимальном ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ΅ (concurrency).

Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ (What non-blocking means)

Π’Π΅Ρ€ΠΌΠΈΠ½ Β«Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉΒ» Π΄ΠΎ сих ΠΏΠΎΡ€ использовался нСсколько Ρ€Π°Π· ΠΏΡ€ΠΈ обсуТдСнии Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ основной ΠΈ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊΠΈ. Π’Π΅ΡΡŒ ΠΊΠΎΠ΄ написан ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ Π½ΠΈΡ‡Ρ‚ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ блокируСтся. Однако, это Π½Π΅ совсСм Π²Π΅Ρ€Π½ΠΎ (Ρ‡Ρ‚ΠΎ Π½Π΅ совсСм Π²Π΅Ρ€Π½ΠΎ?).

Envoy ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ нСсколько Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ процСсса:

  • Как ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ, ΠΏΡ€ΠΈ записи ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² доступа всС Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π±ΡƒΡ„Π΅Ρ€Π° ΠΆΡƒΡ€Π½Π°Π»Π° Π² памяти. ВрСмя удСрТания Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Π½ΠΈΠ·ΠΊΠΈΠΌ, Π½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ эта Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΠΏΠ°Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ высоком ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ΅ ΠΈ высокой пропускной способности.
  • Envoy ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ систСму для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ статистики, которая являСтся локальной для ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π΅ΠΌΠ° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поста. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, я ΠΊΡ€Π°Ρ‚ΠΊΠΎ упомяну, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ локальной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ статистики ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈΠ½ΠΎΠ³Π΄Π° трСбуСтся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ для Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Β«Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° статистики». Π­Ρ‚Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ.
  • Основной ΠΏΠΎΡ‚ΠΎΠΊ пСриодичСски нуТдаСтся Π² ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ†ΠΈΠΈ со всСми Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. Π­Ρ‚ΠΎ дСлаСтся ΠΏΡƒΡ‚Π΅ΠΌ Β«ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈΒ» ΠΈΠ· основного ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π° ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈ ΠΈΠ· Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² основной ΠΏΠΎΡ‚ΠΎΠΊ. Для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ трСбуСтся Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½ΠΎΠ΅ сообщСниС ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ доставки. Π­Ρ‚ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π°Ρ‚ΡŒΡΡ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎΠΌΡƒ сопСрничСству, Π½ΠΎ ΠΎΠ½ΠΈ всС Ρ€Π°Π²Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ тСхничСски Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ.
  • Когда Envoy ΠΏΠΈΡˆΠ΅Ρ‚ ΠΆΡƒΡ€Π½Π°Π» Π² систСмный ΠΏΠΎΡ‚ΠΎΠΊ ошибок (standard error), ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ всСго процСсса. Π’ Ρ†Π΅Π»ΠΎΠΌ, локальноС Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΆΡƒΡ€Π½Π°Π»Π° Envoy считаСтся уТасным с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, поэтому Π΅Π³ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡŽ Π½Π΅ удСляСтся ΠΌΠ½ΠΎΠ³ΠΎ внимания.
  • Π•ΡΡ‚ΡŒ нСсколько Π΄Ρ€ΡƒΠ³ΠΈΡ… случайных Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ, Π½ΠΎ Π½ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ… Π½Π΅ являСтся критичСской для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΡΠΏΠ°Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ.

Π›ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° (Thread local storage)

Из-Π·Π° способа, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Envoy отдСляСт обязанности основного ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΎΡ‚ обязанностСй Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, сущСствуСт Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ слоТная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° Π² Π³Π»Π°Π²Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, Π° Π·Π°Ρ‚Π΅ΠΌ прСдоставлСна ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ с высокой ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΡŽ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°. Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ описана систСма Envoy Thread Local Storage (TLS) Π½Π° высоком ΡƒΡ€ΠΎΠ²Π½Π΅. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ я ΠΎΠΏΠΈΡˆΡƒ, ΠΊΠ°ΠΊ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для управлСния кластСром.
[ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄] Envoy модСль ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (Envoy threading model)

Как ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ описано, основной ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ практичСски всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ управлСния (management) ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ плоскости управлСния (control plane) Π² процСссС Envoy. ΠŸΠ»ΠΎΡΠΊΠΎΡΡ‚ΡŒ управлСния здСсь Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π°, Π½ΠΎ Ссли Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… самого процСсса Envoy ΠΈ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ с пСрСсылкой, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, это прСдставляСтся цСлСсообразным. По ΠΎΠ±Ρ‰Π΅ΠΌΡƒ ΠΏΡ€Π°Π²ΠΈΠ»Ρƒ процСсс основного ΠΏΠΎΡ‚ΠΎΠΊΠ° выполняСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π° Π·Π°Ρ‚Π΅ΠΌ Π΅ΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π² соотвСтствии с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ этой Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΏΡ€ΠΈ этом Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ доступС.

БистСма TLS (Thread local storage) Envoy Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  • Код, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉΡΡ Π² основном ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ слот TLS для всСго процСсса. Π₯отя это абстрагировано, Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ это индСкс Π² Π²Π΅ΠΊΡ‚ΠΎΡ€Π΅, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ доступ O(1).
  • Основной ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² свой слот. Когда это сдСлано, Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΡŽΡ‚ΡΡ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ событиС Ρ†ΠΈΠΊΠ»Π° событий.
  • Π Π°Π±ΠΎΡ‡ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· своСго слота TLS ΠΈ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², доступныС Ρ‚Π°ΠΌ.

Π₯отя это ΠΎΡ‡Π΅Π½ΡŒ простая ΠΈ нСвСроятно мощная ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ°, которая ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ RCU(Read-Copy-Update). По сути, Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ видят ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Π² слотах TLS Π²ΠΎ врСмя выполнСния Ρ€Π°Π±ΠΎΡ‚Ρ‹. ИзмСнСниС происходит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ покоя ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌΠΈ событиями.

Envoy ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ это двумя Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами:

  • Бохраняя Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, доступ ΠΊ этим Π΄Π°Π½Π½Ρ‹ΠΌ осущСствляСтся Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ.
  • Бохраняя ΠΎΠ±Ρ‰ΠΈΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Β«Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния» Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ счСтчик ссылок Π½Π° Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ Π²ΠΎ врСмя выполнСния Ρ€Π°Π±ΠΎΡ‚Ρ‹. Волько ΠΊΠΎΠ³Π΄Π° всС Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊΠΈ успокоятся ΠΈ загрузят Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠ±Ρ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅, старыС Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½Ρ‹. Π­Ρ‚ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ RCU.

ΠŸΠΎΡ‚ΠΎΠΊ обновлСния кластСра (Cluster update threading)

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ я ΠΎΠΏΠΈΡˆΡƒ, ΠΊΠ°ΠΊ TLS (Thread local storage) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для управлСния кластСром. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ кластСром Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ API xDS ΠΈ / ΠΈΠ»ΠΈ DNS, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ работоспособности (health checking).
[ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄] Envoy модСль ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (Envoy threading model)

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ кластСра Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΈ этапы:

  1. ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ кластСра β€” это ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π²Π½ΡƒΡ‚Ρ€ΠΈ Envoy, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ управляСт всСми извСстными апстримами (upstream) кластСра, API-интСрфСйсом CDS (Cluster Discovery Service), API-интСрфСйсами SDS (Secret Discovery Service) ΠΈ EDS (Endpoint Discovery Service), DNS ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ внСшними ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°ΠΌΠΈ работоспособности (health checking). Он ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° созданиС Π² Β«ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ согласованного» (eventually consistent) прСдставлСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ апстрима (upstream) кластСра, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ хосты, Π° Ρ‚Π°ΠΊΠΆΠ΅ состояниС работоспособности (health status).
  2. БрСдство ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ работоспособности (health checker) выполняСт Π°ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ работоспособности ΠΈ сообщаСт ΠΎΠ± измСнСниях состояния работоспособности диспСтчСру кластСра.
  3. CDS (Cluster Discovery Service) / SDS (Secret Discovery Service) / EDS (Endpoint Discovery Service) / DNS Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ для опрСдСлСния принадлСТности ΠΊ кластСру. ИзмСнСниС состояния возвращаСтся ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρƒ кластСра.
  4. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ постоянно выполняСт Ρ†ΠΈΠΊΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий.
  5. Когда ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ кластСра опрСдСляСт, Ρ‡Ρ‚ΠΎ состояниС для кластСра измСнилось, ΠΎΠ½ создаСт Π½ΠΎΠ²Ρ‹ΠΉ снимок состояния кластСра, доступный Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния, ΠΈ отправляСт Π΅Π³ΠΎ Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.
  6. Π’ Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° покоя Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ снимок Π² Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ слотС TLS.
  7. Π’ΠΎ врСмя события Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ хост для балансировки Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, балансировщик Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ слот TLS (Thread local storage) для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ хостС. Для этого Π½Π΅ трСбуСтся Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅, Ρ‡Ρ‚ΠΎ TLS ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ события ΠΏΡ€ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ подсистСмы балансировки Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ кэши, структуры Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ‚.Π΄. Π­Ρ‚ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ этого поста, Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… мСстах ΠΊΠΎΠ΄Π°.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, Envoy ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ запрос Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ (ΠΊΡ€ΠΎΠΌΠ΅ описанных Ρ€Π°Π½Π΅Π΅). Помимо слоТности самого ΠΊΠΎΠ΄Π° TLS, большСй части ΠΊΠΎΠ΄Π° Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ, ΠΈ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ написан Π² ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. Π­Ρ‚ΠΎ ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ написаниС большСй части ΠΊΠΎΠ΄Π° Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ прСвосходной ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Π”Ρ€ΡƒΠ³ΠΈΠ΅ подсистСмы, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ TLS (Other subsystems that make use of TLS)

TLS (Thread local storage) ΠΈ RCU (Read Copy Update) ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² Envoy.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования:

  • ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ измСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² процСссС выполнСния: Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ список Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° вычисляСтся Π² основном ΠΏΠΎΡ‚ΠΎΠΊΠ΅. Π—Π°Ρ‚Π΅ΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ прСдоставляСтся снимок Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния с использованиСм сСмантики RCU.
  • Π—Π°ΠΌΠ΅Π½Π° Ρ‚Π°Π±Π»ΠΈΡ† ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ²: для Ρ‚Π°Π±Π»ΠΈΡ† ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ², прСдоставляСмых RDS (Route Discovery Service), Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ² ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π² основном ΠΏΠΎΡ‚ΠΎΠΊΠ΅. Π‘Π½ΠΈΠΌΠΎΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния Π² дальнСйшСм Π±ΡƒΠ΄Π΅Ρ‚ прСдоставлСн ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ с использованиСм сСмантики RCU (Read Copy Update). Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ† ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ² Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎ эффСктивным.
  • ΠšΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² HTTP: Как выясняСтся, вычислСниС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° HTTP для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ запроса (ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ~25K+ RPS Π½Π° ядро) довольно Π΄ΠΎΡ€ΠΎΠ³ΠΎ. Envoy Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎ вычисляСт Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ полсСкунды ΠΈ прСдоставляСт Π΅Π³ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊΡƒ Ρ‡Π΅Ρ€Π΅Π· TLS ΠΈ RCU.

Π•ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ случаи, Π½ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, для Ρ‡Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ TLS.

Π˜Π·Π²Π΅ΡΡ‚Π½Ρ‹Π΅ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (Known performance pitfalls)

Π₯отя Π² Ρ†Π΅Π»ΠΎΠΌ Envoy Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ достаточно Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π΅ΡΡ‚ΡŒ нСсколько извСстных областСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ внимания, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ с ΠΎΡ‡Π΅Π½ΡŒ высоким ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠΎΠΌ ΠΈ пропускной ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒΡŽ:

  • Как ΡƒΠΆΠ΅ описано Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅, Π² настоящСС врСмя всС Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΏΡ€ΠΈ записи Π² Π±ΡƒΡ„Π΅Ρ€ памяти ΠΆΡƒΡ€Π½Π°Π»Π° доступа. ΠŸΡ€ΠΈ высоком ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ΅ ΠΈ высокой пропускной способности потрСбуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² доступа для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π·Π° счСт нСупорядочСнной доставки ΠΏΡ€ΠΈ записи Π² ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». Как Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρƒ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» доступа для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.
  • Π₯отя статистика ΠΎΡ‡Π΅Π½ΡŒ сильно ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π°, ΠΏΡ€ΠΈ ΠΎΡ‡Π΅Π½ΡŒ высоком ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ΅ ΠΈ пропускной способности, вСроятно, Π±ΡƒΠ΄Π΅Ρ‚ атомарная конкурСнция Π½Π° ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ статистикС. РСшСниС этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ β€” счСтчики Π½Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ с пСриодичСским сбросом Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹Ρ… счСтчиков. Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ постС.
  • Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ссли Envoy Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ Π² сцСнарии, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»ΠΎ соСдинСний, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… рСсурсов для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. НСт Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ, Ρ‡Ρ‚ΠΎ связи Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ распрСдСлСны ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΏΡƒΡ‚Π΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ балансировки Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… соСдинСний, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΠΌΠ΅Π½Π° соСдинСниями ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ (Conclusion)

МодСль ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Envoy Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° для обСспСчСния простоты программирования ΠΈ массового ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ° Π·Π° счСт ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°ΡΡ‚ΠΎΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ использования памяти ΠΈ соСдинСний, Ссли ΠΎΠ½ΠΈ Π½Π΅ настроСны ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. Π­Ρ‚Π° модСль позволяСт Π΅ΠΌΡƒ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΎΡ‡Π΅Π½ΡŒ высоком количСствС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ пропускной способности.
Как я ΠΊΡ€Π°Ρ‚ΠΊΠΎ упомянул Π² Π’Π²ΠΈΡ‚Ρ‚Π΅Ρ€Π΅, Π΄ΠΈΠ·Π°ΠΉΠ½ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Ρ€Ρ… ΠΏΠΎΠ»Π½ΠΎΡ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ сСтСвого стСка Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠ°ΠΊ DPDK (Data Plane Development Kit), Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ сСрвСры Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Ρ‹ запросов Π² сСкунду ΠΏΡ€ΠΈ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ L7. Π‘ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ интСрСсно ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ построСно Π² блиТайшиС нСсколько Π»Π΅Ρ‚.
Один послСдний быстрый ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ: мСня ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π· ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°Π»ΠΈ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ C ++ для Envoy. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ это всС Π΅Ρ‰Π΅ СдинствСнный ΡˆΠΈΡ€ΠΎΠΊΠΎ распространСнный язык ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎΠ³ΠΎ уровня, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ, ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ Π² этом постС. C ++ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для всСх ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ для ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², Π½ΠΎ для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… случаСв использования это всС Π΅Ρ‰Π΅ СдинствСнный инструмСнт для выполнСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ (to get the job done).

Бсылки Π½Π° ΠΊΠΎΠ΄ (Links to code)

Бсылки Π½Π° Ρ„Π°ΠΉΠ»Ρ‹ с интСрфСйсами ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ², обсуТдаСмыС Π² этом постС:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

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