ืชืฆื•ืจื” ื ื™ืชื ืช ืœืงื•ืžืคื™ืœืฆื™ื” ืฉืœ ืžืขืจื›ืช ืžื‘ื•ื–ืจืช

ื‘ืคื•ืกื˜ ื–ื” ื‘ืจืฆื•ื ื ื• ืœืฉืชืฃ ื“ืจืš ืžืขื ื™ื™ื ืช ืœื”ืชืžื•ื“ื“ ืขื ืชืฆื•ืจื” ืฉืœ ืžืขืจื›ืช ืžื‘ื•ื–ืจืช.
ื”ืชืฆื•ืจื” ืžื™ื•ืฆื’ืช ื™ืฉื™ืจื•ืช ื‘ืฉืคืช Scala ื‘ืฆื•ืจื” ื‘ื˜ื•ื—ื”. ื™ื™ืฉื•ื ื“ื•ื’ืžื” ืžืชื•ืืจ ื‘ืคื™ืจื•ื˜. ื”ื™ื‘ื˜ื™ื ืฉื•ื ื™ื ืฉืœ ื”ื”ืฆืขื” ื ื“ื•ื ื™ื, ื›ื•ืœืœ ื”ืฉืคืขื” ืขืœ ืชื”ืœื™ืš ื”ืคื™ืชื•ื— ื”ื›ื•ืœืœ.

ืชืฆื•ืจื” ื ื™ืชื ืช ืœืงื•ืžืคื™ืœืฆื™ื” ืฉืœ ืžืขืจื›ืช ืžื‘ื•ื–ืจืช

(ะฝะฐ ั€ัƒััะบะพะผ)

ืžื‘ื•ื

ื‘ื ื™ื™ืช ืžืขืจื›ื•ืช ืžื‘ื•ื–ืจื•ืช ื—ื–ืงื•ืช ื“ื•ืจืฉืช ืฉื™ืžื•ืฉ ื‘ืชืฆื•ืจื” ื ื›ื•ื ื” ื•ืงื•ื”ืจื ื˜ื™ืช ื‘ื›ืœ ื”ืฆืžืชื™ื. ืคืชืจื•ืŸ ื˜ื™ืคื•ืกื™ ื”ื•ื ืฉื™ืžื•ืฉ ื‘ืชื™ืื•ืจ ืคืจื™ืกื” ื˜ืงืกื˜ื•ืืœื™ืช (terraform, ansible ืื• ืžืฉื”ื• ื“ื•ืžื”) ื•ื‘ืงื‘ืฆื™ ืชืฆื•ืจื” ืฉื ื•ืฆืจื• ืื•ื˜ื•ืžื˜ื™ืช (ืœืขื™ืชื™ื ืงืจื•ื‘ื•ืช - ื™ื™ืขื•ื“ื™ื™ื ืœื›ืœ ืฆื•ืžืช/ืชืคืงื™ื“). ื ืจืฆื” ื’ื ืœื”ืฉืชืžืฉ ื‘ืื•ืชื ืคืจื•ื˜ื•ืงื•ืœื™ื ืฉืœ ืื•ืชืŸ ื’ืจืกืื•ืช ื‘ื›ืœ ืฆืžืชื™ื ืžืชืงืฉืจื™ื (ืื—ืจืช ื ื—ื•ื•ื” ื‘ืขื™ื•ืช ืฉืœ ืื™ ืชืื™ืžื•ืช). ื‘ืขื•ืœื JVM ื–ื” ืื•ืžืจ ืฉืœืคื—ื•ืช ืกืคืจื™ื™ืช ื”ื”ื•ื“ืขื•ืช ืฆืจื™ื›ื” ืœื”ื™ื•ืช ืžืื•ืชื” ื’ืจืกื” ื‘ื›ืœ ื”ืฆืžืชื™ื ื”ืžืชืงืฉืจื™ื.

ืžื” ืœื’ื‘ื™ ื‘ื“ื™ืงืช ื”ืžืขืจื›ืช? ื›ืžื•ื‘ืŸ ืฉืขืœื™ื ื• ืœื‘ืฆืข ื‘ื“ื™ืงื•ืช ื™ื—ื™ื“ื” ืœื›ืœ ื”ืจื›ื™ื‘ื™ื ืœืคื ื™ ืฉื ื’ื™ืข ืœืžื‘ื—ื ื™ ืื™ื ื˜ื’ืจืฆื™ื”. ื›ื“ื™ ืœื”ื™ื•ืช ืžืกื•ื’ืœื™ื ืœื”ื•ืฆื™ื ืชื•ืฆืื•ืช ื‘ื“ื™ืงื” ื‘ื–ืžืŸ ืจื™ืฆื”, ืขืœื™ื ื• ืœื•ื•ื“ื ืฉื”ื’ื™ืจืกืื•ืช ืฉืœ ื›ืœ ื”ืกืคืจื™ื•ืช ื ืฉืžืจื•ืช ื–ื”ื•ืช ื”ืŸ ื‘ืกื‘ื™ื‘ื•ืช ื–ืžืŸ ืจื™ืฆื” ื•ื”ืŸ ื‘ืกื‘ื™ื‘ื•ืช ื‘ื“ื™ืงื”.

ื‘ืขืช ื”ืคืขืœืช ืžื‘ื—ื ื™ ืื™ื ื˜ื’ืจืฆื™ื”, ืœืขืชื™ื ืงืจื•ื‘ื•ืช ื”ืจื‘ื” ื™ื•ืชืจ ืงืœ ืœืงื‘ืœ ืืช ืื•ืชื• ื ืชื™ื‘ ืžื—ืœืงื” ื‘ื›ืœ ื”ืฆืžืชื™ื. ืื ื—ื ื• ืจืง ืฆืจื™ื›ื™ื ืœื•ื•ื“ื ืฉืื•ืชื• classpath ืžืฉืžืฉ ื‘ืคืจื™ืกื”. (ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘-classpaths ืฉื•ื ื™ื ื‘ืฆืžืชื™ื ืฉื•ื ื™ื, ืื‘ืœ ืงืฉื” ื™ื•ืชืจ ืœื™ื™ืฆื’ ืืช ื”ืชืฆื•ืจื” ื”ื–ื• ื•ืœืคืจื•ืก ืื•ืชื” ื‘ืฆื•ืจื” ื ื›ื•ื ื”.) ืื– ื›ื“ื™ ืœืฉืžื•ืจ ืขืœ ื”ืคืฉื˜ื•ืช, ื ืฉืงื•ืœ ืจืง ื ืชื™ื‘ื™ื ื–ื”ื™ื ื‘ื›ืœ ื”ืฆืžืชื™ื.

ื”ืชืฆื•ืจื” ื ื•ื˜ื” ืœื”ืชืคืชื— ื™ื—ื“ ืขื ื”ืชื•ื›ื ื”. ื‘ื“ืจืš ื›ืœืœ ืื ื• ืžืฉืชืžืฉื™ื ื‘ื’ืจืกืื•ืช ื›ื“ื™ ืœื–ื”ื•ืช ืฉื•ื ื•ืช
ืฉืœื‘ื™ ื”ืชืคืชื—ื•ืช ื”ืชื•ื›ื ื”. ื–ื” ื ืจืื” ื”ื’ื™ื•ื ื™ ืœื›ืกื•ืช ืืช ื”ืชืฆื•ืจื” ื‘ื ื™ื”ื•ืœ ื’ืจืกืื•ืช ื•ืœื–ื”ื•ืช ืชืฆื•ืจื•ืช ืฉื•ื ื•ืช ืขื ื›ืžื” ืชื•ื•ื™ื•ืช. ืื ื™ืฉ ืจืง ืชืฆื•ืจื” ืื—ืช ื‘ื™ื™ืฆื•ืจ, ืื ื• ืขืฉื•ื™ื™ื ืœื”ืฉืชืžืฉ ื‘ื’ืจืกื” ื‘ื•ื“ื“ืช ื›ืžื–ื”ื”. ืœืคืขืžื™ื ืขืฉื•ื™ื•ืช ืœื”ื™ื•ืช ืœื ื• ืกื‘ื™ื‘ื•ืช ื™ื™ืฆื•ืจ ืžืจื•ื‘ื•ืช. ื•ืœื›ืœ ืกื‘ื™ื‘ื” ื™ื™ืชื›ืŸ ืฉื ืฆื˜ืจืš ืขื ืฃ ื ืคืจื“ ืฉืœ ืชืฆื•ืจื”. ืื– ืชืฆื•ืจื•ืช ืขืฉื•ื™ื•ืช ืœื”ื™ื•ืช ืžืกื•ืžื ื•ืช ืขื ืขื ืฃ ื•ื’ืจืกื” ื›ื“ื™ ืœื–ื”ื•ืช ื‘ืื•ืคืŸ ื™ื™ื—ื•ื“ื™ ืชืฆื•ืจื•ืช ืฉื•ื ื•ืช. ื›ืœ ืชื•ื•ื™ืช ืกื ื™ืฃ ื•ื’ืจืกื” ืชื•ืืžื•ืช ืœืฉื™ืœื•ื‘ ื™ื—ื™ื“ ืฉืœ ืฆืžืชื™ื ืžื‘ื•ื–ืจื™ื, ื™ืฆื™ืื•ืช, ืžืฉืื‘ื™ื ื—ื™ืฆื•ื ื™ื™ื, ื’ืจืกืื•ืช ืกืคืจื™ื™ืช ื ืชื™ื‘ ืžื—ืœืงื•ืช ื‘ื›ืœ ืฆื•ืžืช. ื›ืืŸ ื ืกืงื•ืจ ืจืง ืืช ื”ืขื ืฃ ื”ื‘ื•ื“ื“ ื•ื ื–ื”ื” ืชืฆื•ืจื•ืช ืœืคื™ ื’ืจืกื” ืขืฉืจื•ื ื™ืช ืฉืœ ืฉืœื•ืฉื” ืจื›ื™ื‘ื™ื (1.2.3), ื‘ืื•ืชื• ืื•ืคืŸ ื›ืžื• ื—ืคืฆื™ื ืื—ืจื™ื.

ื‘ืกื‘ื™ื‘ื•ืช ืžื•ื“ืจื ื™ื•ืช ืงื‘ืฆื™ ืชืฆื•ืจื” ืื™ื ื ืžืฉืชื ื™ื ื™ื•ืชืจ ื‘ืื•ืคืŸ ื™ื“ื ื™. ื‘ื“ืจืš ื›ืœืœ ืื ื—ื ื• ืžื™ื™ืฆืจื™ื
ืงื‘ืฆื™ ืชืฆื•ืจื” ื‘ื–ืžืŸ ื”ืคืจื™ืกื” ื• ืœืขื•ืœื ืœื ืœื’ืขืช ื‘ื”ื ืœืื—ืจ ืžื›ืŸ. ืื– ืืคืฉืจ ืœืฉืื•ืœ ืœืžื” ืื ื—ื ื• ืขื“ื™ื™ืŸ ืžืฉืชืžืฉื™ื ื‘ืคื•ืจืžื˜ ื˜ืงืกื˜ ืœืงื•ื‘ืฆื™ ืชืฆื•ืจื”? ืืคืฉืจื•ืช ืžืขืฉื™ืช ื”ื™ื ืœืžืงื ืืช ื”ืชืฆื•ืจื” ื‘ืชื•ืš ื™ื—ื™ื“ืช ืงื•ืžืคื™ืœืฆื™ื” ื•ืœื”ืคื™ืง ืชื•ืขืœืช ืžืื™ืžื•ืช ืชืฆื•ืจื” ื‘ื–ืžืŸ ื”ื”ื™ื“ื•ืจ.

ื‘ืคื•ืกื˜ ื–ื” ื ื‘ื—ืŸ ืืช ื”ืจืขื™ื•ืŸ ืฉืœ ืฉืžื™ืจืช ื”ืชืฆื•ืจื” ื‘ื—ืคืฅ ื”ืงื•ืžืคื™ืœื“.

ืชืฆื•ืจื” ื ื™ืชื ืช ืœืงื•ืžืคื™ืœืฆื™ื”

ื‘ื—ืœืง ื–ื” ื ื“ื•ืŸ ื‘ื“ื•ื’ืžื” ืฉืœ ืชืฆื•ืจื” ืกื˜ื˜ื™ืช. ืฉื ื™ ืฉื™ืจื•ืชื™ื ืคืฉื•ื˜ื™ื - ืฉื™ืจื•ืช ื”ื“ ื•ื”ืœืงื•ื— ืฉืœ ืฉื™ืจื•ืช ื”ื“ ื ืžืฆืื™ื ื‘ื”ื’ื“ืจ ื•ื™ื™ืฉื•ื. ืœืื—ืจ ืžื›ืŸ ืžื•ืคืขืœื•ืช ืฉืชื™ ืžืขืจื›ื•ืช ืžื‘ื•ื–ืจื•ืช ืฉื•ื ื•ืช ืขื ืฉื ื™ ื”ืฉื™ืจื•ืชื™ื. ืื—ื“ ื”ื•ื ืขื‘ื•ืจ ืชืฆื•ืจืช ืฆื•ืžืช ื‘ื•ื“ื“ ื•ืื—ื“ ืื—ืจ ืขื‘ื•ืจ ืชืฆื•ืจืช ืฉื ื™ ืฆืžืชื™ื.

ืžืขืจื›ืช ืžื‘ื•ื–ืจืช ื˜ื™ืคื•ืกื™ืช ืžื•ืจื›ื‘ืช ืžื›ืžื” ืฆืžืชื™ื. ื ื™ืชืŸ ืœื–ื”ื•ืช ืืช ื”ืฆืžืชื™ื ื‘ืืžืฆืขื•ืช ืกื•ื’ ื›ืœืฉื”ื•:

sealed trait NodeId
case object Backend extends NodeId
case object Frontend extends NodeId

ืื• ืจืง

case class NodeId(hostName: String)

ืื• ืืคื™ืœื•

object Singleton
type NodeId = Singleton.type

ืฆืžืชื™ื ืืœื• ืžื‘ืฆืขื™ื ืชืคืงื™ื“ื™ื ืฉื•ื ื™ื, ืžืคืขื™ืœื™ื ืฉื™ืจื•ืชื™ื ืžืกื•ื™ืžื™ื ื•ืฆืจื™ื›ื™ื ืœื”ื™ื•ืช ืžืกื•ื’ืœื™ื ืœืชืงืฉืจ ืขื ื”ืฆืžืชื™ื ื”ืื—ืจื™ื ื‘ืืžืฆืขื•ืช ื—ื™ื‘ื•ืจื™ TCP/HTTP.

ืœื—ื™ื‘ื•ืจ TCP ื ื“ืจืฉ ืœืคื—ื•ืช ืžืกืคืจ ื™ืฆื™ืื”. ืื ื—ื ื• ื’ื ืจื•ืฆื™ื ืœื•ื•ื“ื ืฉื”ืœืงื•ื— ื•ื”ืฉืจืช ืžื“ื‘ืจื™ื ืขืœ ืื•ืชื• ืคืจื•ื˜ื•ืงื•ืœ. ืขืœ ืžื ืช ืœื™ืฆื•ืจ ืžื•ื“ืœ ืฉืœ ื—ื™ื‘ื•ืจ ื‘ื™ืŸ ืฆืžืชื™ื, ื‘ื•ืื• ื ื›ืจื™ื– ืขืœ ื”ืžื—ืœืงื” ื”ื‘ืื”:

case class TcpEndPoint[Protocol](node: NodeId, port: Port[Protocol])

ืื™ืคื” Port ื”ื•ื ืจืง Int ื‘ื˜ื•ื•ื— ื”ืžื•ืชืจ:

type PortNumber = Refined[Int, Closed[_0, W.`65535`.T]]

ื˜ื™ืคื•ืกื™ื ืžืขื•ื“ื ื™ื

ืœึดืจึฐืื•ึนืช ืžืขื•ื“ืŸ ืกึดืคึฐืจึดื™ึธื”. ื‘ืงื™ืฆื•ืจ, ื–ื” ืžืืคืฉืจ ืœื”ื•ืกื™ืฃ ืžื’ื‘ืœื•ืช ื–ืžืŸ ืงื•ืžืคื™ืœืฆื™ื” ืœืกื•ื’ื™ื ืื—ืจื™ื. ื‘ืžืงืจื” ื”ื–ื” Int ืžื•ืชืจ ืœื”ื—ื–ื™ืง ืจืง ืขืจื›ื™ 16 ืกื™ื‘ื™ื•ืช ืฉื™ื›ื•ืœื™ื ืœื™ื™ืฆื’ ืืช ืžืกืคืจ ื”ื™ืฆื™ืื”. ืื™ืŸ ื“ืจื™ืฉื” ืœื”ืฉืชืžืฉ ื‘ืกืคืจื™ื™ื” ื–ื• ืขื‘ื•ืจ ื’ื™ืฉืช ืชืฆื•ืจื” ื–ื•. ื–ื” ืคืฉื•ื˜ ื ืจืื” ืžืชืื™ื ืžืื•ื“.

ืขื‘ื•ืจ HTTP (REST) โ€‹โ€‹ืื•ืœื™ ื ืฆื˜ืจืš ื’ื ื ืชื™ื‘ ืฉืœ ื”ืฉื™ืจื•ืช:

type UrlPathPrefix = Refined[String, MatchesRegex[W.`"[a-zA-Z_0-9/]*"`.T]]
case class PortWithPrefix[Protocol](portNumber: PortNumber, pathPrefix: UrlPathPrefix)

ืกื•ื’ ืคื ื˜ื•ื

ืขืœ ืžื ืช ืœื–ื”ื•ืช ืคืจื•ื˜ื•ืงื•ืœ ื‘ืžื”ืœืš ื”ืงื•ืžืคื™ืœืฆื™ื” ืื ื• ืžืฉืชืžืฉื™ื ื‘ืชื›ื•ื ืช Scala ืฉืœ ื”ืฆื”ืจืช ืืจื’ื•ืžื ื˜ ืกื•ื’ Protocol ืฉืœื ื ืขืฉื” ื‘ื• ืฉื™ืžื•ืฉ ื‘ื›ื™ืชื”. ื–ื” ืžื” ืฉื ืงืจื ืกื•ื’ ืคื ื˜ื•ื. ื‘ื–ืžืŸ ืจื™ืฆื” ืจืง ืœืขืชื™ื ื ื“ื™ืจื•ืช ืื ื• ื–ืงื•ืงื™ื ืœืžื•ืคืข ืฉืœ ืžื–ื”ื” ืคืจื•ื˜ื•ืงื•ืœ, ื•ื–ื• ื”ืกื™ื‘ื” ืฉืื™ื ื ื• ืžืื—ืกื ื™ื ืื•ืชื•. ื‘ืžื”ืœืš ื”ื™ื“ื•ืจ ืกื•ื’ ื”ืคื ื˜ื•ื ื”ื–ื” ืžืขื ื™ืง ื‘ื˜ื™ื—ื•ืช ืกื•ื’ ื ื•ืกืคืช. ืื ื—ื ื• ืœื ื™ื›ื•ืœื™ื ืœื”ืขื‘ื™ืจ ืคื•ืจื˜ ืขื ืคืจื•ื˜ื•ืงื•ืœ ืฉื’ื•ื™.

ืื—ื“ ื”ืคืจื•ื˜ื•ืงื•ืœื™ื ื”ื ืคื•ืฆื™ื ื‘ื™ื•ืชืจ ื”ื•ื REST API ืขื Json serialization:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

ืื™ืคื” RequestMessage ื”ื•ื ืกื•ื’ ื”ื”ื•ื“ืขื•ืช ื”ื‘ืกื™ืกื™ ืฉื”ืœืงื•ื— ื™ื›ื•ืœ ืœืฉืœื•ื— ืœืฉืจืช ื• ResponseMessage ื”ื™ื ื”ื•ื“ืขืช ื”ืชื’ื•ื‘ื” ืžื”ืฉืจืช. ื›ืžื•ื‘ืŸ, ืื ื• ืขืฉื•ื™ื™ื ืœื™ืฆื•ืจ ืชื™ืื•ืจื™ ืคืจื•ื˜ื•ืงื•ืœ ืื—ืจื™ื ื”ืžืฆื™ื™ื ื™ื ืืช ืคืจื•ื˜ื•ืงื•ืœ ื”ืชืงืฉื•ืจืช ื‘ื“ื™ื•ืง ื”ืจืฆื•ื™.

ืœืžื˜ืจื•ืช ืคื•ืกื˜ ื–ื” ื ืฉืชืžืฉ ื‘ื’ืจืกื” ืคืฉื•ื˜ื” ื™ื•ืชืจ ืฉืœ ื”ืคืจื•ื˜ื•ืงื•ืœ:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

ื‘ืคืจื•ื˜ื•ืงื•ืœ ื–ื” ืžืฆื•ืจืคืช ื”ื•ื“ืขืช ื‘ืงืฉื” ืœื›ืชื•ื‘ืช ื”ืืชืจ ื•ื”ื•ื“ืขืช ืชื’ื•ื‘ื” ืžื•ื—ื–ืจืช ื›ืžื—ืจื•ื–ืช ืจื’ื™ืœื”.

ื ื™ืชืŸ ืœืชืืจ ืชืฆื•ืจืช ืฉื™ืจื•ืช ืœืคื™ ืฉื ื”ืฉื™ืจื•ืช, ืื•ืกืฃ ืฉืœ ื™ืฆื™ืื•ืช ื•ื—ืœืง ืžื”ืชืœื•ืช. ื™ืฉื ืŸ ื›ืžื” ื“ืจื›ื™ื ืืคืฉืจื™ื•ืช ืœื™ื™ืฆื’ ืืช ื›ืœ ื”ืืœืžื ื˜ื™ื ื”ืœืœื• ื‘ืกืงืืœื” (ืœืžืฉืœ, HList, ืกื•ื’ื™ ื ืชื•ื ื™ื ืืœื’ื‘ืจื™ื™ื). ืœืžื˜ืจื•ืช ื”ืคื•ืกื˜ ื”ื–ื” ื ืฉืชืžืฉ ื‘- Cake Pattern ื•ื ืฆื™ื’ ื—ืœืงื™ื (ืžื•ื“ื•ืœื™ื) ื”ื ื™ืชื ื™ื ืœืฉื™ืœื•ื‘ ื›ืชื›ื•ื ื•ืช. (ื“ืคื•ืก ืขื•ื’ื” ืื™ื ื• ื“ืจื™ืฉื” ืขื‘ื•ืจ ื’ื™ืฉืช ืชืฆื•ืจื” ื ื™ืชื ืช ืœื”ื™ื“ื•ืจ ื–ื•. ื–ื” ืจืง ื™ื™ืฉื•ื ืืคืฉืจื™ ืื—ื“ ืฉืœ ื”ืจืขื™ื•ืŸ.)

ื ื™ืชืŸ ืœื™ื™ืฆื’ ืชืœื•ืช ื‘ืืžืฆืขื•ืช ื“ืคื•ืก ื”ืขื•ื’ื” ื›ื ืงื•ื“ื•ืช ืงืฆื” ืฉืœ ืฆืžืชื™ื ืื—ืจื™ื:

  type EchoProtocol[A] = SimpleHttpGetRest[A, A]

  trait EchoConfig[A] extends ServiceConfig {
    def portNumber: PortNumber = 8081
    def echoPort: PortWithPrefix[EchoProtocol[A]] = PortWithPrefix[EchoProtocol[A]](portNumber, "echo")
    def echoService: HttpSimpleGetEndPoint[NodeId, EchoProtocol[A]] = providedSimpleService(echoPort)
  }

ืฉื™ืจื•ืช Echo ืฆืจื™ืš ืจืง ื™ืฆื™ืื” ืžื•ื’ื“ืจืช. ื•ืื ื—ื ื• ืžืฆื”ื™ืจื™ื ืฉื”ื™ืฆื™ืื” ื”ื–ื• ืชื•ืžื›ืช ื‘ืคืจื•ื˜ื•ืงื•ืœ ื”ื“. ืฉื™ืžื• ืœื‘ ืฉืื ื—ื ื• ืœื ืฆืจื™ื›ื™ื ืœืฆื™ื™ืŸ ื™ืฆื™ืื” ืžืกื•ื™ืžืช ื‘ืจื’ืข ื–ื”, ืžื›ื™ื•ื•ืŸ ืฉ-trait's ืžืืคืฉืจ ื”ืฆื”ืจื•ืช ืฉืœ ืฉื™ื˜ื•ืช ืžื•ืคืฉื˜ื•ืช. ืื ื ืฉืชืžืฉ ื‘ืฉื™ื˜ื•ืช ืžื•ืคืฉื˜ื•ืช, ื”ืžื”ื“ืจ ื™ื“ืจื•ืฉ ื™ื™ืฉื•ื ื‘ืžื•ืคืข ืชืฆื•ืจื”. ื›ืืŸ ืกื™ืคืงื ื• ืืช ื”ื™ื™ืฉื•ื (8081) ื•ื”ื•ื ื™ืฉืžืฉ ื›ืขืจืš ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ืื ื ื“ืœื’ ืขืœื™ื• ื‘ืชืฆื•ืจื” ืงื•ื ืงืจื˜ื™ืช.

ืื ื• ื™ื›ื•ืœื™ื ืœื”ื›ืจื™ื– ืขืœ ืชืœื•ืช ื‘ืชืฆื•ืจื” ืฉืœ ืœืงื•ื— ืฉื™ืจื•ืช ื”ื“:

  trait EchoClientConfig[A] {
    def testMessage: String = "test"
    def pollInterval: FiniteDuration
    def echoServiceDependency: HttpSimpleGetEndPoint[_, EchoProtocol[A]]
  }

ืœืชืœื•ืช ื™ืฉ ืื•ืชื• ืกื•ื’ ื›ืžื• ืฉืœ echoService. ื‘ืคืจื˜, ื”ื•ื ื“ื•ืจืฉ ืืช ืื•ืชื• ืคืจื•ื˜ื•ืงื•ืœ. ืœืคื™ื›ืš, ืื ื• ื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ื‘ื˜ื•ื—ื™ื ืฉืื ื ื—ื‘ืจ ืืช ืฉืชื™ ื”ืชืœื•ืช ื”ืœืœื• ื”ืŸ ื™ืคืขืœื• ื›ื”ืœื›ื”.

ื”ื˜ืžืขืช ืฉื™ืจื•ืชื™ื

ืฉื™ืจื•ืช ืฆืจื™ืš ืคื•ื ืงืฆื™ื” ื›ื“ื™ ืœื”ืชื—ื™ืœ ื•ืœื›ื‘ื•ืช ื‘ื—ืŸ. (ื”ื™ื›ื•ืœืช ืœื›ื‘ื•ืช ืฉื™ืจื•ืช ื”ื™ื ืงืจื™ื˜ื™ืช ืœื‘ื“ื™ืงื”.) ืฉื•ื‘ ื™ืฉ ื›ืžื” ืืคืฉืจื•ื™ื•ืช ืฉืœ ืฆื™ื•ืŸ ืคื•ื ืงืฆื™ื” ื›ื–ื• ืขื‘ื•ืจ ืชืฆื•ืจื” ื ืชื•ื ื” (ืœื“ื•ื’ืžื”, ื ื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘ืžื—ืœืงื•ืช ืกื•ื’). ืขื‘ื•ืจ ื”ืคื•ืกื˜ ื”ื–ื” ื ืฉืชืžืฉ ืฉื•ื‘ ื‘-Cake Pattern. ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื™ื™ืฆื’ ืฉื™ืจื•ืช ื‘ืืžืฆืขื•ืช cats.Resource ืฉื›ื‘ืจ ืžืกืคืง ืกื•ื’ืจื™ื™ื ื•ืฉื—ืจื•ืจ ืžืฉืื‘ื™ื. ืขืœ ืžื ืช ืœืจื›ื•ืฉ ืžืฉืื‘ ืขืœื™ื ื• ืœืกืคืง ืชืฆื•ืจื” ื•ื”ืงืฉืจ ืžืกื•ื™ื ืฉืœ ื–ืžืŸ ืจื™ืฆื”. ืื– ืคื•ื ืงืฆื™ื™ืช ื”ืชื—ืœืช ื”ืฉื™ืจื•ืช ืขืฉื•ื™ื” ืœื”ื™ืจืื•ืช ื›ืš:

  type ResourceReader[F[_], Config, A] = Reader[Config, Resource[F, A]]

  trait ServiceImpl[F[_]] {
    type Config
    def resource(
      implicit
      resolver: AddressResolver[F],
      timer: Timer[F],
      contextShift: ContextShift[F],
      ec: ExecutionContext,
      applicative: Applicative[F]
    ): ResourceReader[F, Config, Unit]
  }

ืื™ืคื”

  • Config - ืกื•ื’ ื”ืชืฆื•ืจื” ื”ื ื“ืจืฉืช ืขืœ ื™ื“ื™ ืžืชื ืข ืฉื™ืจื•ืช ื–ื”
  • AddressResolver - ืื•ื‘ื™ื™ืงื˜ ื–ืžืŸ ืจื™ืฆื” ื‘ืขืœ ื™ื›ื•ืœืช ืœื”ืฉื™ื’ ื›ืชื•ื‘ื•ืช ืืžื™ืชื™ื•ืช ืฉืœ ืฆืžืชื™ื ืื—ืจื™ื (ื”ืžืฉืš ืœืงืจื•ื ืœืคืจื˜ื™ื).

ืžื”ืกื•ื’ื™ื ื”ืื—ืจื™ื ืžื’ื™ืขื™ื cats:

  • F[_] - ืกื•ื’ ืืคืงื˜ (ื‘ืžืงืจื” ื”ืคืฉื•ื˜ ื‘ื™ื•ืชืจ F[A] ื™ื›ื•ืœ ืœื”ื™ื•ืช ืกืชื () => A. ื‘ืคื•ืกื˜ ื”ื–ื” ื ืฉืชืžืฉ cats.IO.)
  • Reader[A,B] - ื”ื•ื ืคื—ื•ืช ืื• ื™ื•ืชืจ ืžื™ืœื” ื ืจื“ืคืช ืœืคื•ื ืงืฆื™ื” A => B
  • cats.Resource - ื™ืฉ ื“ืจื›ื™ื ืœืจื›ื•ืฉ ื•ืœืฉื—ืจืจ
  • Timer - ืžืืคืฉืจ ืœื™ืฉื•ืŸ/ืœืžื“ื•ื“ ื–ืžืŸ
  • ContextShift - ืื ืœื•ื’ื™ ืฉืœ ExecutionContext
  • Applicative - ืžืขื˜ืคืช ืคื•ื ืงืฆื™ื•ืช ื‘ืชื•ืงืฃ (ื›ืžืขื˜ ืžื•ื ืื“ื”) (ื™ื™ืชื›ืŸ ืฉื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ ื ื—ืœื™ืฃ ืื•ืชื” ื‘ืžืฉื”ื• ืื—ืจ)

ื‘ืืžืฆืขื•ืช ืžืžืฉืง ื–ื” ื ื•ื›ืœ ืœื™ื™ืฉื ืžืกืคืจ ืฉื™ืจื•ืชื™ื. ืœืžืฉืœ, ืฉื™ืจื•ืช ืฉืœื ืขื•ืฉื” ื›ืœื•ื:

  trait ZeroServiceImpl[F[_]] extends ServiceImpl[F] {
    type Config <: Any
    def resource(...): ResourceReader[F, Config, Unit] =
      Reader(_ => Resource.pure[F, Unit](()))
  }

(ืจืื” ืงื•ื“ ืžืงื•ืจ ืขื‘ื•ืจ ื™ื™ืฉื•ืžื™ ืฉื™ืจื•ืชื™ื ืื—ืจื™ื - ืฉื™ืจื•ืช ื”ื“,
ืืงื• ืœืงื•ื— ื• ื‘ืงืจื™ื ืœื›ืœ ื”ื—ื™ื™ื.)

ืฆื•ืžืช ื”ื•ื ืื•ื‘ื™ื™ืงื˜ ื‘ื•ื“ื“ ื”ืžืจื™ืฅ ื›ืžื” ืฉื™ืจื•ืชื™ื (ื”ืชื—ืœืช ืฉืจืฉืจืช ืžืฉืื‘ื™ื ืžื•ืคืขืœืช ืขืœ ื™ื“ื™ Cake Pattern):

object SingleNodeImpl extends ZeroServiceImpl[IO]
  with EchoServiceService
  with EchoClientService
  with FiniteDurationLifecycleServiceImpl
{
  type Config = EchoConfig[String] with EchoClientConfig[String] with FiniteDurationLifecycleConfig
}

ืฉื™ืžื• ืœื‘ ืฉื‘ืฆื•ืžืช ืื ื• ืžืฆื™ื™ื ื™ื ืืช ืกื•ื’ ื”ืชืฆื•ืจื” ื”ืžื“ื•ื™ืง ืฉื“ืจื•ืฉ ืœืฆื•ืžืช ื–ื”. ื”ืžื”ื“ืจ ืœื ื™ืืคืฉืจ ืœื ื• ืœื‘ื ื•ืช ืืช ื”ืื•ื‘ื™ื™ืงื˜ (Cake) ืขื ืกื•ื’ ืœื ืžืกืคื™ืง, ืžื›ื™ื•ื•ืŸ ืฉื›ืœ ืชื›ื•ื ืช ืฉื™ืจื•ืช ืžืฆื”ื™ืจื” ืขืœ ืื™ืœื•ืฅ ืขืœ Config ืกื•ึผื’. ื›ืžื• ื›ืŸ, ืœื ื ื•ื›ืœ ืœื”ืคืขื™ืœ ืืช ื”ืฆื•ืžืช ืžื‘ืœื™ ืœืกืคืง ืชืฆื•ืจื” ืžืœืื”.

ืจื–ื•ืœื•ืฆื™ื™ืช ื›ืชื•ื‘ืช ื”ืฆื•ืžืช

ืขืœ ืžื ืช ืœื™ืฆื•ืจ ื—ื™ื‘ื•ืจ ืื ื• ื–ืงื•ืงื™ื ืœื›ืชื•ื‘ืช ืžืืจื— ืืžื™ืชื™ืช ืขื‘ื•ืจ ื›ืœ ืฆื•ืžืช. ื–ื” ืขืฉื•ื™ ืœื”ื™ื•ืช ื™ื“ื•ืข ืžืื•ื—ืจ ื™ื•ืชืจ ืžืืฉืจ ื—ืœืงื™ื ืื—ืจื™ื ืฉืœ ื”ืชืฆื•ืจื”. ืœืคื™ื›ืš, ืื ื• ื–ืงื•ืงื™ื ืœื“ืจืš ืœืกืคืง ืžื™ืคื•ื™ ื‘ื™ืŸ ืžื–ื”ื” ื”ืฆื•ืžืช ืœื‘ื™ืŸ ื”ื›ืชื•ื‘ืช ื”ืืžื™ืชื™ืช ืฉืœื•. ืžื™ืคื•ื™ ื–ื” ื”ื•ื ืคื•ื ืงืฆื™ื”:

case class NodeAddress[NodeId](host: Uri.Host)
trait AddressResolver[F[_]] {
  def resolve[NodeId](nodeId: NodeId): F[NodeAddress[NodeId]]
}

ื™ืฉื ืŸ ื›ืžื” ื“ืจื›ื™ื ืืคืฉืจื™ื•ืช ืœื™ื™ืฉื ืคื•ื ืงืฆื™ื” ื›ื–ื•.

  1. ืื ืื ื• ื™ื•ื“ืขื™ื ื›ืชื•ื‘ื•ืช ื‘ืคื•ืขืœ ืœืคื ื™ ื”ืคืจื™ืกื”, ื‘ืžื”ืœืš ืžื•ืคืข ืžืืจื— ืฆื•ืžืช, ืื– ื ื•ื›ืœ ืœื™ืฆื•ืจ ืงื•ื“ Scala ืขื ื”ื›ืชื•ื‘ื•ืช ื‘ืคื•ืขืœ ื•ืœื”ืจื™ืฅ ืืช ื”-build ืœืื—ืจ ืžื›ืŸ (ืฉืžื‘ืฆืข ื‘ื“ื™ืงื•ืช ื–ืžืŸ ืงื•ืžืคื™ืœืฆื™ื” ื•ืœืื—ืจ ืžื›ืŸ ืžืคืขื™ืœ ื—ื‘ื™ืœืช ื‘ื“ื™ืงื•ืช ืื™ื ื˜ื’ืจืฆื™ื”). ื‘ืžืงืจื” ื–ื” ืคื•ื ืงืฆื™ื™ืช ื”ืžื™ืคื•ื™ ืฉืœื ื• ื™ื“ื•ืขื” ืกื˜ื˜ื™ืช ื•ื ื™ืชืŸ ืœืคืฉื˜ ืื•ืชื” ืœืžืฉื”ื• ื›ืžื• a Map[NodeId, NodeAddress].
  2. ืœืคืขืžื™ื ืื ื• ืžืฉื™ื’ื™ื ื›ืชื•ื‘ื•ืช ื‘ืคื•ืขืœ ืจืง ื‘ืฉืœื‘ ืžืื•ื—ืจ ื™ื•ืชืจ ื›ืืฉืจ ื”ืฆื•ืžืช ืžื•ืคืขืœ ื‘ืคื•ืขืœ, ืื• ืฉืื™ืŸ ืœื ื• ื›ืชื•ื‘ื•ืช ืฉืœ ืฆืžืชื™ื ืฉืขื“ื™ื™ืŸ ืœื ื”ื•ืคืขืœื•. ื‘ืžืงืจื” ื–ื” ื™ื›ื•ืœ ืœื”ื™ื•ืช ืฉื™ืฉ ืœื ื• ืฉื™ืจื•ืช ื’ื™ืœื•ื™ ืฉืžื•ืคืขืœ ืœืคื ื™ ื›ืœ ืฉืืจ ื”ืฆืžืชื™ื ื•ื›ืœ ืฆื•ืžืช ืขืฉื•ื™ ืœืคืจืกื ืืช ื”ื›ืชื•ื‘ืช ืฉืœื• ื‘ืื•ืชื• ืฉื™ืจื•ืช ื•ืœื”ื™ืจืฉื ืœืชืœื•ืช.
  3. ืื ื ื•ื›ืœ ืœืฉื ื•ืช /etc/hosts, ื ื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘ืฉืžื•ืช ืžืืจื—ื™ื ืžื•ื’ื“ืจื™ื ืžืจืืฉ (ื›ืžื• my-project-main-node ื• echo-backend) ื•ืคืฉื•ื˜ ืœืฉื™ื™ืš ืืช ื”ืฉื ื”ื–ื” ืœื›ืชื•ื‘ืช ื”-IP ื‘ื–ืžืŸ ื”ืคืจื™ืกื”.

ื‘ืคื•ืกื˜ ื–ื” ืื™ื ื ื• ืžื›ืกื™ื ืืช ื”ืžืงืจื™ื ื”ืœืœื• ื‘ืคื™ืจื•ื˜ ืจื‘ ื™ื•ืชืจ. ืœืžืขืฉื” ื‘ื“ื•ื’ืžื” ืฉืœ ื”ืฆืขืฆื•ืข ืฉืœื ื• ืœื›ืœ ื”ืฆืžืชื™ื ืชื”ื™ื” ืื•ืชื” ื›ืชื•ื‘ืช IP - 127.0.0.1.

ื‘ืคื•ืกื˜ ื–ื” ื ืฉืงื•ืœ ืฉืชื™ ืคืจื™ืกื•ืช ืžืขืจื›ืช ืžื‘ื•ื–ืจื•ืช:

  1. ืคืจื™ืกืช ืฆื•ืžืช ื‘ื•ื“ื“, ืฉื‘ื” ื›ืœ ื”ืฉื™ืจื•ืชื™ื ืžืžื•ืงืžื™ื ืขืœ ื”ืฆื•ืžืช ื”ื‘ื•ื“ื“.
  2. ืคืจื™ืกืช ืฉื ื™ ืฆืžืชื™ื, ื›ืืฉืจ ื”ืฉื™ืจื•ืช ื•ื”ืœืงื•ื— ื ืžืฆืื™ื ื‘ืฆืžืชื™ื ืฉื•ื ื™ื.

ื”ืชืฆื•ืจื” ืขื‘ื•ืจ ื ืฆื•ืžืช ื‘ื•ื“ื“ ื”ืคืจื™ืกื” ื”ื™ื ื›ื“ืœืงืžืŸ:

ืชืฆื•ืจืช ืฆื•ืžืช ื‘ื•ื“ื“

object SingleNodeConfig extends EchoConfig[String] 
  with EchoClientConfig[String] with FiniteDurationLifecycleConfig
{
  case object Singleton // identifier of the single node 
  // configuration of server
  type NodeId = Singleton.type
  def nodeId = Singleton

  /** Type safe service port specification. */
  override def portNumber: PortNumber = 8088

  // configuration of client

  /** We'll use the service provided by the same host. */
  def echoServiceDependency = echoService

  override def testMessage: UrlPathElement = "hello"

  def pollInterval: FiniteDuration = 1.second

  // lifecycle controller configuration
  def lifetime: FiniteDuration = 10500.milliseconds // additional 0.5 seconds so that there are 10 requests, not 9.
}

ื›ืืŸ ืื ื• ื™ื•ืฆืจื™ื ืชืฆื•ืจื” ืื—ืช ืฉืžืจื—ื™ื‘ื” ืืช ืชืฆื•ืจืช ื”ืฉืจืช ื•ื’ื ืืช ืชืฆื•ืจืช ื”ืœืงื•ื—. ื›ืžื• ื›ืŸ, ืื ื• ืžื’ื“ื™ืจื™ื ื‘ืงืจ ืžื—ื–ื•ืจ ื—ื™ื™ื ืฉื‘ื“ืจืš ื›ืœืœ ื™ืคืกื™ืง ืืช ื”ืœืงื•ื— ื•ื”ืฉืจืช ืœืื—ืจ ืžื›ืŸ lifetime ืžืจื•ื•ื— ืขื•ื‘ืจ.

ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ืื•ืชื” ืงื‘ื•ืฆื” ืฉืœ ื™ื™ืฉื•ืžื™ ืฉื™ืจื•ืช ื•ืชืฆื•ืจื•ืช ืœื™ืฆื™ืจืช ืคืจื™ืกื” ืฉืœ ืžืขืจื›ืช ืขื ืฉื ื™ ืฆืžืชื™ื ื ืคืจื“ื™ื. ืื ื—ื ื• ืจืง ืฆืจื™ื›ื™ื ืœื™ืฆื•ืจ ืฉืชื™ ื”ื’ื“ืจื•ืช ืฆื•ืžืช ื ืคืจื“ื•ืช ืขื ื”ืฉื™ืจื•ืชื™ื ื”ืžืชืื™ืžื™ื:

ืชืฆื•ืจืช ืฉื ื™ ืฆืžืชื™ื

  object NodeServerConfig extends EchoConfig[String] with SigTermLifecycleConfig
  {
    type NodeId = NodeIdImpl

    def nodeId = NodeServer

    override def portNumber: PortNumber = 8080
  }

  object NodeClientConfig extends EchoClientConfig[String] with FiniteDurationLifecycleConfig
  {
    // NB! dependency specification
    def echoServiceDependency = NodeServerConfig.echoService

    def pollInterval: FiniteDuration = 1.second

    def lifetime: FiniteDuration = 10500.milliseconds // additional 0.5 seconds so that there are 10 request, not 9.

    def testMessage: String = "dolly"
  }

ืจืื” ื›ื™ืฆื“ ืื ื• ืžืฆื™ื™ื ื™ื ืืช ื”ืชืœื•ืช. ืื ื• ืžื–ื›ื™ืจื™ื ืืช ื”ืฉื™ืจื•ืช ื”ืžืกื•ืคืง ืฉืœ ื”ืฆื•ืžืช ื”ืื—ืจ ื›ืชืœื•ืช ืฉืœ ื”ืฆื•ืžืช ื”ื ื•ื›ื—ื™. ืกื•ื’ ื”ืชืœื•ืช ื ื‘ื“ืง ืžื›ื™ื•ื•ืŸ ืฉื”ื•ื ืžื›ื™ืœ ืกื•ื’ ืคื ื˜ื•ื ืฉืžืชืืจ ืคืจื•ื˜ื•ืงื•ืœ. ื•ื‘ื–ืžืŸ ื”ืจื™ืฆื” ื™ื”ื™ื” ืœื ื• ืืช ืžื–ื”ื” ื”ืฆื•ืžืช ื”ื ื›ื•ืŸ. ื–ื”ื• ืื—ื“ ื”ื”ื™ื‘ื˜ื™ื ื”ื—ืฉื•ื‘ื™ื ืฉืœ ื’ื™ืฉืช ื”ืชืฆื•ืจื” ื”ืžื•ืฆืขืช. ื”ื•ื ืžืกืคืง ืœื ื• ืืช ื”ื™ื›ื•ืœืช ืœื”ื’ื“ื™ืจ ื™ืฆื™ืื” ืคืขื ืื—ืช ื‘ืœื‘ื“ ื•ืœื•ื•ื“ื ืฉืื ื• ืžืคื ื™ื ืœื™ืฆื™ืื” ื”ื ื›ื•ื ื”.

ื™ื™ืฉื•ื ืฉื ื™ ืฆืžืชื™ื

ืขื‘ื•ืจ ืชืฆื•ืจื” ื–ื• ืื ื• ืžืฉืชืžืฉื™ื ื‘ื“ื™ื•ืง ื‘ืื•ืชื ื™ื™ืฉื•ืžื™ ืฉื™ืจื•ืชื™ื. ืื™ืŸ ืฉื™ื ื•ื™ื™ื ื‘ื›ืœืœ. ืขื ื–ืืช, ืื ื• ื™ื•ืฆืจื™ื ืฉื ื™ ื™ื™ืฉื•ืžื™ ืฆื•ืžืช ืฉื•ื ื™ื ื”ืžื›ื™ืœื™ื ืงื‘ื•ืฆื” ืฉื•ื ื” ืฉืœ ืฉื™ืจื•ืชื™ื:

  object TwoJvmNodeServerImpl extends ZeroServiceImpl[IO] with EchoServiceService with SigIntLifecycleServiceImpl {
    type Config = EchoConfig[String] with SigTermLifecycleConfig
  }

  object TwoJvmNodeClientImpl extends ZeroServiceImpl[IO] with EchoClientService with FiniteDurationLifecycleServiceImpl {
    type Config = EchoClientConfig[String] with FiniteDurationLifecycleConfig
  }

ื”ืฆื•ืžืช ื”ืจืืฉื•ืŸ ืžื™ื™ืฉื ืฉืจืช ื•ื”ื•ื ืฆืจื™ืš ืจืง ืชืฆื•ืจื” ื‘ืฆื“ ื”ืฉืจืช. ื”ืฆื•ืžืช ื”ืฉื ื™ ืžื™ื™ืฉื ืœืงื•ื— ื•ื–ืงื•ืง ืœื—ืœืง ื ื•ืกืฃ ืฉืœ ื”ืชืฆื•ืจื”. ืฉื ื™ ื”ืฆืžืชื™ื ื“ื•ืจืฉื™ื ืžืคืจื˜ ืœื›ืœ ื”ื—ื™ื™ื. ืœืžื˜ืจื•ืช ืฉืœ ืคื•ืกื˜ ืฉื™ืจื•ืช ื–ื” ื™ื”ื™ื” ืœืฆื•ืžืช ืื•ืจืš ื—ื™ื™ื ืื™ื ืกื•ืคื™ ืฉื ื™ืชืŸ ืœืกื™ื™ื ื‘ืืžืฆืขื•ืชื• SIGTERM, ื‘ืขื•ื“ echo client ื™ืกืชื™ื™ื ืœืื—ืจ ืžืฉืš ื”ื–ืžืŸ ื”ืกื•ืคื™ ืฉื”ื•ื’ื“ืจ. ืจืื” ืืช ื™ื™ืฉื•ื ืžืชื—ื™ืœ ืœืงื‘ืœืช ืคืจื˜ื™ื.

ืชื”ืœื™ืš ืคื™ืชื•ื— ื›ื•ืœืœ

ื‘ื•ืื• ื ืจืื” ื›ื™ืฆื“ ื’ื™ืฉื” ื–ื• ืžืฉื ื” ืืช ื”ื“ืจืš ื‘ื” ืื ื• ืขื•ื‘ื“ื™ื ืขื ืชืฆื•ืจื”.

ื”ืชืฆื•ืจื” ื›ืงื•ื“ ืชืงื•ืžืคืœ ื•ืชื™ื™ืฆืจ ื—ืคืฅ. ื ืจืื” ื”ื’ื™ื•ื ื™ ืœื”ืคืจื™ื“ ื‘ื™ืŸ ื—ืคืฆื™ ืชืฆื•ืจื” ืžื—ืคืฆื™ ืงื•ื“ ืื—ืจื™ื. ืœืขืชื™ื ืงืจื•ื‘ื•ืช ืื ื• ื™ื›ื•ืœื™ื ืœืงื‘ืœ ืžืกืคืจ ืจื‘ ืฉืœ ืชืฆื•ืจื•ืช ืขืœ ืื•ืชื• ื‘ืกื™ืก ืงื•ื“. ื•ื›ืžื•ื‘ืŸ, ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœืงื‘ืœ ื’ืจืกืื•ืช ืžืจื•ื‘ื•ืช ืฉืœ ืขื ืคื™ ืชืฆื•ืจื” ืฉื•ื ื™ื. ื‘ืชืฆื•ืจื” ืื ื• ื™ื›ื•ืœื™ื ืœื‘ื—ื•ืจ ื’ืจืกืื•ืช ืžืกื•ื™ืžื•ืช ืฉืœ ืกืคืจื™ื•ืช ื•ื–ื” ื™ื™ืฉืืจ ืงื‘ื•ืข ื‘ื›ืœ ืคืขื ืฉื ืคืจื•ืก ืืช ื”ืชืฆื•ืจื” ื”ื–ื•.

ืฉื™ื ื•ื™ ืชืฆื•ืจื” ื”ื•ืคืš ืœืฉื™ื ื•ื™ ืงื•ื“. ืื– ื–ื” ืฆืจื™ืš ืœื”ื™ื•ืช ืžื›ื•ืกื” ื‘ืื•ืชื• ืชื”ืœื™ืš ืื‘ื˜ื—ืช ืื™ื›ื•ืช:

ื›ืจื˜ื™ืก -> ื™ื—ืกื™ ืฆื™ื‘ื•ืจ -> ืกืงื™ืจื” -> ืžื™ื–ื•ื’ -> ืื™ื ื˜ื’ืจืฆื™ื” ืžืชืžืฉื›ืช -> ืคืจื™ืกื” ืžืชืžืฉื›ืช

ื™ืฉื ืŸ ื”ื”ืฉืœื›ื•ืช ื”ื‘ืื•ืช ืฉืœ ื”ื’ื™ืฉื”:

  1. ื”ืชืฆื•ืจื” ื”ื™ื ืงื•ื”ืจื ื˜ื™ืช ืขื‘ื•ืจ ืžื•ืคืข ืฉืœ ืžืขืจื›ืช ืžืกื•ื™ืžืช. ื ืจืื” ืฉืื™ืŸ ื“ืจืš ืœืงืฉืจ ืฉื’ื•ื™ ื‘ื™ืŸ ืฆืžืชื™ื.
  2. ื–ื” ืœื ืงืœ ืœืฉื ื•ืช ืชืฆื•ืจื” ืจืง ื‘ืฆื•ืžืช ืื—ื“. ื–ื” ื ืจืื” ืœื ื”ื’ื™ื•ื ื™ ืœื”ื™ื›ื ืก ื•ืœืฉื ื•ืช ื›ืžื” ืงื‘ืฆื™ ื˜ืงืกื˜. ืื– ืกื—ื™ืคื” ืฉืœ ื”ืชืฆื•ืจื” ื”ื•ืคื›ืช ืœืคื—ื•ืช ืืคืฉืจื™ืช.
  3. ืฉื™ื ื•ื™ื™ื ืงื˜ื ื™ื ื‘ืชืฆื•ืจื” ืื™ื ื ืงืœื™ื ืœื‘ื™ืฆื•ืข.
  4. ืจื•ื‘ ืฉื™ื ื•ื™ื™ ื”ืชืฆื•ืจื” ื™ืขื‘ืจื• ืืช ืื•ืชื• ืชื”ืœื™ืš ืคื™ืชื•ื—, ื•ื”ื•ื ื™ืขื‘ื•ืจ ืกืงื™ืจื” ืžืกื•ื™ืžืช.

ื”ืื ืื ื—ื ื• ืฆืจื™ื›ื™ื ืžืื’ืจ ื ืคืจื“ ืœืชืฆื•ืจืช ื™ื™ืฆื•ืจ? ืชืฆื•ืจืช ื”ื™ื™ืฆื•ืจ ืขืฉื•ื™ื” ืœื”ื›ื™ืœ ืžื™ื“ืข ืจื’ื™ืฉ ืฉื ืจืฆื” ืœื”ืจื—ื™ืง ืžื”ื™ืฉื’ ื™ื“ื ืฉืœ ืื ืฉื™ื ืจื‘ื™ื. ืื– ืื•ืœื™ ื›ื“ืื™ ืœืฉืžื•ืจ ืžืื’ืจ ื ืคืจื“ ืขื ื’ื™ืฉื” ืžื•ื’ื‘ืœืช ืฉื™ื›ื™ืœ ืืช ืชืฆื•ืจืช ื”ื™ื™ืฆื•ืจ. ืื ื• ืขืฉื•ื™ื™ื ืœืคืฆืœ ืืช ื”ืชืฆื•ืจื” ืœืฉื ื™ ื—ืœืงื™ื - ืื—ื“ ืฉืžื›ื™ืœ ืืช ื”ืคืจืžื˜ืจื™ื ื”ืคืชื•ื—ื™ื ื‘ื™ื•ืชืจ ืฉืœ ื”ื™ื™ืฆื•ืจ ื•ืื—ื“ ืฉืžื›ื™ืœ ืืช ื”ื—ืœืง ื”ืกื•ื“ื™ ืฉืœ ื”ืชืฆื•ืจื”. ื–ื” ื™ืืคืฉืจ ื’ื™ืฉื” ืœืจื•ื‘ ื”ืžืคืชื—ื™ื ืœืจื•ื‘ ื”ืžื›ืจื™ืข ืฉืœ ื”ืคืจืžื˜ืจื™ื ืชื•ืš ื”ื’ื‘ืœืช ื’ื™ืฉื” ืœื“ื‘ืจื™ื ืจื’ื™ืฉื™ื ื‘ืืžืช. ืงืœ ืœื”ืฉื™ื’ ื–ืืช ื‘ืืžืฆืขื•ืช ืชื›ื•ื ื•ืช ื‘ื™ื ื™ื™ื ืขื ืขืจื›ื™ ื‘ืจื™ืจืช ืžื—ื“ืœ ืฉืœ ืคืจืžื˜ืจื™ื.

ื•ืจื™ืืฆื™ื•ืช

ื‘ื•ืื• ื ืจืื” ืืช ื”ื™ืชืจื•ื ื•ืช ื•ื”ื—ืกืจื•ื ื•ืช ืฉืœ ื”ื’ื™ืฉื” ื”ืžื•ืฆืขืช ื‘ื”ืฉื•ื•ืื” ืœื˜ื›ื ื™ืงื•ืช ื ื™ื”ื•ืœ ื”ืชืฆื•ืจื” ื”ืื—ืจื•ืช.

ืงื•ื“ื ื›ืœ, ื ืคืจื˜ ื›ืžื” ื—ืœื•ืคื•ืช ืœื”ื™ื‘ื˜ื™ื ื”ืฉื•ื ื™ื ืฉืœ ื”ื“ืจืš ื”ืžื•ืฆืขืช ืœื”ืชืžื•ื“ื“ ืขื ืชืฆื•ืจื”:

  1. ืงื•ื‘ืฅ ื˜ืงืกื˜ ื‘ืžื—ืฉื‘ ื”ื™ืขื“.
  2. ืื—ืกื•ืŸ ืžืจื›ื–ื™ ืฉืœ ืขืจืš ืžืคืชื— (ื›ืžื• etcd/zookeeper).
  3. ืจื›ื™ื‘ื™ ืชืช-ืชื”ืœื™ื›ื™ื ืฉื ื™ืชืŸ ืœื”ื’ื“ื™ืจ/ืœื”ืคืขื™ืœ ืžื—ื“ืฉ ืžื‘ืœื™ ืœื”ืคืขื™ืœ ืžื—ื“ืฉ ืืช ื”ืชื”ืœื™ืš.
  4. ืชืฆื•ืจื” ืžื—ื•ืฅ ืœื—ืคืฅ ื•ื‘ืงืจืช ื’ืจืกืื•ืช.

ืงื•ื‘ืฅ ื˜ืงืกื˜ ื ื•ืชืŸ ื’ืžื™ืฉื•ืช ืžืกื•ื™ืžืช ื‘ืžื•ื ื—ื™ื ืฉืœ ืชื™ืงื•ื ื™ื ืื“-ื”ื•ืง. ืžื ื”ืœ ืžืขืจื›ืช ื™ื›ื•ืœ ืœื”ื™ื›ื ืก ืœืฆื•ืžืช ื”ื™ืขื“, ืœื‘ืฆืข ืฉื™ื ื•ื™ ื•ืคืฉื•ื˜ ืœื”ืคืขื™ืœ ืžื—ื“ืฉ ืืช ื”ืฉื™ืจื•ืช. ื–ื” ืื•ืœื™ ืœื ื˜ื•ื‘ ืœืžืขืจื›ื•ืช ื’ื“ื•ืœื•ืช ื™ื•ืชืจ. ืœื ื ื•ืชืจื• ืขืงื‘ื•ืช ืžืื—ื•ืจื™ ื”ืฉื™ื ื•ื™. ื”ืฉื™ื ื•ื™ ืื™ื ื• ื ื‘ื“ืง ืขืœ ื™ื“ื™ ื–ื•ื’ ืขื™ื ื™ื™ื ืื—ืจ. ื™ื™ืชื›ืŸ ืฉื™ื”ื™ื” ืงืฉื” ืœื’ืœื•ืช ืžื” ื’ืจื ืœืฉื™ื ื•ื™. ื–ื” ืœื ื ื‘ื“ืง. ืžื ืงื•ื“ืช ืžื‘ื˜ ืฉืœ ืžืขืจื›ืช ืžื‘ื•ื–ืจืช, ืžื ื”ืœ ื™ื›ื•ืœ ืคืฉื•ื˜ ืœืฉื›ื•ื— ืœืขื“ื›ืŸ ืืช ื”ืชืฆื•ืจื” ื‘ืื—ื“ ื”ืฆืžืชื™ื ื”ืื—ืจื™ื.

(ื‘ื›ืœ ื–ืืช, ืื ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ ื™ื”ื™ื” ืฆื•ืจืš ืœื”ืชื—ื™ืœ ืœื”ืฉืชืžืฉ ื‘ืงื‘ืฆื™ ืชืฆื•ืจืช ื˜ืงืกื˜, ื ืฆื˜ืจืš ืœื”ื•ืกื™ืฃ ืจืง ืžื ืชื— + ืื™ืžื•ืช ืฉื™ื›ื•ืœ ืœื™ื™ืฆืจ ืืช ืื•ืชื• ื”ื“ื‘ืจ Config ืกื•ื’ ื•ื–ื” ื™ืกืคื™ืง ื›ื“ื™ ืœื”ืชื—ื™ืœ ืœื”ืฉืชืžืฉ ื‘ืชืฆื•ืจื•ืช ื˜ืงืกื˜. ื–ื” ื’ื ืžืจืื” ืฉื”ืžื•ืจื›ื‘ื•ืช ืฉืœ ืชืฆื•ืจืช ื–ืžืŸ ื”ื”ื™ื“ื•ืจ ื”ื™ื ืงืฆืช ื™ื•ืชืจ ืงื˜ื ื” ืžื”ืžื•ืจื›ื‘ื•ืช ืฉืœ ืชืฆื•ืจื•ืช ืžื‘ื•ืกืกื•ืช ื˜ืงืกื˜, ืžื›ื™ื•ื•ืŸ ืฉื‘ื’ืจืกื” ืžื‘ื•ืกืกืช ื˜ืงืกื˜ ืื ื—ื ื• ืฆืจื™ื›ื™ื ืงื•ื“ ื ื•ืกืฃ.)

ืื—ืกื•ืŸ ืžืจื›ื–ื™-ืขืจืš ืžืคืชื— ื”ื•ื ืžื ื’ื ื•ืŸ ื˜ื•ื‘ ืœื”ืคืฆืช ืžื˜ื ืคืจืžื˜ืจื™ื ืฉืœ ื™ื™ืฉื•ืžื™ื. ื›ืืŸ ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื—ืฉื•ื‘ ืžื” ืื ื—ื ื• ืžื—ืฉื™ื‘ื™ื ื›ืขืจื›ื™ ืชืฆื•ืจื” ื•ืžื”ื ืจืง ื ืชื•ื ื™ื. ื ืชื•ื ื” ืคื•ื ืงืฆื™ื” C => A => B ืื ื—ื ื• ื‘ื“ืจืš ื›ืœืœ ืžื›ื ื™ื ืขืจื›ื™ื ืžืฉืชื ื™ื ืœืขืชื™ื ื ื“ื™ืจื•ืช C "ืชืฆื•ืจื”", ื‘ืขื•ื“ ื ืชื•ื ื™ื ืžืฉืชื ื™ื ืœืขืชื™ื ืงืจื•ื‘ื•ืช A - ืจืง ื”ื–ื ืช ื ืชื•ื ื™ื. ื™ืฉ ืœืกืคืง ืชืฆื•ืจื” ืœืคื•ื ืงืฆื™ื” ืœืคื ื™ ื”ื ืชื•ื ื™ื A. ื‘ื”ืชื—ืฉื‘ ื‘ืจืขื™ื•ืŸ ื–ื” ืื ื• ื™ื›ื•ืœื™ื ืœื•ืžืจ ืฉืชื“ื™ืจื•ืช ื”ืฉื™ื ื•ื™ื™ื ื”ืฆืคื•ื™ื” ื”ื™ื ืžื” ืฉื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื• ื›ื“ื™ ืœื”ื‘ื—ื™ืŸ ื‘ื™ืŸ ื ืชื•ื ื™ ืชืฆื•ืจื” ืœื ืชื•ื ื™ื ื‘ืœื‘ื“. ื›ืžื• ื›ืŸ, ื”ื ืชื•ื ื™ื ืžื’ื™ืขื™ื ื‘ื“ืจืš ื›ืœืœ ืžืžืงื•ืจ ืื—ื“ (ืžืฉืชืžืฉ) ื•ื”ืชืฆื•ืจื” ืžื’ื™ืขื” ืžืžืงื•ืจ ืื—ืจ (ืื“ืžื™ืŸ). ื”ืชืžื•ื“ื“ื•ืช ืขื ืคืจืžื˜ืจื™ื ื”ื ื™ืชื ื™ื ืœืฉื™ื ื•ื™ ืœืื—ืจ ืชื”ืœื™ืš ื”ืืชื—ื•ืœ ืžื•ื‘ื™ืœื” ืœืขืœื™ื™ื” ื‘ืžื•ืจื›ื‘ื•ืช ื”ืืคืœื™ืงืฆื™ื”. ืขื‘ื•ืจ ืคืจืžื˜ืจื™ื ื›ืืœื” ื ืฆื˜ืจืš ืœื˜ืคืœ ื‘ืžื ื’ื ื•ืŸ ื”ืžืกื™ืจื” ืฉืœื”ื, ื ื™ืชื•ื— ื•ืื™ืžื•ืช, ื˜ื™ืคื•ืœ ื‘ืขืจื›ื™ื ืฉื’ื•ื™ื™ื. ืœืคื™ื›ืš, ืขืœ ืžื ืช ืœื”ืคื—ื™ืช ืืช ืžื•ืจื›ื‘ื•ืช ื”ืชื•ื›ื ื™ืช, ืžื•ื˜ื‘ ืฉื ืคื—ื™ืช ืืช ืžืกืคืจ ื”ืคืจืžื˜ืจื™ื ืฉื™ื›ื•ืœื™ื ืœื”ืฉืชื ื•ืช ื‘ื–ืžืŸ ืจื™ืฆื” (ืื• ืืคื™ืœื• ืœื‘ื˜ืœ ืื•ืชื ืœื—ืœื•ื˜ื™ืŸ).

ืžื ืงื•ื“ืช ื”ืžื‘ื˜ ืฉืœ ืคื•ืกื˜ ื–ื” ืขืœื™ื ื• ืœืขืฉื•ืช ื”ื‘ื—ื ื” ื‘ื™ืŸ ืคืจืžื˜ืจื™ื ืกื˜ื˜ื™ื™ื ื•ื“ื™ื ืืžื™ื™ื. ืื ืœื•ื’ื™ืงืช ื”ืฉื™ืจื•ืช ื“ื•ืจืฉืช ืฉื™ื ื•ื™ ื ื“ื™ืจ ืฉืœ ื›ืžื” ืคืจืžื˜ืจื™ื ื‘ื–ืžืŸ ืจื™ืฆื”, ืื– ืื ื—ื ื• ืขืฉื•ื™ื™ื ืœืงืจื•ื ืœื”ื ืคืจืžื˜ืจื™ื ื“ื™ื ืžื™ื™ื. ืื—ืจืช ื”ื ืกื˜ื˜ื™ื™ื ื•ื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ืžื•ื’ื“ืจื™ื ื‘ืืžืฆืขื•ืช ื”ื’ื™ืฉื” ื”ืžื•ืฆืขืช. ืขื‘ื•ืจ ื”ื’ื“ืจื” ืžื—ื“ืฉ ื“ื™ื ืžื™ืช ืขืฉื•ื™ื” ืœื”ื™ื•ืช ืฆื•ืจืš ื‘ื’ื™ืฉื•ืช ืื—ืจื•ืช. ืœื“ื•ื’ืžื”, ื™ื™ืชื›ืŸ ืฉื—ืœืงื™ื ืžื”ืžืขืจื›ืช ื™ื•ืคืขืœื• ืžื—ื“ืฉ ืขื ืคืจืžื˜ืจื™ ื”ืชืฆื•ืจื” ื”ื—ื“ืฉื™ื ื‘ืื•ืคืŸ ื“ื•ืžื” ืœื”ืคืขืœื” ืžื—ื“ืฉ ืฉืœ ืชื”ืœื™ื›ื™ื ื ืคืจื“ื™ื ืฉืœ ืžืขืจื›ืช ืžื‘ื•ื–ืจืช.
(ื“ืขืชื™ ื”ืฆื ื•ืขื” ื”ื™ื ืœื”ื™ืžื ืข ืžืชืฆื•ืจื” ืžื—ื“ืฉ ืฉืœ ื–ืžืŸ ืจื™ืฆื” ืžื›ื™ื•ื•ืŸ ืฉื”ื™ื ืžื’ื‘ื™ืจื” ืืช ื”ืžื•ืจื›ื‘ื•ืช ืฉืœ ื”ืžืขืจื›ืช.
ื–ื” ืขืฉื•ื™ ืœื”ื™ื•ืช ืคืฉื•ื˜ ื™ื•ืชืจ ืคืฉื•ื˜ ืœื”ืกืชืžืš ืขืœ ืชืžื™ื›ืช ืžืขืจื›ืช ื”ื”ืคืขืœื” ืฉืœ ืชื”ืœื™ื›ื™ ื”ืคืขืœื” ืžื—ื“ืฉ. ืื ื›ื™, ืื•ืœื™ ื–ื” ืœื ืชืžื™ื“ ืืคืฉืจื™.)

ื”ื™ื‘ื˜ ื—ืฉื•ื‘ ืื—ื“ ืฉืœ ืฉื™ืžื•ืฉ ื‘ืชืฆื•ืจื” ืกื˜ื˜ื™ืช ืฉื’ื•ืจื ืœืคืขืžื™ื ืœืื ืฉื™ื ืœืฉืงื•ืœ ืชืฆื•ืจื” ื“ื™ื ืžื™ืช (ืœืœื ืกื™ื‘ื•ืช ืื—ืจื•ืช) ื”ื•ื ื”ืฉื‘ืชืช ื”ืฉื™ืจื•ืช ื‘ืžื”ืœืš ืขื“ื›ื•ืŸ ื”ืชืฆื•ืจื”. ื•ืื›ืŸ, ืื ืขืœื™ื ื• ืœื‘ืฆืข ืฉื™ื ื•ื™ื™ื ื‘ืชืฆื•ืจื” ื”ืกื˜ื˜ื™ืช, ืขืœื™ื ื• ืœื”ืคืขื™ืœ ืžื—ื“ืฉ ืืช ื”ืžืขืจื›ืช ื›ืš ืฉืขืจื›ื™ื ื—ื“ืฉื™ื ื™ื”ื™ื• ื™ืขื™ืœื™ื. ื”ื“ืจื™ืฉื•ืช ืœื–ืžืŸ ื”ืฉื‘ืชื” ืžืฉืชื ื•ืช ืขื‘ื•ืจ ืžืขืจื›ื•ืช ืฉื•ื ื•ืช, ืื– ืื•ืœื™ ื–ื” ืœื ื›ืœ ื›ืš ืงืจื™ื˜ื™. ืื ื–ื” ืงืจื™ื˜ื™, ืื– ืขืœื™ื ื• ืœืชื›ื ืŸ ืžืจืืฉ ืขื‘ื•ืจ ื›ืœ ื”ืคืขืœื” ืžื—ื“ืฉ ืฉืœ ื”ืžืขืจื›ืช. ืœืžืฉืœ, ื ื•ื›ืœ ืœื™ื™ืฉื ื ื™ืงื•ื– ื—ื™ื‘ื•ืจ AWS ELB. ื‘ืชืจื—ื™ืฉ ื–ื” ื‘ื›ืœ ืคืขื ืฉืื ื• ืฆืจื™ื›ื™ื ืœื”ืคืขื™ืœ ืžื—ื“ืฉ ืืช ื”ืžืขืจื›ืช, ืื ื• ืžืชื—ื™ืœื™ื ืžื•ืคืข ื—ื“ืฉ ืฉืœ ื”ืžืขืจื›ืช ื‘ืžืงื‘ื™ืœ, ื•ืื– ืžืขื‘ื™ืจื™ื ืืœื™ื• ืืช ELB, ืชื•ืš ืžืชืŸ ืืคืฉืจื•ืช ืœืžืขืจื›ืช ื”ื™ืฉื ื” ืœื”ืฉืœื™ื ืืช ื”ืฉื™ืจื•ืช ืœื—ื™ื‘ื•ืจื™ื ืงื™ื™ืžื™ื.

ืžื” ืœื’ื‘ื™ ืฉืžื™ืจืช ืชืฆื•ืจื” ื‘ืชื•ืš ื—ืคืฅ ื’ืจืกื” ืื• ื‘ื—ื•ืฅ? ืฉืžื™ืจืช ืชืฆื•ืจื” ื‘ืชื•ืš ื—ืคืฅ ืคื™ืจื•ืฉื” ื‘ืจื•ื‘ ื”ืžืงืจื™ื ืฉืชืฆื•ืจื” ื–ื• ืขื‘ืจื” ืืช ืื•ืชื• ืชื”ืœื™ืš ื”ื‘ื˜ื—ืช ืื™ื›ื•ืช ื›ืžื• ื—ืคืฆื™ื ืื—ืจื™ื. ืื– ืืคืฉืจ ืœื”ื™ื•ืช ื‘ื˜ื•ื— ืฉื”ืชืฆื•ืจื” ื”ื™ื ื‘ืื™ื›ื•ืช ื˜ื•ื‘ื” ื•ืžื”ื™ืžื ื”. ืœื”ื™ืคืš, ืชืฆื•ืจื” ื‘ืงื•ื‘ืฅ ื ืคืจื“ ืคื™ืจื•ืฉื” ืฉืื™ืŸ ืขืงื‘ื•ืช ืœืžื™ ื•ืœืžื” ื‘ื™ืฆืขื• ืฉื™ื ื•ื™ื™ื ื‘ืงื•ื‘ืฅ ื–ื”. ื”ืื ื–ื” ื—ืฉื•ื‘? ืื ื• ืžืืžื™ื ื™ื ืฉืœืจื•ื‘ ืžืขืจื›ื•ืช ื”ื™ื™ืฆื•ืจ ืขื“ื™ืฃ ืฉืชื”ื™ื” ืชืฆื•ืจื” ื™ืฆื™ื‘ื” ื•ืื™ื›ื•ืชื™ืช.

ื’ืจืกืช ื”ื—ืคืฅ ืžืืคืฉืจืช ืœื’ืœื•ืช ืžืชื™ ื”ื•ื ื ื•ืฆืจ, ืื™ืœื• ืขืจื›ื™ื ื”ื•ื ืžื›ื™ืœ, ืื™ืœื• ืชื›ื•ื ื•ืช ืžื•ืคืขืœื•ืช/ืžื•ืฉื‘ืชื•ืช, ืžื™ ื”ื™ื” ืื—ืจืื™ ืœื‘ื™ืฆื•ืข ื›ืœ ืฉื™ื ื•ื™ ื‘ืชืฆื•ืจื”. ื–ื” ืขืฉื•ื™ ืœื“ืจื•ืฉ ืงืฆืช ืžืืžืฅ ื›ื“ื™ ืœืฉืžื•ืจ ืขืœ ืชืฆื•ืจื” ื‘ืชื•ืš ื—ืคืฅ ื•ื–ื• ื‘ื—ื™ืจื” ืขื™ืฆื•ื‘ื™ืช ืฉืฆืจื™ืš ืœืขืฉื•ืช.

ื—ืกืจื•ื ื•ืช ื™ืชืจื•ื ื•ืช

ื›ืืŸ ื‘ืจืฆื•ื ื ื• ืœื”ื“ื’ื™ืฉ ื›ืžื” ื™ืชืจื•ื ื•ืช ื•ืœื“ื•ืŸ ื‘ื›ืžื” ื—ืกืจื•ื ื•ืช ืฉืœ ื”ื’ื™ืฉื” ื”ืžื•ืฆืขืช.

ื™ืชืจื•ื ื•ืช

ืชื›ื•ื ื•ืช ืฉืœ ืชืฆื•ืจื” ื”ื ื™ืชื ืช ืœื”ื™ื“ื•ืจ ืฉืœ ืžืขืจื›ืช ืžื‘ื•ื–ืจืช ืฉืœืžื”:

  1. ื‘ื“ื™ืงื” ืกื˜ื˜ื™ืช ืฉืœ ืชืฆื•ืจื”. ื–ื” ื ื•ืชืŸ ืจืžื” ื’ื‘ื•ื”ื” ืฉืœ ื‘ื™ื˜ื—ื•ืŸ, ืฉื”ืชืฆื•ืจื” ื ื›ื•ื ื” ื‘ื”ื™ื ืชืŸ ืื™ืœื•ืฆื™ ืกื•ื’.
  2. ืฉืคืช ืชืฆื•ืจื” ืขืฉื™ืจื”. ื‘ื“ืจืš ื›ืœืœ ื’ื™ืฉื•ืช ืชืฆื•ืจื” ืื—ืจื•ืช ืžื•ื’ื‘ืœื•ืช ืœื›ืœ ื”ื™ื•ืชืจ ืœื”ื—ืœืคืช ืžืฉืชื ื”.
    ื‘ืืžืฆืขื•ืช Scala ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ืžื’ื•ื•ืŸ ืจื—ื‘ ืฉืœ ืชื›ื•ื ื•ืช ืฉืคื” ื›ื“ื™ ืœืฉืคืจ ืืช ื”ืชืฆื•ืจื”. ืœื“ื•ื’ืžื”, ืื ื• ื™ื›ื•ืœื™ื ืœื”ืฉืชืžืฉ ื‘ืชื›ื•ื ื•ืช ื›ื“ื™ ืœืกืคืง ืขืจื›ื™ ื‘ืจื™ืจืช ืžื—ื“ืœ, ืื•ื‘ื™ื™ืงื˜ื™ื ื›ื“ื™ ืœื”ื’ื“ื™ืจ ื”ื™ืงืฃ ืฉื•ื ื”, ืื ื• ื™ื›ื•ืœื™ื ืœื”ืชื™ื™ื—ืก ืืœื™ื”ื vals ืžื•ื’ื“ืจ ืจืง ืคืขื ืื—ืช ื‘ื˜ื•ื•ื— ื”ื—ื™ืฆื•ื ื™ (DRY). ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ืจืฆืคื™ื ืžื™ืœื•ืœื™ื™ื, ืื• ื‘ืžื•ืคืขื™ื ืฉืœ ืžื—ืœืงื•ืช ืžืกื•ื™ืžื•ืช (Seq, Map, ื•ื›ื• ').
  3. DSL. ืœืกืงืืœื” ื™ืฉ ืชืžื™ื›ื” ื”ื’ื•ื ื” ื‘ื›ื•ืชื‘ื™ DSL. ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ืชื›ื•ื ื•ืช ื”ืืœื” ื›ื“ื™ ืœื™ืฆื•ืจ ืฉืคืช ืชืฆื•ืจื” ืฉื”ื™ื ื ื•ื—ื” ื™ื•ืชืจ ื•ื™ื“ื™ื“ื•ืชื™ืช ื™ื•ืชืจ ืœืžืฉืชืžืฉ ื”ืงืฆื”, ื›ืš ืฉื”ืชืฆื•ืจื” ื”ืกื•ืคื™ืช ืชื”ื™ื” ืœืคื—ื•ืช ืงืจื™ืื” ืœืžืฉืชืžืฉื™ ื”ื“ื•ืžื™ื™ืŸ.
  4. ืฉืœืžื•ืช ื•ืงื•ื”ืจื ื˜ื™ื•ืช ืขืœ ืคื ื™ ืฆืžืชื™ื. ืื—ื“ ื”ื™ืชืจื•ื ื•ืช ืฉืœ ืงื‘ื™ืขืช ืชืฆื•ืจื” ืฉืœ ื›ืœ ื”ืžืขืจื›ืช ื”ืžื‘ื•ื–ืจืช ื‘ืžืงื•ื ืื—ื“ ื”ื•ื ืฉื›ืœ ื”ืขืจื›ื™ื ืžื•ื’ื“ืจื™ื ืืš ื•ืจืง ืคืขื ืื—ืช ื•ืœืื—ืจ ืžื›ืŸ ื ืขืฉื” ื‘ื”ื ืฉื™ืžื•ืฉ ื—ื•ื–ืจ ื‘ื›ืœ ื”ืžืงื•ืžื•ืช ืฉื‘ื”ื ืื ื• ื–ืงื•ืงื™ื ืœื”ื. ื”ืงืœื“ ื’ื ื”ืฆื”ืจื•ืช ื™ืฆื™ืื•ืช ื‘ื˜ื•ื—ื•ืช ืžื‘ื˜ื™ื—ื•ืช ืฉื‘ื›ืœ ื”ืชืฆื•ืจื•ืช ื”ื ื›ื•ื ื•ืช ื”ืืคืฉืจื™ื•ืช ื”ืฆืžืชื™ื ืฉืœ ื”ืžืขืจื›ืช ื™ื“ื‘ืจื• ื‘ืื•ืชื” ืฉืคื”. ื™ืฉ ืชืœื•ืช ืžืคื•ืจืฉืช ื‘ื™ืŸ ืฆืžืชื™ื ืžื” ืฉืžืงืฉื” ืœืฉื›ื•ื— ืœืกืคืง ืฉื™ืจื•ืชื™ื ืžืกื•ื™ืžื™ื.
  5. ืื™ื›ื•ืช ื’ื‘ื•ื”ื” ืฉืœ ืฉื™ื ื•ื™ื™ื. ื”ื’ื™ืฉื” ื”ื›ื•ืœืœืช ืฉืœ ื”ืขื‘ืจืช ืฉื™ื ื•ื™ื™ ืชืฆื•ืจื” ื“ืจืš ืชื”ืœื™ืš ื™ื—ืกื™ ืฆื™ื‘ื•ืจ ืจื’ื™ืœ ืงื•ื‘ืขืช ืกื˜ื ื“ืจื˜ื™ื ื’ื‘ื•ื”ื™ื ืฉืœ ืื™ื›ื•ืช ื’ื ื‘ืชืฆื•ืจื”.
  6. ืฉื™ื ื•ื™ื™ ืชืฆื•ืจื” ื‘ื• ื–ืžื ื™ืช. ื‘ื›ืœ ืคืขื ืฉืื ื• ืžื‘ืฆืขื™ื ืฉื™ื ื•ื™ื™ื ื›ืœืฉื”ื ื‘ืชืฆื•ืจื”, ื”ืคืจื™ืกื” ื”ืื•ื˜ื•ืžื˜ื™ืช ืžื‘ื˜ื™ื—ื” ืฉื›ืœ ื”ืฆืžืชื™ื ืžืชืขื“ื›ื ื™ื.
  7. ืคื™ืฉื•ื˜ ื™ื™ืฉื•ืžื™ื. ื”ืืคืœื™ืงืฆื™ื” ืœื ืฆืจื™ื›ื” ืœื ืชื— ื•ืœืืžืช ืชืฆื•ืจื” ื•ืœื˜ืคืœ ื‘ืขืจื›ื™ ืชืฆื•ืจื” ืฉื’ื•ื™ื™ื. ื–ื” ืžืคืฉื˜ ืืช ื”ื™ื™ืฉื•ื ื”ื›ื•ืœืœ. (ืขืœื™ื™ื” ืžืกื•ื™ื™ืžืช ื‘ืžื•ืจื›ื‘ื•ืช ื”ื™ื ื‘ืชืฆื•ืจื” ืขืฆืžื”, ืื‘ืœ ื–ื” ืคืฉืจื” ืžื•ื“ืขืช ืœื›ื™ื•ื•ืŸ ื‘ื˜ื™ื—ื•ืช.) ื–ื” ื“ื™ ืคืฉื•ื˜ ืœื—ื–ื•ืจ ืœืชืฆื•ืจื” ืจื’ื™ืœื” - ืคืฉื•ื˜ ื”ื•ืกืฃ ืืช ื”ื—ืœืงื™ื ื”ื—ืกืจื™ื. ืงืœ ื™ื•ืชืจ ืœื”ืชื—ื™ืœ ืขื ืชืฆื•ืจื” ืžื•ืจื›ื‘ืช ื•ืœื“ื—ื•ืช ื™ื™ืฉื•ื ืฉืœ ื—ืœืงื™ื ื ื•ืกืคื™ื ืœื–ืžื ื™ื ืžืื•ื—ืจื™ื ื™ื•ืชืจ.
  8. ืชืฆื•ืจื” ืžื ื•ืกื—ืช. ื‘ืฉืœ ื”ืขื•ื‘ื“ื” ืฉืฉื™ื ื•ื™ื™ ืชืฆื•ืจื” ืขื•ืงื‘ื™ื ืื—ืจ ืื•ืชื• ืชื”ืœื™ืš ืคื™ืชื•ื—, ื›ืชื•ืฆืื” ืžื›ืš ืื ื• ืžืงื‘ืœื™ื ื—ืคืฅ ืขื ื’ืจืกื” ื™ื™ื—ื•ื“ื™ืช. ื–ื” ืžืืคืฉืจ ืœื ื• ืœื”ื—ืœื™ืฃ ืชืฆื•ืจื” ื‘ื—ื–ืจื” ื‘ืžื™ื“ืช ื”ืฆื•ืจืš. ืื ื—ื ื• ืืคื™ืœื• ื™ื›ื•ืœื™ื ืœืคืจื•ืก ืชืฆื•ืจื” ืฉื”ื™ื™ืชื” ื‘ืฉื™ืžื•ืฉ ืœืคื ื™ ืฉื ื” ื•ื”ื™ื ืชืขื‘ื•ื“ ื‘ื“ื™ื•ืง ื‘ืื•ืชื• ืื•ืคืŸ. ืชืฆื•ืจื” ื™ืฆื™ื‘ื” ืžืฉืคืจืช ืืช ื”ื ื™ื‘ื•ื™ ื•ื”ืืžื™ื ื•ืช ืฉืœ ื”ืžืขืจื›ืช ื”ืžื‘ื•ื–ืจืช. ื”ืชืฆื•ืจื” ืงื‘ื•ืขื” ื‘ื–ืžืŸ ื”ื”ื™ื“ื•ืจ ื•ืœื ื ื™ืชืŸ ืœื—ื‘ืœ ื‘ืงืœื•ืช ื‘ืžืขืจื›ืช ื™ื™ืฆื•ืจ.
  9. ืžื•ื“ื•ืœืจื™ื•ืช. ื”ืžืกื’ืจืช ื”ืžื•ืฆืขืช ื”ื™ื ืžื•ื“ื•ืœืจื™ืช ื•ื ื™ืชืŸ ืœืฉืœื‘ ืžื•ื“ื•ืœื™ื ื‘ื“ืจื›ื™ื ืฉื•ื ื•ืช
    ืชืžื™ื›ื” ื‘ืชืฆื•ืจื•ืช ืฉื•ื ื•ืช (ื”ื’ื“ืจื•ืช/ืคืจื™ืกื•ืช). ื‘ืคืจื˜, ืืคืฉืจ ืœืงื‘ืœ ืคืจื™ืกืช ืฆื•ืžืช ื™ื—ื™ื“ ื‘ืงื ื” ืžื™ื“ื” ืงื˜ืŸ ื•ื”ื’ื“ืจืช ืจื™ื‘ื•ื™ ืฆืžืชื™ื ื‘ืงื ื” ืžื™ื“ื” ื’ื“ื•ืœ. ื–ื” ืกื‘ื™ืจ ืฉื™ื”ื™ื• ืžืกืคืจ ืคืจื™ืกื•ืช ื™ื™ืฆื•ืจ.
  10. ื‘ื“ื™ืงื”. ืœืžื˜ืจื•ืช ื‘ื“ื™ืงื” ืืคืฉืจ ืœื™ื™ืฉื ืฉื™ืจื•ืช ืžื“ื•ืžื” ื•ืœื”ืฉืชืžืฉ ื‘ื• ื›ืชืœื•ืช ื‘ืฆื•ืจื” ื‘ื˜ื•ื—ื” ืžืกื•ื’. ื›ืžื” ืคืจื™ืกื•ืช ื‘ื“ื™ืงื” ืฉื•ื ื•ืช ืขื ื—ืœืงื™ื ืฉื•ื ื™ื ืฉื”ื•ื—ืœืคื• ื‘ืœืขื’ ื™ื›ืœื• ืœื”ื™ืฉืžืจ ื‘ื• ื–ืžื ื™ืช.
  11. ื‘ื“ื™ืงืช ืื™ื ื˜ื’ืจืฆื™ื”. ืœืคืขืžื™ื ื‘ืžืขืจื›ื•ืช ืžื‘ื•ื–ืจื•ืช ืงืฉื” ืœื”ืคืขื™ืœ ืžื‘ื—ื ื™ ืื™ื ื˜ื’ืจืฆื™ื”. ื‘ืืžืฆืขื•ืช ื”ื’ื™ืฉื” ื”ืžืชื•ืืจืช ืœืกื•ื’ ืชืฆื•ืจื” ื‘ื˜ื•ื—ื” ืฉืœ ื”ืžืขืจื›ืช ื”ืžื‘ื•ื–ืจืช ื”ืฉืœืžื”, ืื ื• ื™ื›ื•ืœื™ื ืœื”ืจื™ืฅ ืืช ื›ืœ ื”ื—ืœืงื™ื ื”ืžื‘ื•ื–ืจื™ื ืขืœ ืฉืจืช ื‘ื•ื“ื“ ื‘ืฆื•ืจื” ื ื™ืชื ืช ืœืฉืœื™ื˜ื”. ืงืœ ืœื—ืงื•ืช ืืช ื”ืžืฆื‘
    ื›ืืฉืจ ืื—ื“ ื”ืฉื™ืจื•ืชื™ื ืื™ื ื• ื–ืžื™ืŸ.

ื—ืกืจื•ื ื•ืช

ื’ื™ืฉืช ื”ืชืฆื•ืจื” ื”ืžื”ื•ื“ืจืช ืฉื•ื ื” ืžืชืฆื•ืจื” "ืจื’ื™ืœื”" ื•ื™ื™ืชื›ืŸ ืฉื”ื™ื ืœื ืžืชืื™ืžื” ืœื›ืœ ื”ืฆืจื›ื™ื. ืœื”ืœืŸ ื›ืžื” ืžื”ื—ืกืจื•ื ื•ืช ืฉืœ ืชืฆื•ืจืช ื”ืงื•ืžืคื™ืœืฆื™ื”:

  1. ืชืฆื•ืจื” ืกื˜ื˜ื™ืช. ื™ื™ืชื›ืŸ ืฉื”ื•ื ืœื ืžืชืื™ื ืœื›ืœ ื”ื™ื™ืฉื•ืžื™ื. ื‘ืžืงืจื™ื ืžืกื•ื™ืžื™ื ื™ืฉ ืฆื•ืจืš ื‘ืชื™ืงื•ืŸ ืžื”ื™ืจ ืฉืœ ื”ืชืฆื•ืจื” ื‘ื™ื™ืฆื•ืจ ืชื•ืš ืขืงื™ืคืช ื›ืœ ืืžืฆืขื™ ื”ื‘ื˜ื™ื—ื•ืช. ื’ื™ืฉื” ื–ื• ืžืงืฉื” ืขืœ ื›ืš. ื”ื”ื™ื“ื•ืจ ื•ื”ืคืจื™ืกื” ืžื—ื“ืฉ ื ื“ืจืฉื™ื ืœืื—ืจ ื‘ื™ืฆื•ืข ื›ืœ ืฉื™ื ื•ื™ ื‘ืชืฆื•ืจื”. ื–ื• ื’ื ื”ืชื›ื•ื ื” ื•ื’ื ื”ื ื˜ืœ.
  2. ื™ืฆื™ืจืช ืชืฆื•ืจื”. ื›ืืฉืจ ืชืฆื•ืจื” ื ื•ืฆืจืช ืขืœ ื™ื“ื™ ื›ืœื™ ืื•ื˜ื•ืžืฆื™ื” ื›ืœืฉื”ื•, โ€‹โ€‹ื’ื™ืฉื” ื–ื• ื“ื•ืจืฉืช ืงื•ืžืคื™ืœืฆื™ื” ืœืื—ืจ ืžื›ืŸ (ืฉืขืฉื•ื™ื” ื‘ืชื•ืจื• ืœื”ื™ื›ืฉืœ). ื–ื” ืขืฉื•ื™ ืœื“ืจื•ืฉ ืžืืžืฅ ื ื•ืกืฃ ื›ื“ื™ ืœืฉืœื‘ ืืช ื”ืฉืœื‘ ื”ื ื•ืกืฃ ื”ื–ื” ื‘ืžืขืจื›ืช ื”ื‘ื ื™ื™ื”.
  3. ื›ืœื™ื. ื™ืฉ ื”ืจื‘ื” ื›ืœื™ื ื‘ืฉื™ืžื•ืฉ ื”ื™ื•ื ื”ืžืกืชืžื›ื™ื ืขืœ ืชืฆื•ืจื•ืช ืžื‘ื•ืกืกื•ืช ื˜ืงืกื˜. ื›ืžื” ืžื”ื
    ืœื ื™ื”ื™ื” ื™ืฉื™ื ื›ืืฉืจ ืชืฆื•ืจื” ื”ื™ื“ื•ืจ.
  4. ื™ืฉ ืฆื•ืจืš ื‘ืฉื™ื ื•ื™ ื—ืฉื™ื‘ื”. ืžืคืชื—ื™ื ื•-DevOps ืžื›ื™ืจื™ื ืงื‘ืฆื™ ืชืฆื•ืจืช ื˜ืงืกื˜. ื”ืจืขื™ื•ืŸ ืฉืœ ืงื•ืžืคื™ืœืฆื™ื” ืฉืœ ืชืฆื•ืจื” ืขืฉื•ื™ ืœื”ื™ืจืื•ืช ืœื”ื ืžื•ื–ืจ.
  5. ืœืคื ื™ ื”ืฆื’ืช ืชืฆื•ืจื” ื”ื ื™ืชื ืช ืœื”ื™ื“ื•ืจ ื ื“ืจืฉ ืชื”ืœื™ืš ืคื™ืชื•ื— ืชื•ื›ื ื” ื‘ืื™ื›ื•ืช ื’ื‘ื•ื”ื”.

ื™ืฉ ื›ืžื” ืžื’ื‘ืœื•ืช ืฉืœ ื”ื“ื•ื’ืžื” ื”ืžื™ื•ืฉืžืช:

  1. ืื ื ืกืคืง ืชืฆื•ืจื” ื ื•ืกืคืช ืฉืื™ื ื” ื ื“ืจืฉืช ืขืœ ื™ื“ื™ ื™ื™ืฉื•ื ื”ืฆื•ืžืช, ื”ืžื”ื“ืจ ืœื ื™ืขื–ื•ืจ ืœื ื• ืœื–ื”ื•ืช ืืช ื”ื™ื™ืฉื•ื ื”ื—ืกืจ. ื ื™ืชืŸ ืœื˜ืคืœ ื‘ื›ืš ื‘ืืžืฆืขื•ืช ืฉื™ืžื•ืฉ HList ืื• ADTs (ืžื—ืœืงื•ืช ืžืงืจื”) ืขื‘ื•ืจ ืชืฆื•ืจืช ืฆื•ืžืช ื‘ืžืงื•ื ืชื›ื•ื ื•ืช ื•ื“ืคื•ืก ืขื•ื’ื”.
  2. ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœืกืคืง ืื™ื–ืฉื”ื• ืœื•ื—ื™ืช ื‘ืงื•ื‘ืฅ ื”ืชืฆื•ืจื”: (package, import, object ื”ืฆื”ืจื•ืช;
    override defืขื‘ื•ืจ ืคืจืžื˜ืจื™ื ืฉื™ืฉ ืœื”ื ืขืจื›ื™ ื‘ืจื™ืจืช ืžื—ื“ืœ). ื–ื” ืขืฉื•ื™ ืœื”ื™ื•ืช ืžื˜ื•ืคืœ ื‘ืื•ืคืŸ ื—ืœืงื™ ื‘ืืžืฆืขื•ืช DSL.
  3. ื‘ืคื•ืกื˜ ื–ื” ืื™ื ื ื• ืžื›ืกื™ื ืชืฆื•ืจื” ืžื—ื“ืฉ ื“ื™ื ืžื™ืช ืฉืœ ืืฉื›ื•ืœื•ืช ืฉืœ ืฆืžืชื™ื ื“ื•ืžื™ื.

ืกื™ื›ื•ื

ื‘ืคื•ืกื˜ ื–ื” ื“ื ื• ื‘ืจืขื™ื•ืŸ ืฉืœ ื™ื™ืฆื•ื’ ืชืฆื•ืจื” ื™ืฉื™ืจื•ืช ื‘ืงื•ื“ ื”ืžืงื•ืจ ื‘ืฆื•ืจื” ื‘ื˜ื•ื—ื”. ื”ื’ื™ืฉื” ื™ื›ื•ืœื” ืœืฉืžืฉ ื‘ื™ื™ืฉื•ืžื™ื ืจื‘ื™ื ื›ืชื—ืœื™ืฃ ืœืชืฆื•ืจื•ืช ืžื‘ื•ืกืกื•ืช ื˜ืงืกื˜ ืื—ืจ ืฉืœ xml. ืœืžืจื•ืช ืฉื”ื“ื•ื’ืžื” ืฉืœื ื• ื™ื•ืฉืžื” ื‘-Scala, ื ื™ืชืŸ ืœืชืจื’ื ืื•ืชื” ื’ื ืœืฉืคื•ืช ื”ื™ื“ื•ืจ ืื—ืจื•ืช (ื›ืžื• Kotlin, C#, Swift ื•ื›ื•'). ืืคืฉืจ ืœื ืกื•ืช ืืช ื”ื’ื™ืฉื” ื”ื–ื• ื‘ืคืจื•ื™ืงื˜ ื—ื“ืฉ, ื•ื‘ืžืงืจื” ืฉื–ื” ืœื ืžืชืื™ื, ืœืขื‘ื•ืจ ืœื“ืจืš ื”ื™ืฉื ื”.

ื›ืžื•ื‘ืŸ, ืชืฆื•ืจื” ื”ื ื™ืชื ืช ืœื”ื™ื“ื•ืจ ื“ื•ืจืฉืช ืชื”ืœื™ืš ืคื™ืชื•ื— ื‘ืื™ื›ื•ืช ื’ื‘ื•ื”ื”. ื‘ืชืžื•ืจื” ื”ื™ื ืžื‘ื˜ื™ื—ื” ืœืกืคืง ืชืฆื•ืจื” ื—ื–ืงื” ื‘ืื™ื›ื•ืช ื’ื‘ื•ื”ื” ื‘ืื•ืชื” ืžื™ื“ื”.

ื ื™ืชืŸ ืœื”ืจื—ื™ื‘ ื’ื™ืฉื” ื–ื• ื‘ื“ืจื›ื™ื ืฉื•ื ื•ืช:

  1. ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ืคืงื•ื“ื•ืช ืžืืงืจื• ื›ื“ื™ ืœื‘ืฆืข ืื™ืžื•ืช ืชืฆื•ืจื” ื•ืœื”ื™ื›ืฉืœ ื‘ื–ืžืŸ ื”ืงื•ืžืคื™ืœืฆื™ื” ื‘ืžืงืจื” ืฉืœ ื›ืฉืœื™ื ืฉืœ ืื™ืœื•ืฆื™ ืœื•ื’ื™ืงื” ืขืกืงื™ืช.
  2. ื ื™ืชืŸ ืœื™ื™ืฉื DSL ื›ื“ื™ ืœื™ื™ืฆื’ ืชืฆื•ืจื” ื‘ืฆื•ืจื” ื™ื“ื™ื“ื•ืชื™ืช ืœืžืฉืชืžืฉ ื‘ื“ื•ืžื™ื™ืŸ.
  3. ื ื™ื”ื•ืœ ืžืฉืื‘ื™ื ื“ื™ื ืžื™ ืขื ื”ืชืืžื•ืช ืื•ื˜ื•ืžื˜ื™ื•ืช ืฉืœ ืชืฆื•ืจื”. ืœื“ื•ื’ืžื”, ื›ืืฉืจ ืื ื• ืžื›ื•ื•ื ื™ื ืืช ืžืกืคืจ ืฆืžืชื™ ื”ืืฉื›ื•ืœ, ื™ื™ืชื›ืŸ ืฉื ืจืฆื” (1) ืฉื”ืฆืžืชื™ื ื™ืงื‘ืœื• ืชืฆื•ืจื” ืฉื•ื ื” ื‘ืžืงืฆืช; (2) ืžื ื”ืœ ืืฉื›ื•ืœื•ืช ื›ื“ื™ ืœืงื‘ืœ ืžื™ื“ืข ืขืœ ืฆืžืชื™ื ื—ื“ืฉื™ื.

ืชื•ื“ื”

ืื ื™ ืจื•ืฆื” ืœื•ืžืจ ืชื•ื“ื” ืœืื ื“ืจื™ื™ ืกืงืกื•ื ื•ื‘, ืคืื‘ืœ ืคื•ืคื•ื‘, ืื ื˜ื•ืŸ ื ื”ื™ื™ื‘ ืขืœ ืฉื ืชืชื ืžืฉื•ื‘ ืžืขื•ืจืจ ื”ืฉืจืื” ืขืœ ื˜ื™ื•ื˜ืช ื”ืคื•ืกื˜ ื”ื–ื” ืฉืขื–ืจ ืœื™ ืœื”ื‘ื”ื™ืจ ืื•ืชื•.

ืžืงื•ืจ: www.habr.com