ืงืึธืžืคึผื™ืœืขื“ ื“ื™ืกื˜ืจื™ื‘ื™ื•ื˜ื™ื“ ืกื™ืกื˜ืขื ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ

ืื™ืš ื•ื•ืึธืœื˜ ื•ื•ื™ ืฆื• ื–ืึธื’ืŸ ืื™ืจ ืึท ื˜ืฉื™ืงืึทื•ื•ืข ืžืขืงืึทื ื™ื–ืึทื ืคึฟืึทืจ ืืจื‘ืขื˜ืŸ ืžื™ื˜ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืคื•ืŸ ืึท ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜ ืกื™ืกื˜ืขื. ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ื– ืจืขืคึผืจื™ื–ืขื ื˜ื™ื“ ื’ืœื™ื™ึทืš ืื™ืŸ ืึท ืงืึทืžืคึผื™ื™ืœื“ ืฉืคึผืจืึทืš (ืกืงืึทืœืึท) ื ื™ืฆืŸ ื–ื™ื›ืขืจ ื˜ื™ื™ืคึผืก. ื“ืขืจ ืคึผืึธืกื˜ืŸ ื’ื™ื˜ ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคื•ืŸ ืึทื–ืึท ืึท ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื•ืŸ ื“ื™ืกืงืึทืกื˜ ืคืึทืจืฉื™ื“ืŸ ืึทืกืคึผืขืงืฅ ืคื•ืŸ ื™ืžืคึผืœืึทืžืขื ื™ื ื’ ืึท ืงืึทืžืคึผื™ื™ืœื“ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ืŸ ื“ื™ ืงื•ื™ืœืขืœื“ื™ืง ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืคึผืจืึธืฆืขืก.

ืงืึธืžืคึผื™ืœืขื“ ื“ื™ืกื˜ืจื™ื‘ื™ื•ื˜ื™ื“ ืกื™ืกื˜ืขื ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ

(ืขื ื’ืœื™ืฉ)

ื”ืงื“ืžื”

ื‘ื ื™ืŸ ืึท ืคืึทืจืœืึธื–ืœืขืš ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜ ืกื™ืกื˜ืขื ืžื™ื˜ืœ ืึทื– ืึทืœืข ื ืึธื•ื“ื– ื ื•ืฆืŸ ื“ื™ ืจื™ื›ื˜ื™ืง ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ, ืกื™ื ื’ืงืจืึทื ื™ื™ื–ื“ ืžื™ื˜ ืื ื“ืขืจืข ื ืึธื•ื“ื–. DevOps ื˜ืขืงื ืึทืœืึทื“ื–ืฉื™ื– (ื˜ืขืจืจืึทืคืึธืจื, ืึทื ืกืึทื‘ืึทืœ ืึธื“ืขืจ ืขืคึผืขืก ื•ื•ื™ ื“ืึธืก) ื–ืขื ืขืŸ ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ื’ืขื ื™ืฆื˜ ืฆื• ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ื“ื–ืฉืขื ืขืจื™ื™ื˜ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื˜ืขืงืขืก (ืึธืคื˜ ืกืคึผืขืฆื™ืคื™ืฉ ืคึฟืึทืจ ื™ืขื“ืขืจ ื ืึธื“ืข). ืžื™ืจ ื•ื•ืขืœืŸ ืื•ื™ืš ื–ื™ื™ืŸ ื–ื™ื›ืขืจ ืึทื– ืึทืœืข ืงืึทืžื™ื•ื ืึทืงื™ื™ื˜ื™ื ื’ ื ืึธื•ื“ื– ื ื•ืฆืŸ ื™ื™ื“ืขื ื™ืงืึทืœ ืคึผืจืึธื˜ืึธืงืึธืœืก (ืึทืจื™ื™ึทื ื’ืขืจืขื›ื ื˜ ื“ื™ ื–ืขืœื‘ืข ื•ื•ืขืจืกื™ืข). ืึทื ื“ืขืจืฉ, ื™ื ืงืึทืžืคึผืึทื˜ืึทื‘ื™ืœืึทื˜ื™ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขื‘ื•ื™ื˜ ืื™ืŸ ืื•ื ื“ื–ืขืจ ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜ ืกื™ืกื˜ืขื. ืื™ืŸ ื“ื™ JVM ื•ื•ืขืœื˜, ืื™ื™ืŸ ืงืึทื ืกืึทืงื•ื•ืึทื ืก ืคื•ืŸ ื“ืขื ืคืึธื“ืขืจื•ื ื’ ืื™ื– ืึทื– ื“ื™ ื–ืขืœื‘ืข ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹ื“ืขืจ ื‘ื™ื‘ืœื™ืึธื˜ืขืง ืžื™ื˜ ื“ื™ ืคึผืจืึธื˜ืึธืงืึธืœ ืึทืจื˜ื™ืงืœืขืŸ ืžื•ื–ืŸ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืื•ืžืขื˜ื•ื.

ื•ื•ืึธืก ื•ื•ืขื’ืŸ ื˜ืขืกื˜ื™ื ื’ ืึท ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜ ืกื™ืกื˜ืขื? ืคื•ืŸ ืงื•ืจืก, ืžื™ืจ ื™ื‘ืขืจื ืขืžืขืŸ ืึทื– ืึทืœืข ืงืึทืžืคึผืึธื•ื ืึทื ืฅ ื”ืึธื‘ืŸ ืึทืคึผืึทืจืึทื˜ ื˜ืขืกืฅ ืื™ื™ื“ืขืจ ืžื™ืจ ืžืึทืš ืื•ื™ืฃ ืฆื• ื™ื ื˜ืึทื’ืจื™ื™ืฉืึทืŸ ื˜ืขืกื˜ื™ื ื’. (ื›ื“ื™ ืื•ื ื“ื– ืฆื• ืขืงืกื˜ืจืึทืคึผืึธื•ืœื™ืจืŸ ืคึผืจื•ื‘ื™ืจืŸ ืจืขื–ื•ืœื˜ืึทื˜ืŸ ืฆื• ืจื•ื ื˜ื™ืžืข, ืžื™ืจ ืžื•ื–ืŸ ืื•ื™ืš ืฆื•ืฉื˜ืขืœืŸ ืึทืŸ ื™ื™ื“ืขื ื™ืงืึทืœ ื’ืึทื ื’ ืคื•ืŸ ืœื™ื™ื‘ืจืขืจื™ื– ืื™ืŸ ื“ื™ ื˜ืขืกื˜ื™ื ื’ ื‘ื™ื ืข ืื•ืŸ ื‘ื™ื™ ืจื•ื ื˜ื™ืžืข.)

ื•ื•ืขืŸ ืืจื‘ืขื˜ืŸ ืžื™ื˜ ื™ื ื˜ืึทื’ืจื™ื™ืฉืึทืŸ ื˜ืขืกืฅ, ืขืก ืื™ื– ืึธืคื˜ ื’ืจื™ื ื’ืขืจ ืฆื• ื ื•ืฆืŸ ื“ื™ ื–ืขืœื‘ืข ืงืœืึทืกืคึผืึทื˜ ืื•ืžืขื˜ื•ื ืื•ื™ืฃ ืึทืœืข ื ืึธื•ื“ื–. ื›ืœ ืžื™ืจ ื”ืึธื‘ืŸ ืฆื• ื˜ืึธืŸ ืื™ื– ืฆื• ืขื ืฉื•ืจ ืึทื– ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืงืœืึทืกืคึผืึทื˜ ืื™ื– ื’ืขื ื™ืฆื˜ ืื™ืŸ ืจื•ื ื˜ื™ืžืข. (ื›ืึธื˜ืฉ ืขืก ืื™ื– ื’ืึธืจ ืžืขื’ืœืขืš ืฆื• ืœื•ื™ืคืŸ ืคืึทืจืฉื™ื“ืขื ืข ื ืึธื•ื“ื– ืžื™ื˜ ืคืึทืจืฉื™ื“ืขื ืข ืงืœืึทืก ืคึผืึทื˜ืก, ื“ืึธืก ืœื™ื™ื’ื˜ ืงืึทืžืคึผืœืขืงืกื™ื˜ื™ ืฆื• ื“ื™ ืงื•ื™ืœืขืœื“ื™ืง ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื•ืŸ ืฉื•ื•ืขืจื™ืงื™ื™ื˜ืŸ ืžื™ื˜ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืื•ืŸ ื™ื ื˜ืึทื’ืจื™ื™ืฉืึทืŸ ื˜ืขืกืฅ.) ืคึฟืึทืจ ื“ื™ ืฆื•ื•ืขืงืŸ ืคื•ืŸ ื“ืขื ืคึผืึธืกื˜ืŸ, ืžื™ืจ ื™ื‘ืขืจื ืขืžืขืŸ ืึทื– ืึทืœืข ื ืึธื•ื“ื– ื•ื•ืขื˜ ื ื•ืฆืŸ ื“ื™ ื–ืขืœื‘ืข ืงืœืึทืกืคึผืึทื˜.

ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื™ื•ื•ืึทืœื•ื•ื– ืžื™ื˜ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ. ืžื™ืจ ื ื•ืฆืŸ ื•ื•ืขืจืกื™ืขืก ืฆื• ื™ื“ืขื ื˜ื™ืคื™ืฆื™ืจืŸ ืคืึทืจืฉื™ื“ืขื ืข ืกื˜ืึทื’ืขืก ืคื•ืŸ ืคึผืจืึธื’ืจืึทื ืขื•ื•ืึธืœื•ืฆื™ืข. ืขืก ืกื™ืžื– ืœืึทื“ื–ืฉื™ืงืึทืœ ืฆื• ื™ื“ืขื ื˜ื™ืคื™ืฆื™ืจืŸ ืคืึทืจืฉื™ื“ืขื ืข ื•ื•ืขืจืกื™ืขืก ืคื•ืŸ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทื ื–. ืื•ืŸ ืฉื˜ืขืœืŸ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื–ื™ืš ืื™ืŸ ื“ื™ ื•ื•ืขืจืกื™ืข ืงืึธื ื˜ืจืึธืœ ืกื™ืกื˜ืขื. ืื•ื™ื‘ ืขืก ืื™ื– ื‘ืœื•ื™ื– ืื™ื™ืŸ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ืŸ ืคึผืจืึธื“ื•ืงืฆื™ืข, ืžื™ืจ ืงืขื ืขืŸ ืคืฉื•ื˜ ื ื•ืฆืŸ ื“ื™ ื•ื•ืขืจืกื™ืข ื ื•ืžืขืจ. ืื•ื™ื‘ ืžื™ืจ ื ื•ืฆืŸ ืคื™ืœืข ืคึผืจืึธื“ื•ืงืฆื™ืข ื™ื ืกื˜ืึทื ืกื™ื–, ืžื™ืจ ื“ืึทืจืคึฟืŸ ืขื˜ืœืขื›ืข
ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืฆื•ื•ื™ื™ื’ืŸ ืื•ืŸ ืึทืŸ ื ืึธืš ืคื™ืจืžืข ืื™ืŸ ืึทื“ื™ืฉืึทืŸ ืฆื• ื“ื™ ื•ื•ืขืจืกื™ืข (ืœืžืฉืœ, ื“ื™ ื ืึธืžืขืŸ ืคื•ืŸ ื“ื™ ืฆื•ื•ื™ื™ึทื’). ื“ืขื ื•ื•ืขื’ ืžื™ืจ ืงืขื ืขืŸ ืงืœืืจ ื™ื“ืขื ื˜ื™ืคื™ืฆื™ืจืŸ ื“ื™ ืคึผื™ื ื˜ืœืขืš ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ. ื™ืขื“ืขืจ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ื“ืขื ื˜ื™ืคื™ืฆื™ืจื˜ ื™ื•ื ื™ืงืœื™ ืงืึธืจืึทืกืคึผืึทื ื“ื– ืฆื• ืึท ืกืคึผืขืฆื™ืคื™ืฉ ืงืึธืžื‘ื™ื ืึทืฆื™ืข ืคื•ืŸ โ€‹โ€‹ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜ ื ืึธื•ื“ื–, ืคึผืึธืจืฅ, ืคื•ื ื“ืจื•ื™ืกื ื“ื™ืง ืจืขืกื•ืจืกืŸ ืื•ืŸ ื‘ื™ื‘ืœื™ืึธื˜ืขืง ื•ื•ืขืจืกื™ืขืก. ืคึฟืึทืจ ื“ื™ ืฆื•ื•ืขืงืŸ ืคื•ืŸ ื“ืขื ืคึผืึธืกื˜ืŸ, ืžื™ืจ ื•ื•ืขืœืŸ ื™ื‘ืขืจื ืขืžืขืŸ ืึทื– ืขืก ืื™ื– ื‘ืœื•ื™ื– ืื™ื™ืŸ ืฆื•ื•ื™ื™ึทื’ ืื•ืŸ ืžื™ืจ ืงืขื ืขืŸ ื™ื“ืขื ื˜ื™ืคื™ืฆื™ืจืŸ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื•ื™ืฃ ื“ื™ ื’ืขื•ื•ื™ื™ื ื˜ืœืขืš ื•ื•ืขื’ ื ื™ืฆืŸ ื“ืจื™ื™ ื ื•ืžืขืจืŸ ืืคื’ืขืฉื™ื™ื“ื˜ ื“ื•ืจืš ืึท ืคึผื•ื ืงื˜ (1.2.3).

ืื™ืŸ ืžืึธื“ืขืจืŸ ื™ื ื•ื•ื™ื™ืจืึทื ืžืึทื ืฅ, ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื˜ืขืงืขืก ื–ืขื ืขืŸ ืจืึทืจืขืœื™ ื‘ืืฉืืคืŸ ืžืึทื ื™ื•ืึทืœื™. ืžืขืจ ืึธืคื˜ ื–ื™ื™ ื–ืขื ืขืŸ ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“ ื‘ืขืฉืึทืก ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืื•ืŸ ื–ืขื ืขืŸ ื ื™ื˜ ืžืขืจ ื’ืขืจื™ืจื˜ (ืึทื–ื•ื™ ื‘ืจืึธืš ื’ืึธืจื ื™ืฉื˜). ื ื ืึทื˜ื™ืจืœืขืš ืงืฉื™ื ืขืจื™ื™ื–ืึทื–: ื•ื•ืึธืก ื˜ืึธืŸ ืžื™ืจ ื ืึธืš ื ื•ืฆืŸ ื˜ืขืงืกื˜ ืคึฟืึธืจืžืึทื˜ ืฆื• ืงืจืึธื ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ? ื ื•ื•ื™ื™ืึทื‘ืึทืœ ืึธืœื˜ืขืจื ืึทื˜ื™ื•ื• ืกื™ืžื– ืฆื• ื–ื™ื™ืŸ ื“ื™ ืคื™ื™ื™ืงื™ื™ื˜ ืฆื• ื ื•ืฆืŸ ืจืขื’ื•ืœืขืจ ืงืึธื“ ืคึฟืึทืจ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื•ืŸ ื ื•ืฅ ืคื•ืŸ ืงืึทืžืคึผื™ื™ืœื™ื ื’ ืฆื™ื™ื˜ ื˜ืฉืขืงืก.

ืื™ืŸ ื“ืขื ืคึผืึธืกื˜ืŸ, ืžื™ืจ ื•ื•ืขืœืŸ ื•ื™ืกืคืึธืจืฉืŸ ื“ื™ ื’ืขื“ืึทื ืง ืคื•ืŸ ืจืขืคึผืจื™ื–ืขื ื˜ื™ื ื’ ืึท ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ืŸ ืึท ืงืึทืžืคึผื™ื™ืœื“ ืึทืจื˜ืึทืคืึทืงื˜.

ืงืึธืžืคึผื™ืœืขื“ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ

ื“ืขืจ ืึธืคึผื˜ื™ื™ืœื•ื ื’ ื’ื™ื˜ ืึท ื‘ื™ื™ึทืฉืคึผื™ืœ ืคื•ืŸ ืึท ืกื˜ืึทื˜ื™ืง ืงืึทืžืคึผื™ื™ืœื“ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ. ืฆื•ื•ื™ื™ ืคึผืฉื•ื˜ ืกืขืจื•ื•ื™ืกืขืก ื–ืขื ืขืŸ ื™ืžืคึผืœืึทืžืขื ืึทื“ - ื“ื™ ืขืงืึธื• ื“ื™ื ืกื˜ ืื•ืŸ ื“ื™ ืขืงืึธื• ืกืขืจื•ื•ื™ืก ืงืœื™ืขื ื˜. ื‘ืึทื–ื™ืจื˜ ืื•ื™ืฃ ื“ื™ ืฆื•ื•ื™ื™ ื‘ืึทื“ื™ื ื•ื ื’ืก, ืฆื•ื•ื™ื™ ืกื™ืกื˜ืขื ืึธืคึผืฆื™ืขืก ื–ืขื ืขืŸ ืคืืจื–ืืžืœื˜. ืื™ืŸ ืื™ื™ืŸ ืึธืคึผืฆื™ืข, ื‘ื™ื™ื“ืข ื‘ืึทื“ื™ื ื•ื ื’ืก ื–ืขื ืขืŸ ืœื™ื’ืŸ ืื•ื™ืฃ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ื ืึธื“ืข, ืื™ืŸ ืืŸ ืื ื“ืขืจ ืึธืคึผืฆื™ืข - ืื•ื™ืฃ ืคืึทืจืฉื™ื“ืขื ืข ื ืึธื•ื“ื–.

ื˜ื™ืคึผื™ืงืึทืœืœื™ ืึท ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜ ืกื™ืกื˜ืขื ื›ึผื•ืœืœ ืขื˜ืœืขื›ืข ื ืึธื•ื“ื–. ืื™ืจ ืงืขื ืขืŸ ื™ื“ืขื ื˜ื™ืคื™ืฆื™ืจืŸ ื ืึธื•ื“ื– ื ื™ืฆืŸ ื•ื•ืึทืœื•ืขืก ืคื•ืŸ ืขื˜ืœืขื›ืข ื˜ื™ืคึผ NodeId:

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]]

ืจืึทืคื™ื ื™ืจื˜ืข ื˜ื™ื™ืคึผืก

ื–ืขืŸ ื‘ื™ื‘ืœื™ืึธื˜ืขืง ืจืึทืคื™ื ื™ืจื˜ ะธ ืžื™ื™ึทืŸ ื‘ืึทืจื™ื›ื˜. ืื™ืŸ ืงื•ืจืฅ, ื“ื™ ื‘ื™ื‘ืœื™ืึธื˜ืขืง ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืœื™ื™ื’ืŸ ืงืึทื ืกื˜ืจื™ื™ื ืฅ ืฆื• ื˜ื™ื™ืคึผืก ื•ื•ืึธืก ื–ืขื ืขืŸ ืึธืคึผื’ืขืฉื˜ืขืœื˜ ืื™ืŸ ื“ื™ ืงืึทืžืคึผื™ื™ืœื™ื ื’ ืฆื™ื™ื˜. ืื™ืŸ ื“ืขื ืคืึทืœ, ื“ื™ ื’ื™ืœื˜ื™ืง ืคึผืึธืจื˜ ื ื•ืžืขืจ ื•ื•ืึทืœื•ืขืก ื–ืขื ืขืŸ 16-ื‘ื™ืกืœ ื™ื ื˜ืึทื“ื–ืฉืขืจื–. ืคึฟืึทืจ ืึท ืงืึทืžืคึผื™ื™ืœื“ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ, ื ื™ืฆืŸ ื“ื™ ืจืึทืคื™ื ื™ืจื˜ ื‘ื™ื‘ืœื™ืึธื˜ืขืง ืื™ื– ื ื™ืฉื˜ ืžืึทื ื“ืึทื˜ืึธืจื™, ืึธื‘ืขืจ ืขืก ื™ืžืคึผืจื•ื•ื•ื– ื“ื™ ืงืึทืžืคึผื™ื™ืœืขืจ ืก ืคื™ื™ื™ืงื™ื™ื˜ ืฆื• ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ.

ืคึฟืึทืจ HTTP (REST) โ€‹โ€‹ืคึผืจืึธื˜ืึธืงืึธืœืก, ืื™ืŸ ืึทื“ื™ืฉืึทืŸ ืฆื• ื“ื™ ืคึผืึธืจื˜ ื ื•ืžืขืจ, ืžื™ืจ ืงืขืŸ ืื•ื™ืš ื“ืึทืจืคึฟืŸ ื“ื™ ื“ืจืš ืฆื• ื“ื™ ืกืขืจื•ื•ื™ืก:

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

ืคืึทื ื˜ืึธื ื˜ื™ื™ืคึผืก

ืฆื• ื™ื“ืขื ื˜ื™ืคื™ืฆื™ืจืŸ ื“ืขื ืคึผืจืึธื˜ืึธืงืึธืœ ืื™ืŸ ื“ื™ ืงืึทืžืคึผื™ื™ืœื™ื ื’ ืฆื™ื™ื˜, ืžื™ืจ ื ื•ืฆืŸ ืึท ื˜ื™ืคึผ ืคึผืึทืจืึทืžืขื˜ืขืจ ื•ื•ืึธืก ืื™ื– ื ื™ืฉื˜ ื’ืขื ื™ืฆื˜ ืื™ืŸ ื“ืขืจ ืงืœืึทืก. ื“ืขืจ ื‘ืึทืฉืœื•ืก ืื™ื– ืจืขื›ื˜ ืฆื• ื“ืขื ืคืึทืงื˜ ืึทื– ืžื™ืจ ื˜ืึธืŸ ื ื™ื˜ ื ื•ืฆืŸ ืึท ืคึผืจืึธื˜ืึธืงืึธืœ ื‘ื™ื™ึทืฉืคึผื™ืœ ืื™ืŸ ืจื•ื ื˜ื™ืžืข, ืึธื‘ืขืจ ืžื™ืจ ื•ื•ืึธืœื˜ ื•ื•ื™ ื“ืขืจ ืงืึทืžืคึผื™ื™ืœืขืจ ืฆื• ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืคึผืจืึธื˜ืึธืงืึธืœ ืงืึทืžืคึผืึทื˜ืึทื‘ื™ืœืึทื˜ื™. ื“ื•ืจืš ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ื“ืขื ืคึผืจืึธื˜ืึธืงืึธืœ, ืžื™ืจ ื•ื•ืขืœืŸ ื ื™ืฉื˜ ืงืขื ืขืŸ ืฆื• ืคืึธืจืŸ ืึทืŸ ื™ื ืึทืคึผืจืึธื•ืคึผืจื™ื™ื˜ ื“ื™ื ืกื˜ ื•ื•ื™ ืึท ื“ืขืคึผืขื ื“ืขื ืกื™.

ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืคึผืจืึธืกื˜ ืคึผืจืึธื˜ืึธืงืึธืœืก ืื™ื– ื“ื™ REST API ืžื™ื˜ Json ืกื™ืจื™ืึทืœื™ื–ื™ื™ืฉืึทืŸ:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

ื•ื•ื• RequestMessage - ื˜ื™ืคึผ ืคื•ืŸ ื‘ืงืฉื”, ResponseMessage - ื˜ื™ืคึผ ืคื•ืŸ ืขื ื˜ืคืขืจ.
ืคื•ืŸ ืงื•ืจืก, ืžื™ืจ ืงืขื ืขืŸ ื ื•ืฆืŸ ืื ื“ืขืจืข ืคึผืจืึธื˜ืึธืงืึธืœ ื“ื™ืกืงืจื™ืคึผืฉืึทื ื– ื•ื•ืึธืก ืฆื•ืฉื˜ืขืœืŸ ื“ื™ ืึทืงื™ืขืจืึทืกื™ ืคื•ืŸ ื“ื™ ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’ ื•ื•ืึธืก ืžื™ืจ ื“ืึทืจืคืŸ.

ืคึฟืึทืจ ื“ื™ ืฆื•ื•ืขืงืŸ ืคื•ืŸ ื“ืขื ืคึผืึธืกื˜ืŸ, ืžื™ืจ ื•ื•ืขืœืŸ ื ื•ืฆืŸ ืึท ืกื™ืžืคึผืœืึทืคื™ื™ื“ ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹ื“ืขื ืคึผืจืึธื˜ืึธืงืึธืœ:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

ื“ืึธ ื“ื™ ื‘ืงืฉื” ืื™ื– ืึท ืฉื˜ืจื™ืงืœ ืึทืคึผืคึผืขื ื“ืขื“ ืฆื• ื“ื™ URL ืื•ืŸ ื“ืขืจ ืขื ื˜ืคืขืจ ืื™ื– ื“ื™ ืื•ืžื’ืขืงืขืจื˜ ืฉื˜ืจื™ืงืœ ืื™ืŸ ื“ืขื ื’ื•ืฃ ืคื•ืŸ ื“ื™ HTTP ืขื ื˜ืคืขืจ.

ื“ื™ ืกืขืจื•ื•ื™ืก ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ื– ื“ื™ืกืงืจื™ื™ื‘ื“ ื“ื•ืจืš ื“ื™ ื“ื™ื ืกื˜ ื ืึธืžืขืŸ, ืคึผืึธืจืฅ ืื•ืŸ ื“ื™ืคึผืขื ื“ืึทื ืกื™ื–. ื“ื™ ืขืœืขืžืขื ื˜ืŸ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืจืขืคึผืจื™ื–ืขื ื˜ื™ื“ ืื™ืŸ ืกืงืึทืœืึท ืื™ืŸ ืขื˜ืœืขื›ืข ื•ื•ืขื’ืŸ (ืœืžืฉืœ, HList-s, ืึทืœื’ืขื‘ืจืึทื™ืง ื“ืึทื˜ืŸ ื˜ื™ื™ืคึผืก). ืคึฟืึทืจ ื“ื™ ืฆื•ื•ืขืงืŸ ืคื•ืŸ ื“ืขื ืคึผืึธืกื˜ืŸ, ืžื™ืจ ื•ื•ืขืœืŸ ื ื•ืฆืŸ ื“ื™ ืฉื˜ื™ืงืœ ืžื•ืกื˜ืขืจ ืื•ืŸ ืคืึธืจืฉื˜ืขืœืŸ ืžืึทื“ื–ืฉื•ืœื– ื ื™ืฆืŸ trait'ืึธื•ื•. (ื“ื™ ืฉื˜ื™ืงืœ ืžื•ืกื˜ืขืจ ืื™ื– ื ื™ืฉื˜ ืึท ืคืืจืœืื ื’ื˜ ืขืœืขืžืขื ื˜ ืคื•ืŸ ื“ืขื ืฆื•ื’ืึทื ื’. ืขืก ืื™ื– ืคืฉื•ื˜ ืื™ื™ืŸ ืžืขื’ืœืขืš ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ.)

ื“ื™ืคึผืขื ื“ืึทื ืกื™ื– ืฆื•ื•ื™ืฉืŸ ืกืขืจื•ื•ื™ืกืขืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืจืขืคึผืจื™ื–ืขื ื˜ื™ื“ ื•ื•ื™ ืžืขื˜ื”ืึธื“ืก ื•ื•ืึธืก ืฆื•ืจื™ืงืงื•ืžืขืŸ ืคึผืึธืจืฅ EndPointืก ืคื•ืŸ ืื ื“ืขืจืข ื ืึธื•ื“ื–:

  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)
  }

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

ืื™ืŸ ื“ืขืจ ืงืœื™ืขื ื˜ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืžื™ืจ ื“ืขืจืงืœืขืจืŸ ืึท ื“ืขืคึผืขื ื“ืขื ืกื™ ืื•ื™ืฃ ื“ื™ ืขืงืึธื• ื“ื™ื ืกื˜:

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

ื“ื™ ื“ืขืคึผืขื ื“ืขื ืกื™ ืื™ื– ืคื•ืŸ ื“ื™ ื–ืขืœื‘ืข ื˜ื™ืคึผ ื•ื•ื™ ื“ื™ ื™ืงืกืคึผืึธืจื˜ืึทื“ ื“ื™ื ืกื˜ echoService. ืื™ืŸ ื‘ืึทื–ื•ื ื“ืขืจ, ืื™ืŸ ื“ื™ ืขืงืึธื• ืงืœื™ืขื ื˜ ืžื™ืจ ื“ืึทืจืคืŸ ื“ื™ ื–ืขืœื‘ืข ืคึผืจืึธื˜ืึธืงืึธืœ. ื“ืขืจื™ื‘ืขืจ, ื•ื•ืขืŸ ืงืึทื ืขืงื˜ื™ื ื’ ืฆื•ื•ื™ื™ ื‘ืึทื“ื™ื ื•ื ื’ืก, ืžื™ืจ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื–ื™ื›ืขืจ ืึทื– ืึทืœืฅ ื•ื•ืขื˜ ืึทืจื‘ืขื˜ืŸ ืจื™ื›ื˜ื™ืง.

ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ื‘ืึทื“ื™ื ื•ื ื’ืขืŸ

ื ืคึฟื•ื ืงืฆื™ืข ืื™ื– ืคืืจืœืื ื’ื˜ ืฆื• ืึธื ื”ื™ื™ื‘ืŸ ืื•ืŸ ื”ืึทืœื˜ืŸ ื“ื™ ื“ื™ื ืกื˜. (ื“ื™ ืคื™ื™ื™ืงื™ื™ื˜ ืฆื• ื”ืึทืœื˜ืŸ ืึท ื“ื™ื ืกื˜ ืื™ื– ืงืจื™ื˜ื™ืฉ ืคึฟืึทืจ ื˜ืขืกื˜ื™ื ื’.) ื•ื•ื™ื“ืขืจ, ืขืก ื–ืขื ืขืŸ ืขื˜ืœืขื›ืข ืึธืคึผืฆื™ืขืก ืคึฟืึทืจ ื™ืžืคึผืœืึทืžืขื ื™ื ื’ ืึทื–ืึท ืึท ืฉื˜ืจื™ืš (ืœืžืฉืœ, ืžื™ืจ ืงืขืŸ ื ื•ืฆืŸ ื˜ื™ืคึผ ืงืœืืกืŸ ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื˜ื™ืคึผ). ืคึฟืึทืจ ื“ื™ ืฆื•ื•ืขืงืŸ ืคื•ืŸ ื“ืขื ืคึผืึธืกื˜ืŸ, ืžื™ืจ ื•ื•ืขืœืŸ ื ื•ืฆืŸ ื“ื™ ืฉื˜ื™ืงืœ ืžื•ืกื˜ืขืจ. ืžื™ืจ ื•ื•ืขืœืŸ ืคืึธืจืฉื˜ืขืœืŸ ื“ื™ ื“ื™ื ืกื˜ ื ื™ืฆืŸ ืึท ืงืœืึทืก 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 - ืึทืŸ ื•ื•ื™ืจืงื•ื ื’ ื˜ื™ืคึผ ืงืœืึทืก ื•ื•ืึธืก ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืคืึทืจื‘ื™ื ื“ืŸ ื™ื—ื™ื“ ื™ืคืขืงืฅ (ื›ึผืžืขื˜ ืึท ืžืึธื ืึทื“). ืื™ืŸ ืžืขืจ ืงืึธืžืคึผืœื™ืฆื™ืจื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืขืก ืžื™ื™ื ื˜ ื‘ืขืกืขืจ ืฆื• ื ื•ืฆืŸ Monad/ConcurrentEffect.

ื ื™ืฆืŸ ื“ืขื ืคึฟื•ื ืงืฆื™ืข ื›ืกื™ืžืข, ืžื™ืจ ืงืขื ืขืŸ ื™ื ืกื˜ืจื•ืžืขื ื˜ ืขื˜ืœืขื›ืข ื‘ืึทื“ื™ื ื•ื ื’ืก. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืึท ื“ื™ื ืกื˜ ื•ื•ืึธืก ื˜ื•ื˜ ื’ืึธืจื ื™ืฉื˜:

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

(ืกืขื ื˜ื™ืžืขื˜ืขืจ. ืžืงื•ืจ, ืื™ืŸ ื•ื•ืึธืก ืื ื“ืขืจืข ื‘ืึทื“ื™ื ื•ื ื’ืก ื–ืขื ืขืŸ ื™ืžืคึผืœืึทืžืขื ืึทื“ - ื•ื•ื™ื“ืขืจืงืึธืœ ื“ื™ื ืกื˜, ื•ื•ื™ื“ืขืจืงืึธืœ ืงืœื™ืขื ื˜
ะธ ืœืขื‘ืŸ ืงืึทื ื˜ืจืึธื•ืœืขืจื–.)

ื ื ืึธื“ืข ืื™ื– ืึท ื›ื™ื™ืคืขืฅ ื•ื•ืึธืก ืงืขื ืขืŸ ืงืึทื˜ืขืจ ืขื˜ืœืขื›ืข ื‘ืึทื“ื™ื ื•ื ื’ืก (ื“ื™ ืงืึทื˜ืขืจ ืคื•ืŸ ืึท ืงื™ื™ื˜ ืคื•ืŸ ืจืขืกื•ืจืกืŸ ืื™ื– ื™ื ืฉื•ืจื“ ื“ื•ืจืš ื“ื™ ืฉื˜ื™ืงืœ ืžื•ืกื˜ืขืจ):

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

ื‘ื™ื˜ืข ื˜ืึธืŸ ืึทื– ืžื™ืจ ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ื“ื™ ืคึผื™ื ื˜ืœืขืš ื˜ื™ืคึผ ืคื•ืŸ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื•ื•ืึธืก ืื™ื– ืคืืจืœืื ื’ื˜ ืคึฟืึทืจ ื“ืขื ื ืึธื“ืข. ืื•ื™ื‘ ืžื™ืจ ืคืึทืจื’ืขืกืŸ ืฆื• ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื˜ื™ื™ืคึผืก ืคืืจืœืื ื’ื˜ ื“ื•ืจืš ืึท ื‘ืึทื–ื•ื ื“ืขืจ ื“ื™ื ืกื˜, ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืึท ื–ืึทืžืœื•ื ื’ ื˜ืขื•ืช. ืื•ื™ืš, ืžื™ืจ ื•ื•ืขืœืŸ ื ื™ืฉื˜ ืงืขื ืขืŸ ืฆื• ืึธื ื”ื™ื™ื‘ืŸ ืึท ื ืึธื“ืข ืกื™ื™ึทื“ืŸ ืžื™ืจ ืฆื•ืฉื˜ืขืœืŸ ืขื˜ืœืขื›ืข ื›ื™ื™ืคืขืฅ ืคื•ืŸ ื“ื™ ืฆื•ื ืขืžืขืŸ ื˜ื™ืคึผ ืžื™ื˜ ืึทืœืข ื“ื™ ื ื™ื™ื˜ื™ืง ื“ืึทื˜ืŸ.

ื”ืึธืกื˜ ื ืึธืžืขืŸ ืจืขืกืึธืœื•ื˜ื™ืึธืŸ

ืฆื• ืคืึทืจื‘ื™ื ื“ืŸ ืฆื• ืึท ื•ื•ื™ื™ึทื˜ ื‘ืึทืœืขื‘ืึธืก, ืžื™ืจ ื“ืึทืจืคึฟืŸ ืึท ืคืึทืงื˜ื™ืฉ IP ืึทื“ืจืขืก. ืขืก ืื™ื– ืžืขื’ืœืขืš ืึทื– ื“ื™ ืึทื“ืจืขืก ื•ื•ืขื˜ ื•ื•ืขืจืŸ ื‘ืืงืื ื˜ ืฉืคึผืขื˜ืขืจ ื•ื•ื™ ื“ื™ ืจืขืฉื˜ ืคื•ืŸ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ. ืึทื–ื•ื™ ืžื™ืจ ื“ืึทืจืคึฟืŸ ืึท ืคึฟื•ื ืงืฆื™ืข ื•ื•ืึธืก ืžืึทืคึผืก ื“ื™ ื ืึธื“ืข ืฉื™ื™ึทืŸ ืฆื• ืึทืŸ ืึทื“ืจืขืก:

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

ืขืก ื–ืขื ืขืŸ ืขื˜ืœืขื›ืข ื•ื•ืขื’ืŸ ืฆื• ื™ื ืกื˜ืจื•ืžืขื ื˜ ื“ืขื ืคึฟื•ื ืงืฆื™ืข:

  1. ืื•ื™ื‘ ื“ื™ ื•ื•ืขื ื“ื˜ ื•ื•ืขืจืŸ ื‘ืืงืื ื˜ ืฆื• ืื•ื ื“ื– ืื™ื™ื“ืขืจ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜, ืžื™ืจ ืงืขื ืขืŸ ื“ื–ืฉืขื ืขืจื™ื™ื˜ ืกืงืึทืœืึท ืงืึธื“ ืžื™ื˜
    ืึทื“ืจืขืกื– ืื•ืŸ ื“ืขืžืึธืœื˜ ืœื•ื™ืคืŸ ื“ื™ ื‘ื•ื™ืขืŸ. ื“ืึธืก ื•ื•ืขื˜ ืฆื•ื ื•ื™ืคื ืขืžืขืŸ ืื•ืŸ ืœื•ื™ืคืŸ ื˜ืขืกืฅ.
    ืื™ืŸ ื“ืขื ืคืึทืœ, ื“ื™ ืคึฟื•ื ืงืฆื™ืข ื•ื•ืขื˜ ื–ื™ื™ืŸ ืกื˜ืึทื˜ื™ืงืœื™ ื‘ืึทื•ื•ื•ืกื˜ ืื•ืŸ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืจืขืคึผืจื™ื–ืขื ื˜ื™ื“ ืื™ืŸ ืงืึธื“ ื•ื•ื™ ืึท ืžืึทืคึผื™ื ื’ 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 ืคืึทืจืขื ื“ื™ืงืŸ ื“ืขื ืคึผืจืึธื’ืจืึทื. (Ctrl-C ืื•ื™ืš ืึทืจื‘ืขื˜ ืื•ืŸ ืคืจื™ื™ ืึทืœืข ืจืขืกื•ืจืกืŸ ืจื™ื›ื˜ื™ืง.)

ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ื’ืึทื ื’ ืคื•ืŸ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื•ืŸ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ื˜ืจื™ื™ืฅ ืงืขื ืขืŸ ื•ื•ืขืจืŸ ื’ืขื ื•ืฆื˜ ืฆื• ืฉืึทืคึฟืŸ ืึท ืกื™ืกื˜ืขื ืงืึทื ืกื™ืกื˜ื™ื ื’ ืคื•ืŸ ืฆื•ื•ื™ื™ ื‘ืึทื–ื•ื ื“ืขืจ ื ืึธื•ื“ื–:

ืฆื•ื•ื™ื™ ื ืึธื“ืข ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ

  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'ืึธื, ืื•ืŸ ื“ืขืจ ืงืœื™ืขื ื˜ ื ืึธื“ืข ื˜ืขืจืžืึทื ื™ื™ืฅ ื ืึธืš ืขื˜ืœืขื›ืข ืžืึธืœ. ืกืขื ื˜ื™ืžืขื˜ืขืจ. ืœืึธื ื˜ืฉืขืจ ืึทืคึผ.

ืึทืœื’ืขืžื™ื™ื ืข ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืคึผืจืึธืฆืขืก

ื–ืืœ ืก ื–ืขืŸ ื•ื•ื™ ื“ืขื ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืฆื•ื’ืึทื ื’ ืึทืคืขืงืฅ ื“ื™ ืงื•ื™ืœืขืœื“ื™ืง ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืคึผืจืึธืฆืขืก.

ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืงืึทืžืคึผื™ื™ืœื“ ืฆื•ื–ืืžืขืŸ ืžื™ื˜ ื“ื™ ืจืขืฉื˜ ืคื•ืŸ ื“ื™ ืงืึธื“ ืื•ืŸ ืึท ืึทืจื˜ืึทืคืึทืงื˜ (.ื“ื–ืฉืึทืจ) ื•ื•ืขื˜ ื–ื™ื™ืŸ ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“. ืขืก ืžื™ื™ื ื˜ ืฆื• ืžืึทื›ืŸ ื–ื™ื ืขืŸ ืฆื• ืฉื˜ืขืœืŸ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ืŸ ืึท ื‘ืึทื–ื•ื ื“ืขืจ ืึทืจื˜ื™ืคืึทืงื˜. ื“ืึธืก ืื™ื– ื•ื•ื™ื™ึทืœ ืžื™ืจ ืงืขื ืขืŸ ื”ืึธื‘ืŸ ืงื™ื™ืคืœ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทื ื– ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืงืึธื“. ื•ื•ื™ื“ืขืจ, ืขืก ืื™ื– ืžืขื’ืœืขืš ืฆื• ื“ื–ืฉืขื ืขืจื™ื™ื˜ ืึทืจื˜ืึทืคืึทืงืฅ ืงืึธืจืึทืกืคึผืึทื ื“ื™ื ื’ ืฆื• ืคืึทืจืฉื™ื“ืขื ืข ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืฆื•ื•ื™ื™ื’ืŸ. ืึธืคืขื ื’ื™ืงื™ื™ึทื˜ ืื•ื™ืฃ ืกืคึผืขืฆื™ืคื™ืฉ ื•ื•ืขืจืกื™ืขืก ืคื•ืŸ ืœื™ื™ื‘ืจืขืจื™ื– ื–ืขื ืขืŸ ื’ืขืจืื˜ืขื•ื•ืขื˜ ืฆื•ื–ืืžืขืŸ ืžื™ื˜ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ, ืื•ืŸ ื“ื™ ื•ื•ืขืจืกื™ืขืก ื–ืขื ืขืŸ ื’ืขืจืื˜ืขื•ื•ืขื˜ ืื•ื™ืฃ ืื™ื™ื‘ื™ืง ื•ื•ืขืŸ ืžื™ืจ ื‘ืึทืฉืœื™ืกืŸ ืฆื• ืฆืขื•ื•ื™ืงืœืขืŸ ื“ื™ ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ.

ืงื™ื™ืŸ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื˜ื•ื™ืฉืŸ ื˜ื•ืจื ืก ืื™ืŸ ืึท ืงืึธื“ ื˜ื•ื™ืฉืŸ. ืื•ืŸ ื“ืขืจื™ื‘ืขืจ, ื™ืขื“ืขืจ
ื“ื™ ืขื ื“ืขืจื•ื ื’ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื‘ืื“ืขืงื˜ ื“ื•ืจืš ื“ื™ ื ืึธืจืžืึทืœ ืงื•ื•ืึทืœื™ื˜ืขื˜ ืคืืจื–ื™ื›ืขืจื•ื ื’ ืคึผืจืึธืฆืขืก:

ื‘ื™ืœืขื˜ ืื™ืŸ ื“ื™ ื–ืฉื•ืง ื˜ืจืึทืงืขืจ -> ืคึผืจ -> ืึธืคึผืฉืึทืฆื•ื ื’ -> ืฆื•ื ื•ื™ืคื’ื™ืกืŸ ืžื™ื˜ ื‘ืึทื˜ื™ื™ึทื˜ื™ืง ืฆื•ื•ื™ื™ื’ืŸ ->
ื™ื ืึทื’ืจื™ื™ืฉืึทืŸ -> ื“ื™ืคึผืœื•ื™ืžืึทื ื˜

ื“ื™ ื”ื•ื™ืคึผื˜ ืงืึทื ืกืึทืงื•ื•ืขื ืกืึทื– ืคื•ืŸ ื™ืžืคึผืœืึทืžืขื ื™ื ื’ ืึท ืงืึทืžืคึผื™ื™ืœื“ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื–ืขื ืขืŸ:

  1. ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืงืึธื ืกื™ืกื˜ืขื ื˜ ืื™ืŸ ืึทืœืข ื ืึธื•ื“ื– ืคื•ืŸ ื“ื™ ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜ ืกื™ืกื˜ืขื. ืจืขื›ื˜ ืฆื• ื“ืขื ืคืึทืงื˜ ืึทื– ืึทืœืข ื ืึธื•ื“ื– ื‘ืึทืงื•ืžืขืŸ ื“ื™ ื–ืขืœื‘ืข ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืคื•ืŸ ืึท ืื™ื™ืŸ ืžืงื•ืจ.

  2. ืขืก ืื™ื– ืคึผืจืึธื‘ืœืขืžืึทื˜ื™ืง ืฆื• ื˜ื•ื™ืฉืŸ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ืŸ ื‘ืœื•ื™ื– ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ื ืึธื•ื“ื–. ื“ืขืจื™ื‘ืขืจ, "ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื“ืจื™ืคื˜" ืื™ื– ืึทื ืœื™ื™ืงืœื™.

  3. ืขืก ื•ื•ืขืจื˜ ืžืขืจ ืฉื•ื•ืขืจ ืฆื• ืžืึทื›ืŸ ืงืœื™ื™ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ืฆื• ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ.

  4. ืจื•ื‘ึฟ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ื•ื•ืขื˜ ืคึผืึทืกื™ืจืŸ ื•ื•ื™ ืึท ื˜ื™ื™ืœ ืคื•ืŸ ื“ื™ ืงื•ื™ืœืขืœื“ื™ืง ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืคึผืจืึธืฆืขืก ืื•ืŸ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืื•ื ื˜ืขืจื˜ืขื ื™ืง ืฆื• ืึธืคึผืฉืึทืฆื•ื ื’.

ืฆื™ ืื™ืš ื“ืึทืจืคึฟืŸ ืึท ื‘ืึทื–ื•ื ื“ืขืจ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ ืฆื• ืงืจืึธื ื“ื™ ืคึผืจืึธื“ื•ืงืฆื™ืข ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ? ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืงืขืŸ ืึทื ื˜ื”ืึทืœื˜ืŸ ืคึผืึทืกื•ื•ืขืจื“ื– ืื•ืŸ ืื ื“ืขืจืข ืฉืคึผื™ืจืขื•ื•ื“ื™ืง ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืฆื• ื•ื•ืึธืก ืžื™ืจ ื•ื•ืึธืœื˜ ื•ื•ื™ ืฆื• ื‘ืึทื’ืจืขื ืขืฆืŸ ืึทืงืกืขืก. ื‘ืึทื–ื™ืจื˜ ืื•ื™ืฃ ื“ืขื, ืขืก ืžื™ื™ื ื˜ ืฆื• ืžืึทื›ืŸ ื–ื™ื ืขืŸ ืฆื• ืงืจืึธื ื“ื™ ืœืขืฆื˜ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ืŸ ืึท ื‘ืึทื–ื•ื ื“ืขืจ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™. ืื™ืจ ืงืขื ืขืŸ ืฉืคึผืึทืœื˜ืŸ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ืŸ ืฆื•ื•ื™ื™ ืคึผืึทืจืฅ - ืื™ื™ื ืขืจ ืžื™ื˜ ืขืคื ื˜ืœืขืš ืฆื•ื˜ืจื™ื˜ืœืขืš ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืกืขื˜ื˜ื™ื ื’ืก ืื•ืŸ ืื™ื™ื ืขืจ ืžื™ื˜ ืœื™ืžื™ื˜ืขื“ ืกืขื˜ื˜ื™ื ื’ืก. ื“ืึธืก ื•ื•ืขื˜ ืœืึธื–ืŸ ืจื•ื‘ึฟ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ืฆื• ื”ืึธื‘ืŸ ืึทืงืกืขืก ืฆื• ืคึผืจืึธืกื˜ ืกืขื˜ื˜ื™ื ื’ืก. ื“ืขื ืฆืขืฉื™ื™ื“ื•ื ื’ ืื™ื– ื’ืจื™ื ื’ ืฆื• ื“ืขืจื’ืจื™ื™ื›ืŸ ืžื™ื˜ ื™ื ื˜ืขืจืžื™ื“ื™ื™ื˜ ื˜ืจื™ื™ืฅ ืžื™ื˜ ืคืขืœื™ืงื™ื™ึทื˜ ื•ื•ืึทืœื•ืขืก.

ืžืขื’ืœืขืš ื•ื•ืขืจื™ื™ื™ืฉืึทื ื–

ืœืึธืžื™ืจ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืคืึทืจื’ืœื™ื™ึทื›ืŸ ื“ื™ ืงืึทืžืคึผื™ื™ืœื“ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืžื™ื˜ ืขื˜ืœืขื›ืข ืคึผืจืึธืกื˜ ืึทืœื˜ืขืจื ืึทื˜ื™ื•ื•ืขืก:

  1. ื˜ืขืงืกื˜ ื˜ืขืงืข ืื•ื™ืฃ ื“ื™ ืฆื™ืœ ืžืึทืฉื™ืŸ.
  2. ืกืขื ื˜ืจืึทืœื™ื™ื–ื“ ืฉืœื™ืกืœ-ื•ื•ืขืจื˜ ืงืจืึธื (etcd/zookeeper).
  3. ืคึผืจืึธืฆืขืก ืงืึทืžืคึผืึธื•ื ืึทื ืฅ ื•ื•ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืจื™ืงืึทื ืคื™ื’ื™ืขืจื“ / ืจื™ืกื˜ืึทืจื˜ื™ื“ ืึธืŸ ืจื™ืกื˜ืึทืจื˜ื™ื ื’ ื“ืขื ืคึผืจืึธืฆืขืก.
  4. ืกื˜ืึธืจื™ื ื’ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืึทืจื•ื™ืก ืคื•ืŸ ืึทืจื˜ืึทืคืึทืงื˜ ืื•ืŸ ื•ื•ืขืจืกื™ืข ืงืึธื ื˜ืจืึธืœ.

ื˜ืขืงืกื˜ ื˜ืขืงืขืก ืฆื•ืฉื˜ืขืœืŸ ื‘ืึทื˜ื™ื™ึทื˜ื™ืง ื‘ื™ื™ื’ื™ืงื™ื™ึทื˜ ืื™ืŸ ื˜ืขืจืžื™ื ืขืŸ ืคื•ืŸ ืงืœื™ื™ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ. ื“ืขืจ ืกื™ืกื˜ืขื ืึทื“ืžื™ื ื™ืกื˜ืจืึทื˜ืึธืจ ืงืขื ืขืŸ ืงืœืึธืฅ ืื™ืŸ ื“ื™ ื•ื•ื™ื™ึทื˜ ื ืึธื“ืข, ืžืึทื›ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ืฆื• ื“ื™ ืฆื•ื ืขืžืขืŸ ื˜ืขืงืขืก ืื•ืŸ ืจื™ืกื˜ืึทืจื˜ ื“ื™ ื“ื™ื ืกื˜. ืคึฟืึทืจ ื’ืจื•ื™ืก ืกื™ืกื˜ืขืžืขืŸ, ืึธื‘ืขืจ, ืึทื–ืึท ื‘ื™ื™ื’ื™ืงื™ื™ึทื˜ ืงืขืŸ ื ื™ืฉื˜ ื–ื™ื™ืŸ ื“ื™ื–ื™ื™ืขืจืึทื‘ืึทืœ. ื“ื™ ืขื ื“ืขืจื•ื ื’ืขืŸ ื•ื•ืึธืก ื–ืขื ืขืŸ ื’ืขืžืื›ื˜ ืœืึธื–ืŸ ืงื™ื™ืŸ ืฉืคึผื•ืจ ืื™ืŸ ืื ื“ืขืจืข ืกื™ืกื˜ืขืžืขืŸ. ืงื™ื™ืŸ ืื™ื™ื ืขืจ ืจืขืฆืขื ื–ื™ืขืก ื“ื™ ืขื ื“ืขืจื•ื ื’ืขืŸ. ืขืก ืื™ื– ืฉื•ื•ืขืจ ืฆื• ื‘ืึทืฉืœื™ืกืŸ ื•ื•ืขืจ ืคึผื•ื ืงื˜ ื’ืขืžืื›ื˜ ื“ื™ ืขื ื“ืขืจื•ื ื’ืขืŸ ืื•ืŸ ืคึฟืึทืจ ื•ื•ืึธืก ืกื™ื‘ื”. ืขื ื“ืขืจื•ื ื’ืขืŸ ื–ืขื ืขืŸ ื ื™ืฉื˜ ื˜ืขืกื˜ืขื“. ืื•ื™ื‘ ื“ื™ ืกื™ืกื˜ืขื ืื™ื– ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜, ื“ืขืจ ืึทื“ืžื™ื ื™ืกื˜ืจืึทื˜ืึธืจ ืงืขืŸ ืคืึทืจื’ืขืกืŸ ืฆื• ืžืึทื›ืŸ ื“ื™ ืงืึธืจืึทืกืคึผืึทื ื“ื™ื ื’ ืขื ื“ืขืจื•ื ื’ ืื•ื™ืฃ ืื ื“ืขืจืข ื ืึธื•ื“ื–.

(ืขืก ื–ืึธืœ ืื•ื™ืš ื–ื™ื™ืŸ ื‘ืืžืขืจืงื˜ ืึทื– ื ื™ืฆืŸ ืึท ืงืึทืžืคึผื™ื™ืœื“ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื˜ื•ื˜ ื ื™ืฉื˜ ืคืึทืจืžืึทื›ืŸ ื“ื™ ืžืขื’ืœืขื›ืงื™ื™ื˜ ืคื•ืŸ ื ื™ืฆืŸ ื˜ืขืงืกื˜ ื˜ืขืงืขืก ืื™ืŸ ื“ืขืจ ืฆื•ืงื•ื ืคึฟื˜. ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขื ื•ื’ ืฆื• ืœื™ื™ื’ืŸ ืึท ืคึผืึทืจืกืขืจ ืื•ืŸ ื•ื•ืึทืœื™ื“ืึทื˜ืึธืจ ื•ื•ืึธืก ืคึผืจืึธื“ื•ืฆื™ืจืŸ ื“ื™ ื–ืขืœื‘ืข ื˜ื™ืคึผ ื•ื•ื™ ืจืขื–ื•ืœื˜ืึทื˜ Config, ืื•ืŸ ืื™ืจ ืงืขื ืขืŸ ื ื•ืฆืŸ ื˜ืขืงืกื˜ ื˜ืขืงืขืก. ืขืก ื’ืœื™ื™ืš ื’ื™ื™ื˜ ืึทื– ื“ื™ ืงืึทืžืคึผืœืขืงืกื™ื˜ื™ ืคื•ืŸ ืึท ืกื™ืกื˜ืขื ืžื™ื˜ ืึท ืงืึทืžืคึผื™ื™ืœื“ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ื– ืึท ื‘ื™ืกืœ ื•ื•ื™ื™ื ื™ืงืขืจ ื•ื•ื™ ื“ื™ ืงืึทืžืคึผืœืขืงืกื™ื˜ื™ ืคื•ืŸ ืึท ืกื™ืกื˜ืขื ื ื™ืฆืŸ ื˜ืขืงืกื˜ ื˜ืขืงืขืก, ื•ื•ื™ื™ึทืœ ื˜ืขืงืกื˜ ื˜ืขืงืขืก ื“ืึทืจืคืŸ ื ืึธืš ืงืึธื“.)

ื ืกืขื ื˜ืจืึทืœื™ื™ื–ื“ ืฉืœื™ืกืœ-ื•ื•ืขืจื˜ ืงืจืึธื ืื™ื– ืึท ื’ื•ื˜ ืžืขืงืึทื ื™ื–ืึทื ืคึฟืึทืจ ื“ื™ืกื˜ืจื™ื‘ื™ื•ื˜ื™ื ื’ ืžืขื˜ืึท ืคึผืึทืจืึทืžืขื˜ืขืจืก ืคื•ืŸ ืึท ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ. ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื‘ืึทืฉืœื™ืกืŸ ื•ื•ืึธืก ื–ืขื ืขืŸ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืคึผืึทืจืึทืžืขื˜ืขืจืก ืื•ืŸ ื•ื•ืึธืก ื–ืขื ืขืŸ ื ืึธืจ ื“ืึทื˜ืŸ. ื–ืืœ ืื•ื ื“ื– ื”ืึธื‘ืŸ ืึท ืคึฟื•ื ืงืฆื™ืข C => A => B, ืื•ืŸ ื“ื™ ืคึผืึทืจืึทืžืขื˜ืขืจืก C ืจืึทืจืขืœื™ ืขื ื“ืขืจื•ื ื’ืขืŸ, ืื•ืŸ ื“ืึทื˜ืŸ A - ืึธืคื˜. ืื™ืŸ ื“ืขื ืคืึทืœ ืžื™ืจ ืงืขื ืขืŸ ื–ืึธื’ืŸ ืึทื– C - ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืคึผืึทืจืึทืžืขื˜ืขืจืก, ืื•ืŸ A - ื“ืึทื˜ืŸ. ืขืก ืื•ื™ืก ืึทื– ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืคึผืึทืจืึทืžืขื˜ืขืจืก ืึทื ื“ืขืจืฉ ืคื•ืŸ ื“ืึทื˜ืŸ ืื™ืŸ ืึทื– ื–ื™ื™ ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ื˜ื•ื™ืฉืŸ ื•ื•ื™ื™ื ื™ืงืขืจ ืึธืคื˜ ื•ื•ื™ ื“ืึทื˜ืŸ. ืื•ื™ืš, ื“ืึทื˜ืŸ ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ืงื•ืžืขืŸ ืคื•ืŸ ืื™ื™ืŸ ืžืงื•ืจ (ืคื•ืŸ ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ), ืื•ืŸ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืคึผืึทืจืึทืžืขื˜ืขืจืก ืคื•ืŸ ืื ื“ืขืจืŸ (ืคื•ืŸ ื“ื™ ืกื™ืกื˜ืขื ืึทื“ืžื™ื ื™ืกื˜ืจืึทื˜ืึธืจ).

ืื•ื™ื‘ ืจืึทืจืขืœื™ ื˜ืฉืึทื ื’ื™ื ื’ ืคึผืึทืจืึทืžืขื˜ืขืจืก ื“ืึทืจืคึฟืŸ ืฆื• ื–ื™ื™ืŸ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงื˜ ืึธืŸ ืจื™ืกื˜ืึทืจื˜ื™ื ื’ ื“ื™ ืคึผืจืึธื’ืจืึทื, ื“ืึธืก ืงืขืŸ ืึธืคื˜ ืคื™ืจืŸ ืฆื• ื“ื™ ืงืึทืžืคึผืœืึทืงื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ื™ ืคึผืจืึธื’ืจืึทื, ื•ื•ื™ื™ึทืœ ืžื™ืจ ื•ื•ืขืœืŸ ืขืคืขืก ืฆื•ืฉื˜ืขืœืŸ ืคึผืึทืจืึทืžืขื˜ืขืจืก, ืงืจืึธื, ืคึผืึทืจืก ืื•ืŸ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืื•ืŸ ืคึผืจืึธืฆืขืก ืคืึทืœืฉ ื•ื•ืึทืœื•ืขืก. ื“ืขืจื™ื‘ืขืจ, ืคึฟื•ืŸ ื“ื™ ืคื•ื ื˜ ืคื•ืŸ ืžื™ื™ื ื•ื ื’ ืคื•ืŸ ืจื™ื“ื•ืกื™ื ื’ ื“ื™ ืงืึทืžืคึผืœืขืงืกื™ื˜ื™ ืคื•ืŸ ื“ื™ ืคึผืจืึธื’ืจืึทื, ืขืก ืื™ื– ื–ื™ื ืขืŸ ืฆื• ืจืขื“ื•ืฆื™ืจืŸ ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ืคึผืึทืจืึทืžืขื˜ืขืจืก ื•ื•ืึธืก ืงืขื ืขืŸ ื˜ื•ื™ืฉืŸ ื‘ืขืฉืึทืก ืคึผืจืึธื’ืจืึทื ืึธืคึผืขืจืึทืฆื™ืข (ืึธื“ืขืจ ื ื™ื˜ ืฉื˜ื™ืฆืŸ ืึทื–ืึท ืคึผืึทืจืึทืžืขื˜ืขืจืก ื‘ื™ื™ึท ืึทืœืข).

ืคึฟืึทืจ ื“ื™ ืฆื•ื•ืขืงืŸ ืคื•ืŸ ื“ืขื ืคึผืึธืกื˜ืŸ, ืžื™ืจ ื•ื•ืขืœืŸ ื“ื™ืคืขืจืขื ืฉื™ื™ื™ื˜ ืฆื•ื•ื™ืฉืŸ ืกื˜ืึทื˜ื™ืง ืื•ืŸ ื“ื™ื ืึทืžื™ืฉ ืคึผืึทืจืึทืžืขื˜ืขืจืก. ืื•ื™ื‘ ื“ื™ ืœืึธื’ื™ืง ืคื•ืŸ ื“ื™ ื“ื™ื ืกื˜ ืจื™ืงื•ื•ื™ื™ืขืจื– ื˜ืฉืึทื ื’ื™ื ื’ ืคึผืึทืจืึทืžืขื˜ืขืจืก ื‘ืขืฉืึทืก ื“ื™ ืึธืคึผืขืจืึทืฆื™ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืคึผืจืึธื’ืจืึทื, ืžื™ืจ ื•ื•ืขืœืŸ ืจื•ืคืŸ ืึทื–ืึท ืคึผืึทืจืึทืžืขื˜ืขืจืก ื“ื™ื ืึทืžื™ืฉ. ืึทื ื“ืขืจืฉ ื“ื™ ืึธืคึผืฆื™ืขืก ื–ืขื ืขืŸ ืกื˜ืึทื˜ื™ืง ืื•ืŸ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืงืึทื ืคื™ื’ื™ืขืจื“ ืžื™ื˜ ื“ื™ ืงืึทืžืคึผื™ื™ืœื“ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ. ืคึฟืึทืจ ื“ื™ื ืึทืžื™ืฉ ืจื™ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ, ืžื™ืจ ืงืขืŸ ื“ืึทืจืคึฟืŸ ืึท ืžืขืงืึทื ื™ื–ืึทื ืฆื• ืจื™ืกื˜ืึทืจื˜ ืคึผืึทืจืฅ ืคื•ืŸ ื“ืขื ืคึผืจืึธื’ืจืึทื ืžื™ื˜ ื ื™ื™ึทืข ืคึผืึทืจืึทืžืขื˜ืขืจืก, ืขื ืœืขืš ืฆื• ื•ื•ื™ ื“ื™ ืคึผืจืึทืกืขืกืึทื– ืคื•ืŸ ื“ื™ ืึธืคึผืขืจื™ื™ื˜ื™ื ื’ ืกื™ืกื˜ืขื ื–ืขื ืขืŸ ืจื™ืกื˜ืึทืจื˜ื™ื“. (ืื™ืŸ ืื•ื ื“ื–ืขืจ ืžื™ื™ื ื•ื ื’, ืขืก ืื™ื– ืงืขื“ื™ื™ึทื™ืง ืฆื• ื•ื™ืกืžื™ื™ื“ืŸ ืคืึทืงื˜ื™ืฉ-ืฆื™ื™ื˜ ืจื™ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ, ื•ื•ื™ื™ึทืœ ื“ืึธืก ื™ื ืงืจื™ืกื™ื– ื“ื™ ืงืึทืžืคึผืœืขืงืกื™ื˜ื™ ืคื•ืŸ ื“ื™ ืกื™ืกื˜ืขื. ืื•ื™ื‘ ืžืขื’ืœืขืš, ืขืก ืื™ื– ื‘ืขืกืขืจ ืฆื• ื ื•ืฆืŸ ื“ื™ ื ืึธืจืžืึทืœ ืึทืก ืงื™ื™ืคึผืึทื‘ื™ืœืึทื˜ื™ื– ืคึฟืึทืจ ืจื™ืกื˜ืึทืจื˜ื™ื ื’ ืคึผืจืึทืกืขืกืึทื–.)

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

ื–ืืœ ืื•ื ื“ื– ืื™ืฆื˜ ื‘ืึทื˜ืจืึทื›ื˜ืŸ ื“ื™ ืึทืจื•ื™ืกื’ืขื‘ืŸ ืคื•ืŸ ืกื˜ืึธืจื™ื ื’ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื™ืŸ ืึธื“ืขืจ ืึทืจื•ื™ืก ื“ื™ ืึทืจื˜ืึทืคืึทืงื˜. ืื•ื™ื‘ ืžื™ืจ ืงืจืึธื ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื™ืŸ ืึท ืึทืจื˜ืึทืคืึทืงื˜, ืžื™ืจ ืื™ืŸ ืžื™ื ื“ืกื˜ืขืจ ืžื™ืจ ื”ืึธื‘ืŸ ื“ื™ ื’ืขืœืขื’ื ื”ื™ื™ื˜ ืฆื• ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื“ื™ ืจื™ื›ื˜ื™ืง ืคื•ืŸ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื‘ืขืฉืึทืก ื“ื™ ืคึฟืึทืจื–ืึทืžืœื•ื ื’ ืคื•ืŸ ื“ื™ ืึทืจื˜ืึทืคืึทืงื˜. ืื•ื™ื‘ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ื– ืึทืจื•ื™ืก ื“ื™ ืงืึทื ื˜ืจืึธื•ืœื“ ืึทืจื˜ืึทืคืึทืงื˜, ืขืก ืื™ื– ืฉื•ื•ืขืจ ืฆื• ืฉืคึผื•ืจ ื•ื•ืขืจ ื’ืขืžืื›ื˜ ืขื ื“ืขืจื•ื ื’ืขืŸ ืฆื• ื“ืขื ื˜ืขืงืข ืื•ืŸ ื•ื•ืึธืก. ื•ื•ื™ ื•ื•ื™ื›ื˜ื™ืง ืื™ื– ืขืก? ืื™ืŸ ืื•ื ื“ื–ืขืจ ืžื™ื™ื ื•ื ื’, ืคึฟืึทืจ ืคื™ืœืข ืคึผืจืึธื“ื•ืงืฆื™ืข ืกื™ืกื˜ืขืžืขืŸ ืขืก ืื™ื– ื•ื•ื™ื›ื˜ื™ืง ืฆื• ื”ืึธื‘ืŸ ืึท ืกื˜ืึทื‘ื™ืœ ืื•ืŸ ื”ื•ื™ืš-ืงื•ื•ืึทืœื™ื˜ืขื˜ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ.

ื“ื™ ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ืึท ืึทืจื˜ืึทืคืึทืงื˜ ืึทืœืึทื•ื– ืื™ืจ ืฆื• ื‘ืึทืฉืœื™ืกืŸ ื•ื•ืขืŸ ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ื‘ืืฉืืคืŸ, ื•ื•ืึธืก ื•ื•ืึทืœื•ืขืก ืขืก ื›ึผื•ืœืœ, ื•ื•ืึธืก ืคืึทื ื’ืงืฉืึทื ื– ื–ืขื ืขืŸ ืขื ื™ื™ื‘ืึทืœื“ / ืคืึทืจืงืจื™ืคึผืœื˜ ืื•ืŸ ื•ื•ืขืจ ืื™ื– ืคืึทืจืึทื ื˜ื•ื•ืึธืจื˜ืœืขืš ืคึฟืึทืจ ืงื™ื™ืŸ ืขื ื“ืขืจื•ื ื’ ืื™ืŸ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ. ืคื•ืŸ ืงื•ืจืก, ืกื˜ืึธืจื™ื ื’ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ืŸ ืึท ืึทืจื˜ืึทืคืึทืงื˜ ืจื™ืงื•ื•ื™ื™ืขืจื– ืขื˜ืœืขื›ืข ืžื™, ืึทื–ื•ื™ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืžืึทื›ืŸ ืึท ื™ื ืคืึธืจืžื“ ื‘ืึทืฉืœื•ืก.

ืคึผืจืึธืก ืื•ืŸ ืงืึธื ืก

ืื™ืš ื•ื•ืึธืœื˜ ื•ื•ื™ ืฆื• ื•ื•ื•ื™ื ืขืŸ ืื•ื™ืฃ ื“ื™ ืคึผืจืึธืก ืื•ืŸ ืงืึธื ืก ืคื•ืŸ ื“ื™ ืคืืจื’ืขืœื™ื™ื’ื˜ ื˜ืขื›ื ืึธืœืึธื’ื™ืข.

ืึทื“ื•ื•ืึทื ื˜ืึทื’ืขืก

ื•ื ื˜ืขืจ ืื™ื– ืึท ืจืฉื™ืžื” ืคื•ืŸ ื“ื™ ื”ื•ื™ืคึผื˜ ืคึฟืขื™ึดืงื™ื™ื˜ืŸ ืคื•ืŸ ืึท ืงืึทืžืคึผื™ื™ืœื“ ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜ ืกื™ืกื˜ืขื ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ:

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

ื“ื™ืกืึทื“ื•ื•ืึทื ื˜ื™ื“ื–ืฉื™ื– ืื•ืŸ ืœื™ืžื™ื˜ื™ื™ืฉืึทื ื–

ืงืึธืžืคึผื™ืœืขื“ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ื– ืึทื ื“ืขืจืฉ ืคื•ืŸ ืื ื“ืขืจืข ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืึทืคึผืจืึธื•ื˜ืฉื™ื– ืื•ืŸ ืงืขืŸ ื ื™ืฉื˜ ื–ื™ื™ืŸ ืคึผืึทืกื™ืง ืคึฟืึทืจ ืขื˜ืœืขื›ืข ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–. ื•ื ื˜ืขืจ ื–ืขื ืขืŸ ืขื˜ืœืขื›ืข ื“ื™ืกืึทื“ื•ื•ืึทื ื˜ื™ื“ื–ืฉื™ื–:

  1. ืกื˜ืึทื˜ื™ืง ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ. ืžืืœ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื’ืขืฉื•ื•ื™ื ื“ ืจื™ื›ื˜ื™ืง ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ืŸ ืคึผืจืึธื“ื•ืงืฆื™ืข, ื‘ื™ื™ืคึผืึทืกื™ื ื’ ืึทืœืข ืคึผืจืึทื˜ืขืงื˜ื™ื•ื• ืžืขืงืึทื ื™ื–ืึทืžื–. ืžื™ื˜ ื“ืขื ืฆื•ื’ืึทื ื’ ืขืก ืงืขืŸ ื–ื™ื™ืŸ ืžืขืจ ืฉื•ื•ืขืจ. ืื™ืŸ ืžื™ื ื“ืกื˜ืขืจ, ื–ืึทืžืœื•ื ื’ ืื•ืŸ ืึธื˜ืึทืžืึทื˜ื™ืง ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ื•ื•ืขื˜ ื ืึธืš ื–ื™ื™ืŸ ืคืืจืœืื ื’ื˜. ื“ืึธืก ืื™ื– ื‘ื™ื™ื“ืข ืึท ื ื•ืฆื™ืง ืฉื˜ืจื™ืš ืคื•ืŸ ื“ืขื ืฆื•ื’ืึทื ื’ ืื•ืŸ ืึท ื›ื™ืกืึธืจืŸ ืื™ืŸ ืขื˜ืœืขื›ืข ืงืึทืกืขืก.
  2. ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื“ื•ืจ. ืื™ืŸ ืคืึทืœ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื˜ืขืงืข ืื™ื– ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“ ื“ื•ืจืš ืึทืŸ ืึธื˜ืึทืžืึทื˜ื™ืง ื’ืขืฆื™ื™ึทื’, ื ืึธืš ื”ืฉืชื“ืœื•ืช ืงืขืŸ ื–ื™ื™ืŸ ืคืืจืœืื ื’ื˜ ืฆื• ื•ื™ืกืฉื˜ื™ืžืขืŸ ื“ื™ ื‘ื•ื™ืขืŸ ืฉืจื™ืคื˜.
  3. ืžื›ืฉื™ืจื™ื. ื“ืขืจื•ื•ื™ื™ึทืœ, ื™ื•ื˜ื™ืœืึทื˜ื™ื– ืื•ืŸ ื˜ืขืงื ื™ืงืก ื“ื™ื–ื™ื™ื ื“ ืฆื• ืึทืจื‘ืขื˜ืŸ ืžื™ื˜ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื–ืขื ืขืŸ ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื˜ืขืงืกื˜ ื˜ืขืงืขืก. ื ื™ื˜ ืึทืœืข ืึทื–ืึท ื™ื•ื˜ื™ืœืึทื˜ื™ื– / ื˜ืขืงื ื™ืงืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื‘ืืจืขื›ื˜ื™ื’ื˜ ืื™ืŸ ืึท ืงืึทืžืคึผื™ื™ืœื“ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ.
  4. ื ืขื ื“ืขืจื•ื ื’ ืื™ืŸ ืึทื˜ืึทื˜ื•ื“ื– ืื™ื– ืคืืจืœืื ื’ื˜. ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ืื•ืŸ DevOps ื–ืขื ืขืŸ ืฆื•ื’ืขื•ื•ื•ื™ื ื˜ ืฆื• ื˜ืขืงืกื˜ ื˜ืขืงืขืก. ื“ืขืจ ื’ืขื“ืึทื ืง ืคื•ืŸ ืงืึทืžืคึผื™ื™ืœื™ื ื’ ืึท ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืงืขืŸ ื–ื™ื™ืŸ ืขืคึผืขืก ืื•ืžื’ืขืจื™ื›ื˜ ืื•ืŸ ื•ืžื’ืขื•ื•ื™ื™ื ื˜ืœืขืš ืื•ืŸ ืคืึทืจืฉืึทืคืŸ ืจื™ื“ื–ืฉืขืงืฉืึทืŸ.
  5. ื ื”ื•ื™ืš ืงื•ื•ืึทืœื™ื˜ืขื˜ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืคึผืจืึธืฆืขืก ืื™ื– ืคืืจืœืื ื’ื˜. ืื™ืŸ ืกื“ืจ ืฆื• ืงืึทืžืคืขืจื˜ืึทื‘ืœื™ ื ื•ืฆืŸ ื“ื™ ืงืึทืžืคึผื™ื™ืœื“ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ, ืคื•ืœ ืึธื˜ืึทืžื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ืขื ืคึผืจืึธืฆืขืก ืคื•ืŸ ื‘ื•ื™ืขืŸ ืื•ืŸ ื“ื™ืคึผืœื•ื™ื™ื ื’ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ (CI / CD) ืื™ื– ื ื™ื™ื˜ื™ืง. ืึทื ื“ืขืจืฉ ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืึทื ืฅ ื•ืžื‘ืึทืงื•ื•ืขื.

ื–ืืœ ืื•ื ื“ื– ืื•ื™ืš ื•ื•ื•ื™ื ืขืŸ ืื•ื™ืฃ ืึท ื ื•ืžืขืจ ืคื•ืŸ ืœื™ืžื™ื˜ื™ื™ืฉืึทื ื– ืคื•ืŸ ื“ื™ ื‘ืึทื˜ืจืึทื›ื˜ ื‘ื™ื™ืฉืคึผื™ืœ ื•ื•ืึธืก ื–ืขื ืขืŸ ื ื™ืฉื˜ ืฉื™ื™ืš ืฆื• ื“ืขืจ ื’ืขื“ืึทื ืง ืคื•ืŸ ืึท ืงืึทืžืคึผื™ื™ืœื“ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ:

  1. ืื•ื™ื‘ ืžื™ืจ ืฆื•ืฉื˜ืขืœืŸ ื•ืžื ื™ื™ื˜ื™ืง ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื•ื•ืึธืก ืื™ื– ื ื™ืฉื˜ ื’ืขื ื™ืฆื˜ ื“ื•ืจืš ื“ื™ ื ืึธื“ืข, ื“ืขืจ ืงืึทืžืคึผื™ื™ืœืขืจ ื•ื•ืขื˜ ื ื™ืฉื˜ ื”ืขืœืคึฟืŸ ืื•ื ื“ื– ื“ื™ื˜ืขืงื˜ ื“ื™ ืคืขืœื ื“ื™ืง ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ. ื“ืขื ืคึผืจืึธื‘ืœืขื ืงืขื ืขืŸ ื–ื™ื™ืŸ ืกืึทืœื•ื•ื“ ื“ื•ืจืš ืคืึทืจืœืึธื–ืŸ ื“ืขื ืฉื˜ื™ืงืœ ืžื•ืกื˜ืขืจ ืื•ืŸ ื ื•ืฆืŸ ืžืขืจ ืฉื˜ืจืขื ื’ ื˜ื™ื™ืคึผืก, ืœืžืฉืœ, HList ืึธื“ืขืจ ืึทืœื’ืขื‘ืจืึทื™ืง ื“ืึทื˜ืŸ ื˜ื™ื™ืคึผืก (ืคืึทืœ ืงืœืืกืŸ) ืฆื• ืคืึธืจืฉื˜ืขืœืŸ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ.
  2. ืขืก ื–ืขื ืขืŸ ืฉื•ืจื•ืช ืื™ืŸ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื˜ืขืงืข ื•ื•ืึธืก ื–ืขื ืขืŸ ื ื™ืฉื˜ ืฉื™ื™ืš ืฆื• ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื–ื™ืš: (package, import,ืึธื‘ื“ื–ืฉืขืงื˜ ื“ืขืงืœืึทืจืึทืฆื™ืขืก; override def'ืก ืคึฟืึทืจ ืคึผืึทืจืึทืžืขื˜ืขืจืก ื•ื•ืึธืก ื”ืึธื‘ืŸ ืคืขืœื™ืงื™ื™ึทื˜ ื•ื•ืึทืœื•ืขืก). ื“ืึธืก ืงืขืŸ ื–ื™ื™ืŸ ื˜ื™ื™ืœ ืึทื•ื•ื•ื™ื“ื™ื“ ืื•ื™ื‘ ืื™ืจ ื™ื ืกื˜ืจื•ืžืขื ื˜ ื“ื™ื™ืŸ ืื™ื™ื’ืขื ืข ื“ืกืœ. ืื™ืŸ ื“ืขืจืฆื•, ืื ื“ืขืจืข ื˜ื™ื™ืคึผืก ืคื•ืŸ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ (ืœืžืฉืœ, XML) ืื•ื™ืš ืึธื ื˜ืึธืŸ ื–ื™ื›ืขืจ ืจื™ืกื˜ืจื™ืงืฉืึทื ื– ืื•ื™ืฃ ื“ื™ ื˜ืขืงืข ืกื˜ืจื•ืงื˜ื•ืจ.
  3. ืคึฟืึทืจ ื“ื™ ืฆื•ื•ืขืงืŸ ืคื•ืŸ ื“ืขื ืคึผืึธืกื˜ืŸ, ืžื™ืจ ื–ืขื ืขืŸ ื ื™ืฉื˜ ืงืึทื ืกื™ื“ืขืจื™ื ื’ ื“ื™ื ืึทืžื™ืฉ ืจื™ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืคื•ืŸ ืึท ืงื ื•ื™ืœ ืคื•ืŸ ืขื ืœืขืš ื ืึธื•ื“ื–.

ืกืึธืฃ

ืื™ืŸ ื“ืขื ืคึผืึธืกื˜ืŸ, ืžื™ืจ ื•ื™ืกืคืึธืจืฉืŸ ื“ื™ ื’ืขื“ืึทื ืง ืคื•ืŸ ืจืขืคึผืจื™ื–ืขื ื˜ื™ื ื’ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ืŸ ืžืงื•ืจ ืงืึธื“ ื ื™ืฆืŸ ื“ื™ ืึทื•ื•ืึทื ืกื™ืจื˜ืข ืงื™ื™ืคึผืึทื‘ื™ืœืึทื˜ื™ื– ืคื•ืŸ ื“ื™ Scala ื˜ื™ืคึผ ืกื™ืกื˜ืขื. ื“ืขืจ ืฆื•ื’ืึทื ื’ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืื™ืŸ ืคืึทืจืฉื™ื“ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ื•ื•ื™ ืึท ืคืึทืจื‘ื™ื™ึทื˜ ืคึฟืึทืจ ื˜ืจืื“ื™ืฆื™ืื ืขืœืŸ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืžืขื˜ื”ืึธื“ืก ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ืงืกืžืœ ืึธื“ืขืจ ื˜ืขืงืกื˜ ื˜ืขืงืขืก. ื›ืึธื˜ืฉ ืื•ื ื“ื–ืขืจ ื‘ื™ื™ืฉืคึผื™ืœ ืื™ื– ื™ืžืคึผืœืึทืžืขื ืึทื“ ืื™ืŸ ืกืงืึทืœืึท, ื“ื™ ื–ืขืœื‘ืข ื’ืขื“ืื ืงืขืŸ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื˜ืจืึทื ืกืคืขืจื“ ืฆื• ืื ื“ืขืจืข ืงืึทืžืคึผื™ื™ืœื“ ืฉืคึผืจืึทื›ืŸ (ืึทื–ืึท ื•ื•ื™ ืงืึธื˜ืœื™ืŸ, C #, ืกื•ื•ื™ืคื˜, ...). ืื™ืจ ืงืขื ืขืŸ ืคึผืจื•ื‘ื™ืจืŸ ื“ืขื ืฆื•ื’ืึทื ื’ ืื™ืŸ ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ืคึผืจืึทื“ื–ืฉืขืงืก, ืื•ืŸ, ืื•ื™ื‘ ืขืก ื˜ื•ื˜ ื ื™ืฉื˜ ืึทืจื‘ืขื˜ืŸ, ืžืึทืš ืื•ื™ืฃ ืฆื• ื“ื™ ื˜ืขืงืกื˜ ื˜ืขืงืข, ืึทื“ื™ื ื’ ื“ื™ ืคืขืœื ื“ื™ืง ืคึผืึทืจืฅ.

ื’ืขื•ื•ื™ื™ื ื˜ืœืขืš, ืึท ืงืึทืžืคึผื™ื™ืœื“ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืจื™ืงื•ื•ื™ื™ืขืจื– ืึท ื”ื•ื™ืš ืงื•ื•ืึทืœื™ื˜ืขื˜ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืคึผืจืึธืฆืขืก. ืื™ืŸ ืฆื•ืจื™ืงืงื•ืžืขืŸ, ื”ื•ื™ืš ืงื•ื•ืึทืœื™ื˜ืขื˜ ืื•ืŸ ืจื™ืœื™ื™ืึทื‘ื™ืœืึทื˜ื™ ืคื•ืŸ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทื ื– ืื™ื– ื™ื ืฉื•ืจื“.

ื“ืขืจ ื‘ืื˜ืจืื›ื˜ ืฆื•ื’ืึทื ื’ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื™ืงืกืคึผืึทื ื“ื™ื“:

  1. ืื™ืจ ืงืขื ืขืŸ ื ื•ืฆืŸ ืžืึทืงืจืึธืก ืฆื• ื“ื•ืจื›ืคื™ืจืŸ ืงืึธืžืคึผื™ืœ-ืฆื™ื™ื˜ ื˜ืฉืขืงืก.
  2. ืื™ืจ ืงืขื ืขืŸ ื™ื ืกื˜ืจื•ืžืขื ื˜ ืึท DSL ืฆื• ืคืึธืจืฉื˜ืขืœืŸ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ืŸ ืึท ื•ื•ืขื’ ืึทื– ืื™ื– ืฆื•ื˜ืจื™ื˜ืœืขืš ืฆื• ืกื•ืฃ ื ื™ืฆืขืจืก.
  3. ืื™ืจ ืงืขื ืขืŸ ื™ื ืกื˜ืจื•ืžืขื ื˜ ื“ื™ื ืึทืžื™ืฉ ืžื™ื˜ืœ ืคืึทืจื•ื•ืึทืœื˜ื•ื ื’ ืžื™ื˜ ืึธื˜ืึทืžืึทื˜ื™ืง ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืึทื“ื–ืฉืึทืกื˜ืžืึทื ื˜. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ื˜ืฉืึทื ื’ื™ื ื’ ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ื ืึธื•ื“ื– ืื™ืŸ ืึท ืงื ื•ื™ืœ ืจื™ืงื•ื•ื™ื™ืขืจื– ืึทื– (1) ื™ืขื“ืขืจ ื ืึธื“ืข ื‘ืึทืงื•ืžืขืŸ ืึท ื‘ื™ืกืœ ืึทื ื“ืขืจืฉ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ; (2) ื“ืขืจ ืงื ื•ื™ืœ ืคืึทืจื•ื•ืึทืœื˜ืขืจ ื‘ืืงื•ืžืขืŸ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื•ื•ืขื’ืŸ ื ื™ื™ึทืข ื ืึธื•ื“ื–.

ืึทืงืงื ืึธื•ื•ืœืขื“ื’ืžืขื ืฅ

ืื™ืš ื•ื•ืึธืœื˜ ื•ื•ื™ ืฆื• ื“ืึทื ืงืขืŸ Andrei Saksonov, Pavel Popov ืื•ืŸ Anton Nekhaev ืคึฟืึทืจ ื–ื™ื™ืขืจ ืงืึทื ืกื˜ืจืึทืงื˜ื™ื•ื• ืงืจื™ื˜ื™ืง ืคื•ืŸ ื“ืขื ืคึผืœืึทืŸ ืึทืจื˜ื™ืงืœ.

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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’