Π‘Ρ‚Ρ€ΠΎΠΈΠΌ собствСнный serverless Π½Π° основС Fn

Π‘Ρ‚Ρ€ΠΎΠΈΠΌ собствСнный serverless Π½Π° основС Fn

БСссСрвСрныС вычислСния β€” ΠΎΠ΄Π½Π° ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹Ρ… Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΠΉ Π² ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Ρ… вычислСниях. Основной ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ инфраструктура β€” Π·Π°Π±ΠΎΡ‚Π° Π½Π΅ DevOps’ов, Π° поставщика услуг. ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ рСсурсов автоматичСски подстраиваСтся ΠΏΠΎΠ΄ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΈ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ высокой ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ измСнСния.

Другая общая Ρ‡Π΅Ρ€Ρ‚Π° β€” тСндСнция ΠΊ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ фокусировании ΠΊΠΎΠ΄Π°, поэтому бСссСрвСрныС вычислСния ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ «Ρ„ункция ΠΊΠ°ΠΊ услуга» (FaaS).

Π˜ΡΡ‚ΠΎΡ€ΠΈΡ‡Π΅ΡΠΊΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ поставщиком ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Ρ… услуг, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ²ΡˆΠΈΠΌ FaaS с AWS Lambda, Π±Ρ‹Π» Amazon, ΠΎΡ‚ΠΊΡƒΠ΄Π° ΠΈ пошло это Π½Π°Π·Π²Π°Π½ΠΈΠ΅. Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Π΅ поставщики услуг Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈ:

  • Cloud Functions ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Google
  • Azure Functions ΠΎΡ‚ Microsoft

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

  • ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ Apache OpenWhisk, Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ Π² ΠΈΠ½ΠΊΡƒΠ±Π°Ρ‚ΠΎΡ€Π΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ IBM,
  • Spring Cloud Functions, ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ достаточно Π±ΠΎΠ³Π°Ρ‚ΠΎΠΉ экосистСмы Spring Framework, которая Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использована ΠΊΠ°ΠΊ фасад AWS Lambda, Azure Functions ΠΈ OpenWhisk,
  • ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ Fn, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ Oracle.

ВсС ΠΎΠ½ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ нСзависимы ΠΎΡ‚ ΠΎΠ±Π»Π°ΠΊΠΎΠ², Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² любоС ΠΎΠ±Π»Π°ΠΊΠΎ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ вашС собствСнноС, ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΈΠ»ΠΈ частноС, ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅ Π² Exoscale.

Как ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Fn устроСн

Fn ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ основан Π½Π° Docker, состоит ΠΈΠ· Π΄Π²ΡƒΡ… основных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²:

  • CLI ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠΉ для управлСния всСми аспСктами инфраструктуры Fn, ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ с сСрвСром Fn,
  • БобствСнно сСрвСр Fn, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ для Docker.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Π² Fn, Ρ‚Π°ΠΊ ΠΆΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ…, Ρ‡Ρ‚ΠΎ позволяСт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ вСсьма ΠΌΠ½ΠΎΠ³ΠΎ языков для программирования, напримСр… Clojure!

АргумСнты Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π½Π° стандартный Π²Π²ΠΎΠ΄ (STDIN), Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΠΈΡˆΡƒΡ‚ΡΡ Π½Π° стандартный Π²Ρ‹Π²ΠΎΠ΄ (STDOUT). Π•Π»ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ простыми значСниями (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ JSON) β€” ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ слоя абстракции, прСдоставляСмого самим Fn Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (FDK).

Для удобства ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ΡΡ встроСнныС Π½Π°Π±ΠΎΡ€Ρ‹ шаблонов, ΠΎΠ±Π»Π΅Π³Ρ‡Π°ΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ FaaS Π½Π° ΠΎΠ±ΡˆΠΈΡ€Π½ΠΎΠΌ спискС Ρ€Π°Π·Π½Ρ‹Ρ… языков ΠΈ ΠΈΡ… вСрсий (Go, Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Java, Python ΠΈ Ρ‚.Π΄.).

Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ FaaS просто, слСдуя этой схСмС:

  • Π Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ CLI Fn: создаСтся ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» прилоТСния для Fn, основанный Π½Π° Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌ шаблонС.
  • Π’Ρ‹ΠΊΠ°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ CLI Fn: ΠΎΠ±Ρ€Π°Π· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° помСщаСтся Π² Π½Π΅ΠΊΠΈΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, послС Ρ‡Π΅Π³ΠΎ сСрвСр увСдомляСтся ΠΎ сущСствовании ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ этого ΠΎΠ±Ρ€Π°Π·Π°.

Π‘Ρ‚Ρ€ΠΎΠΈΠΌ собствСнный serverless Π½Π° основС Fn
ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ поставки Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Fn

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Π°Ρ установка ΠΈ тСстированиС бСссСрвСрных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

ΠŸΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΠΌ ΠΊ установкС Fn Π½Π° локальной машинС. Π‘Π½Π°Ρ‡Π°Π»Π° устанавливаСтся Docker, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ³ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Fn. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π° Debian/Ubuntu:

$ sudo apt-get update
$ sudo apt-get install docker.io

Ну ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²/ сборку Docker согласно вашСй систСмС. Π—Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ прямиком ΠΊ установкС Fn CLI. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ curl:

$ curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh

Если Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ Π½Π° OSX с установлСнным Homebrew, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΉΡ‚ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΡƒΡ‚Π΅ΠΌ:

$ brew install fn

==> Downloading https://homebrew.bintray.com/bottles/fn-0.5.8.high_sierra.bottle.tar.gz
==> Downloading from https://akamai.bintray.com/b1/b1767fb00e2e69fd9da73427d0926b1d1d0003622f7ddc0dd3a899b2894781ff?__gda__=exp=1538038849~hmac=c702c9335e7785fcbacad1f29afa61244d02f2eebb
######################################################################## 100.0%
==> Pouring fn-0.5.8.high_sierra.bottle.tar.gz
  /usr/local/Cellar/fn/0.5.8: 5 files, 16.7MB

БСйчас всС Π³ΠΎΡ‚ΠΎΠ²ΠΎ для ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ разворачивания нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с использованиСм CLI. Для простоты ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ срСду для запуска, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Node:

$ fn init --runtime node --trigger http hellonode

Creating function at: /hellonode
Function boilerplate generated.
func.yaml created.

Π‘ΡƒΠ΄Π΅Ρ‚ создан Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ hellonode для дальнСйшСй Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Fn с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ основными ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. Π’Π½ΡƒΡ‚Ρ€ΠΈ новосозданного ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ стандартам Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Π²Π°ΠΌΠΈ языка ΠΈΠ»ΠΈ срСды исполнСния:

# ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ с node выглядит Ρ‚Π°ΠΊ:

   hellonode
   β”œβ”€β”€ func.js
   β”œβ”€β”€ func.yaml
   └── package.json

# БвСТСустановлСнноС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Java11 Ρ‚Π°ΠΊΠΎΠ΅:

   hellojava11
   β”œβ”€β”€ func.yaml
   β”œβ”€β”€ pom.xml
   └── src
       β”œβ”€β”€ main
       β”‚   └── java
       β”‚       └── com
       β”‚           └── example
       β”‚               └── fn
       β”‚                   └── HelloFunction.java
       └── test
           └── java
               └── com
                   └── example
                       └── fn
                           └── HelloFunctionTest.java

Fn создаСт Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ структуру ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, создаСт Ρ„Π°ΠΉΠ» func.yaml, содСрТащий Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ установки для Fn, ΠΈ устанавливаСт шаблон для ΠΊΠΎΠ΄Π° Π½Π° языкС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ.

Π’ случаС срСды выполнСния Node это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚:

$ cat hellonode/func.js

const fdk=require('@fnproject/fdk');

fdk.handle(function(input){
  let name = 'World';
  if (input.name) {
    name = input.name;
  }
  return {'message': 'Hello ' + name}
})

БСйчас ΠΌΡ‹ ΠΏΠΎ-быстрому ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ локально, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ всС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

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

$ fn start -d                    # запускаСм Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ сСрвСр Π² Ρ„ΠΎΠ½Π΅

Unable to find image 'fnproject/fnserver:latest' locally
latest: Pulling from fnproject/fnserver
ff3a5c916c92: Pull complete
1a649ea86bca: Pull complete
ce35f4d5f86a: Pull complete

...

Status: Downloaded newer image for fnproject/fnserver:latest
668ce9ac0ed8d7cd59da49228bda62464e01bff2c0c60079542d24ac6070f8e5

Для запуска нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΅Π΅ Π½Π°Π΄ΠΎ «Π²Ρ‹ΠΊΠ°Ρ‚ΠΈΡ‚ΡŒ». Для этого трСбуСтся имя прилоТСния: Π² Fn всС прилоТСния Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½Ρ‹ Π² Π²ΠΈΠ΄Π΅ пространств ΠΈΠΌΠ΅Π½ для связанных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Fn Π‘LI Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» func.yaml Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ для настройки Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ сначала Π½Π°Π΄ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² наш ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ hellonode.

$ cd hellonode
$ fn deploy --app fnexo --local  # Π²Ρ‹ΠΊΠ°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ локально, имя прилоТСния - fnexo.
                                 # ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ local Π½Π΅ Π·Π°Π»ΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π· Π² ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ рССстр,
                                 # запуская Π΅Π³ΠΎ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ

Deploying hellonode to app: fnexo
Bumped to version 0.0.2
Building image nfrankel/hellonode:0.0.3 .
Updating function hellonode using image nfrankel/hellonode:0.0.3...
Successfully created app:  fnexo
Successfully created function: hellonode with nfrankel/hellonode:0.0.3
Successfully created trigger: hellonode-trigger

Как ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΈΠ· Π²Ρ‹Π²ΠΎΠ΄Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, создаСтся Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° для Docker, содСрТащий Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Ѐункция Π³ΠΎΡ‚ΠΎΠ²Π° для Π²Ρ‹Π·ΠΎΠ²Π°, Π° Ρƒ нас Π΅ΡΡ‚ΡŒ Π΄Π²Π° способа ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это:

  • ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Fn invoke
  • вызывая Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Ρ‡Π΅Ρ€Π΅Π· http

Π’Ρ‹Π·ΠΎΠ² invoke Ρ‡Π΅Ρ€Π΅Π· Fn просто эмулируСт Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎ HTTP для тСстов, Ρ‡Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ для быстрой ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ:

$ fn invoke fnexo hellonode      # Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ hellonode прилоТСния fnexo

{"message":"Hello World"}

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π½Π°Π΄ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ URL:

$ curl http://localhost:8080/t/fnexo/hellonode-trigger

{"message":"Hello World"}

Π‘Π΅Ρ€Π²Π΅Ρ€ Fn прСдоставляСт свои Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΡ€Ρ‚ 8080, ΠΈ, ΠΊΠ°ΠΊ каТСтся, URL Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ соотвСтствуСт схСмС t/app/function, Π½ΠΎ Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ. Π§Π΅Ρ€Π΅Π· HTTP функция вызываСтся Π½Π΅ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π° Ρ‡Π΅Ρ€Π΅Π· Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ trigger, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ согласно своСму названию «Π·Π°ΠΏΡƒΡΠΊΠ°Π΅Ρ‚» Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Ρ€ΠΈΠ³Π³Π΅Ρ€Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π² `func.yml ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

schema_version: 20180708
name: hellonode
version: 0.0.3
runtime: node
entrypoint: node func.js
format: json
triggers:
- name: hellonode-trigger
  type: http
  source: /hellonode-trigger    # URL Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π°

МоТСм ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ имя Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΎ соотвСтствовало ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, это всС упростит:

triggers:
- name: hellonode-trigger
  type: http
  source: /hellonode    # совпадаСт с ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π—Π°Ρ‚Π΅ΠΌ запускаСм поставку Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΅Ρ‰Π΅ Ρ€Π°Π· ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π΅Π΅ ΠΈΠ· Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π°:

$ fn deploy --app fnexo hellonode --local
$ curl http://localhost:8080/t/fnexo/hellonode

{"message":"Hello World"}

ВсС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚! Π‘Π°ΠΌΠΎΠ΅ врСмя ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Π½Π°Ρ‚ΡƒΡ€Π½Ρ‹ΠΌ экспСримСнтам ΠΈ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ наш FaaS Π½Π° сСрвСрС!

Установка сСрвисов бСссСрвСрных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π° собствСнной инфраструктурС

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎ-быстрому установим Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ CLI Exoscale. Если Π²Ρ‹ Π΅Π΅ Π΅Ρ‰Π΅ Π½Π΅ настроили β€” ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ нашим руководством для быстрого запуска. Π­Ρ‚ΠΎ ΠΊΡ€ΡƒΡ‚ΠΎΠΉ инструмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Ρ‰Π΅ большС повысит Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ. НС Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°Π΄ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ для открытия ΠΏΠΎΡ€Ρ‚Π° 8080 Π² Security Group! Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ запустят Ρ‡ΠΈΡΡ‚ΡƒΡŽ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ, Π³ΠΎΡ‚ΠΎΠ²ΡƒΡŽ для размСщСния Π½Π°ΡˆΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

$ exo firewall create fn-securitygroup
$ exo firewall add fn-securitygroup ssh --my-ip
$ exo firewall add fn-securitygroup -p tcp -P 8080-8080 -c 0.0.0.0/0
$ exo vm create fn-server -s fn-securitygroup

Π—Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΉΡ‚ΠΈ ΠΏΠΎ ssh Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ сСрвСр Fn:

$ exo ssh fn-server

The authenticity of host '185.19.30.175 (185.19.30.175)' can't be established.
ECDSA key fingerprint is SHA256:uaCKRYeX4cvim+Gr8StdPvIQ7eQgPuOKdnj5WI3gI9Q.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '185.19.30.175' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 18.04 LTS (GNU/Linux 4.15.0-20-generic x86_64)

Π—Π°Ρ‚Π΅ΠΌ устанавливаСм Docker ΠΈ сСрвСр Fn Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ это ΡƒΠΆΠ΅ дСлалось Π½Π° локальной машинС, запускаСм сСрвСр:

$ sudo apt-get update
$ sudo apt-get install docker.io
$ sudo systemctl start docker
$ curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh
$ sudo fn start

...

    ______
   / ____/___
  / /_  / __ 
 / __/ / / / /
/_/   /_/ /_/
    v0.3.643

Fn Π³ΠΎΡ‚ΠΎΠ² для получСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ! Для Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ сСрвСр Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ deploy с локального ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, опуская Ρ„Π»Π°Π³ --local.

ΠšΡ€ΠΎΠΌΠ΅ этого, Fn Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ сСрвСра Fn ΠΈ рССстра Docker. Π­Ρ‚ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ установлСны Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния FN_API_URL ΠΈ FN_REGISTRY соотвСтствСнно, Π½ΠΎ прСдлагаСтся ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ способ для Π»Π΅Π³ΠΊΠΎΠ³ΠΎ управлСния созданиСм ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ для развСртывания.

Π’ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… Fn конфигурация для развСртывания называСтся context. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° создаст контСкст:

$ fn create context exoscale --provider default --api-url http://185.19.30.175:8080 --registry nfrankel

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ доступныС контСксты Ρ‚Π°ΠΊ:

$ fn list contexts

CURRENT NAME      PROVIDER      API URL                      REGISTRY
    default       default       http://localhost:8080/
    exoscale      default       http://185.19.30.175:8080    nfrankel

А ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° контСкст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π±Ρ‹Π» создан, Ρ‚Π°ΠΊ:

 $ fn use context exoscale

 Now using context: exoscale

Начиная с этого мСста поставка Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Fn Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π·Ρ‹ Docker, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π²Ρ‹Π±Ρ€Π°Π½Π½ΡƒΡŽ ΡƒΡ‡Π΅Ρ‚Π½ΡƒΡŽ запись Π½Π° DockerHub (Π² ΠΌΠΎΠ΅ΠΌ случаС β€” nfrankel), послС Ρ‡Π΅Π³ΠΎ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ сСрвСр (Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ β€” http://185.19.30.175:8080) ΠΎ мСстонахоТдСнии ΠΈ вСрсии послСднСго ΠΎΠ±Ρ€Π°Π·Π°, содСрТащСго Π²Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

$ fn deploy --app fnexo .   # выполняСтся Π½Π° локальной машинС ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° hellonode

Deploying function at: /.
Deploying hellonode to app: fnexo
Bumped to version 0.0.5
Building image nfrankel/hellonode:0.0.5 .

НаконСц:

$ curl http://185.19.30.175:8080/t/fnexo/hellonode

{"message":"Hello World"}

Π‘Ρ‚Ρ€ΠΎΠΈΠΌ собствСнный serverless Π½Π° основС Fn
Π–ΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² бСссСрвСрных вычислСниях Π½Π° основС Fn

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° бСссСрвСрных вычислСний Π½Π° своих мощностях

БСссСрвСрныС вычислСния β€” ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для быстрого внСдрСния нСзависимых частСй прилоТСния, Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… с Π±ΠΎΠ»Π΅Π΅ слоТными прилоТСниями ΠΈΠ»ΠΈ микросСрвисами.

Часто это связано с скрытой ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΡŽ привязки ΠΊ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌΡƒ поставщику, Ρ‡Ρ‚ΠΎ, Π² зависимости ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° использования ΠΈ объСма, ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π±ΠΎΠ»Π΅Π΅ высоким Π·Π°Ρ‚Ρ€Π°Ρ‚Π°ΠΌ ΠΈ сниТСнию гибкости Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

ΠœΠ½ΠΎΠ³ΠΎΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Π΅ ΠΈ Π³ΠΈΠ±Ρ€ΠΈΠ΄Π½Ρ‹Π΅ ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Π΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΡΡ‚Ρ€Π°Π΄Π°ΡŽΡ‚ Π² Ρ‚Π°ΠΊΠΎΠΌ случаС, вСдь ΠΌΠΎΠΆΠ½ΠΎ запросто ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π² ситуации, ΠΊΠΎΠ³Π΄Π° Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ бСссСрвСрныС вычислСния, Π½ΠΎ ΠΈΠ·-Π·Π° ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

Fn достаточно прост Π² Ρ€Π°Π±ΠΎΡ‚Π΅, ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°Ρ‚ΡŒ ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ интСрфСйс FaaS, с нСбольшими ΠΈΠ·Π΄Π΅Ρ€ΠΆΠΊΠ°ΠΌΠΈ. Он ΠΈΠ·Π±Π°Π²ΠΈΡ‚ ΠΎΡ‚ Π»ΡŽΠ±Ρ‹Ρ… привязок ΠΊ поставщику, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ локально ΠΈΠ»ΠΈ Π² любом ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΌ поставщикС ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ ΠΏΠΎ своСму Π²Ρ‹Π±ΠΎΡ€Ρƒ. Π’Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ свобода Π² Π²Ρ‹Π±ΠΎΡ€Π΅ языка программирования.

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ прСдставлСны лишь основы Fn, Π½ΠΎ созданиС собствСнной срСды выполнСния достаточно просто, Π° ΠΎΠ±Ρ‰ΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΡˆΠΈΡ€Π΅ с использованиСм балансировщика Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Fn, ΠΈΠ»ΠΈ размСщая Fn Π·Π° прокси для Π·Π°Ρ‰ΠΈΡ‚Ρ‹.

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