ãã®æçš¿ã§ã¯ãåæ£ã·ã¹ãã ã®æ§æãæ±ãèå³æ·±ãæ¹æ³ãå
±æããããšæããŸãã
æ§æã¯ãã¿ã€ãã»ãŒããªæ¹æ³ã§ Scala èšèªã§çŽæ¥è¡šçŸãããŸãã å®è£
äŸã«ã€ããŠè©³ãã説æããŸãã éçºããã»ã¹å
šäœãžã®åœ±é¿ãå«ããææ¡ã®ããŸããŸãªåŽé¢ãè°è«ãããŸãã
æŠèŠ
å ç¢ãªåæ£ã·ã¹ãã ãæ§ç¯ããã«ã¯ããã¹ãŠã®ããŒãã§æ£ããäžè²«ããæ§æã䜿çšããå¿ èŠããããŸãã äžè¬çãªè§£æ±ºçã¯ãããã¹ãã«ãããããã€ã¡ã³ãèšè¿° (terraformãansible ãªã©) ãšèªåçæãããæ§æãã¡ã€ã« (å€ãã®å ŽåãåããŒã/ããŒã«å°çš) ã䜿çšããããšã§ãã ãŸããéä¿¡ããåããŒãã§åãããŒãžã§ã³ã®åããããã³ã«ã䜿çšããããšèããŸã (ããããªããšãéäºææ§ã®åé¡ãçºçããŸã)ã JVM ã®äžçã§ã¯ãããã¯ãå°ãªããšãã¡ãã»ãŒãžã³ã° ã©ã€ãã©ãªããã¹ãŠã®éä¿¡ããŒãã§åãããŒãžã§ã³ã§ããå¿ èŠãããããšãæå³ããŸãã
ã·ã¹ãã ã®ãã¹ãã«ã€ããŠã¯ã©ãã§ãã? ãã¡ãããçµ±åãã¹ãã«å ¥ãåã«ããã¹ãŠã®ã³ã³ããŒãã³ãã®åäœãã¹ããè¡ãå¿ èŠããããŸãã å®è¡æã«ãã¹ãçµæãæšå®ã§ããããã«ããã«ã¯ããã¹ãŠã®ã©ã€ãã©ãªã®ããŒãžã§ã³ãå®è¡æç°å¢ãšãã¹ãç°å¢ã®äž¡æ¹ã§åäžã«ä¿ãããããã«ããå¿ èŠããããŸãã
çµ±åãã¹ããå®è¡ããå Žåãå€ãã®å Žåããã¹ãŠã®ããŒãã§åãã¯ã©ã¹ãã¹ã䜿çšããæ¹ãã¯ããã«ç°¡åã§ãã ãããã€ã¡ã³ãæã«åãã¯ã©ã¹ãã¹ã䜿çšãããŠããããšã確èªããå¿ èŠãããã ãã§ãã (ç°ãªãããŒãã§ç°ãªãã¯ã©ã¹ãã¹ã䜿çšããããšã¯å¯èœã§ããããã®æ§æãè¡šçŸããŠæ£ãããããã€ããããšã¯ããå°é£ã§ãã) ãããã£ãŠãç©äºãåçŽã«ããããã«ããã¹ãŠã®ããŒãã§åäžã®ã¯ã©ã¹ãã¹ã®ã¿ãèæ ®ããŸãã
æ§æã¯ãœãããŠã§ã¢ãšãšãã«é²åããåŸåããããŸãã éåžžãããŸããŸãªãã®ãèå¥ããããã«ããŒãžã§ã³ã䜿çšããŸã
ãœãããŠã§ã¢é²åã®æ®µéã ããŒãžã§ã³ç®¡çã®äžã§æ§æãã«ããŒããããã€ãã®ã©ãã«ã§ç°ãªãæ§æãèå¥ããã®ãåççãšæãããŸãã éçšç°å¢ã«æ§æã 1.2.3 ã€ãããªãå Žåãåäžã®ããŒãžã§ã³ãèå¥åãšããŠäœ¿çšããããšããããŸãã å Žåã«ãã£ãŠã¯ãè€æ°ã®éçšç°å¢ãããå ŽåããããŸãã ãŸããç°å¢ããšã«åå¥ã®æ§æãã©ã³ããå¿
èŠã«ãªãå ŽåããããŸãã ãããã£ãŠãç°ãªãæ§æãäžæã«èå¥ããããã«ãæ§æã«ã¯ãã©ã³ããšããŒãžã§ã³ã®ã©ãã«ãä»ããããå ŽåããããŸãã åãã©ã³ãã®ã©ãã«ââãšããŒãžã§ã³ã¯ãåããŒãäžã®åæ£ããŒããããŒããå€éšãªãœãŒã¹ãã¯ã©ã¹ãã¹ ã©ã€ãã©ãªã®ããŒãžã§ã³ã® XNUMX ã€ã®çµã¿åããã«å¯Ÿå¿ããŸãã ããã§ã¯ãä»ã®ã¢ãŒãã£ãã¡ã¯ããšåãããã«ãåäžã®ãã©ã³ãã®ã¿ãåãäžããXNUMX ã€ã®ã³ã³ããŒãã³ãã® XNUMX é²ããŒãžã§ã³ (XNUMX) ã«ãã£ãŠæ§æãèå¥ããŸãã
ææ°ã®ç°å¢ã§ã¯ãæ§æãã¡ã€ã«ã¯æåã§å€æŽãããªããªããŸããã éåžžãç§ãã¡ã¯çæããŸã
å°å
¥æã®èšå®ãã¡ã€ã«ãš
ãã®æçš¿ã§ã¯ãã³ã³ãã€ã«ãããã¢ãŒãã£ãã¡ã¯ãã«æ§æãä¿æãããšããã¢ã€ãã¢ãæ€èšããŸãã
ã³ã³ãã€ã«å¯èœãªæ§æ
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãéçæ§æã®äŸã«ã€ããŠèª¬æããŸãã XNUMX ã€ã®åçŽãªãµãŒãã¹ (ãšã³ãŒ ãµãŒãã¹ãšãšã³ãŒ ãµãŒãã¹ã®ã¯ã©ã€ã¢ã³ã) ãæ§æããã³å®è£ ãããŠããŸãã 次ã«ãäž¡æ¹ã®ãµãŒãã¹ãåãã XNUMX ã€ã®ç°ãªãåæ£ã·ã¹ãã ãã€ã³ã¹ã¿ã³ã¹åãããŸãã XNUMX ã€ã¯åäžããŒãæ§æçšã§ããã XNUMX ã€ã¯ XNUMX ããŒãæ§æçšã§ãã
äžè¬çãªåæ£ã·ã¹ãã ã¯ãããã€ãã®ããŒãã§æ§æãããŸãã ããŒãã¯ã次ã®ãããªã¿ã€ãã䜿çšããŠèå¥ã§ããŸãã
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
ææ¥ã§ã¯äœ¿ããªããã®ã§ãã ãããã ãã¡ã³ãã ã¿ã€ãã å®è¡æã«ãããã³ã«èå¥åã®ã€ã³ã¹ã¿ã³ã¹ãå¿
èŠã«ãªãããšã¯ã»ãšãã©ãªãããããããã³ã«èå¥åãä¿åããŸããã ã³ã³ãã€ã«äžã«ããã®ãã¡ã³ãã åã¯è¿œå ã®åå®å
šæ§ãæäŸããŸãã äžæ£ãªãããã³ã«ã§ã¯ããŒããæž¡ãããšãã§ããŸããã
æãåºã䜿çšãããŠãããããã³ã«ã® XNUMX ã€ã¯ãJson ã·ãªã¢ã«åã䜿çšãã REST API ã§ãã
sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]
ã³ã©ãã¬ãŒ RequestMessage
ã¯ã©ã€ã¢ã³ãããµãŒããŒã«éä¿¡ã§ããã¡ãã»ãŒãžã®åºæ¬ã¿ã€ãã§ãã ResponseMessage
ãµãŒããŒããã®å¿çã¡ãã»ãŒãžã§ãã ãã¡ãããå¿
èŠãªç²ŸåºŠã§éä¿¡ãããã³ã«ãæå®ããä»ã®ãããã³ã«èšè¿°ãäœæããããšãã§ããŸãã
ãã®èšäºã§ã¯ãããåçŽãªããŒãžã§ã³ã®ãããã³ã«ã䜿çšããŸãã
sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]
ãã®ãããã³ã«ã§ã¯ããªã¯ãšã¹ã ã¡ãã»ãŒãžã URL ã«è¿œå ãããã¬ã¹ãã³ã¹ ã¡ãã»ãŒãžããã¬ãŒã³æååãšããŠè¿ãããŸãã
ãµãŒãã¹æ§æã¯ããµãŒãã¹åãããŒãã®ã³ã¬ã¯ã·ã§ã³ãããã³ããã€ãã®äŸåé¢ä¿ã«ãã£ãŠèª¬æã§ããŸãã Scala ã§ããããã¹ãŠã®èŠçŽ ãè¡šçŸããæ¹æ³ã¯ããã€ããããŸã (ããšãã°ã HList
ã代æ°ããŒã¿åïŒã ãã®æçš¿ã®ç®çã®ããã«ãCake ãã¿ãŒã³ã䜿çšããçµã¿åããå¯èœãªããŒã¹ (ã¢ãžã¥ãŒã«) ãç¹æ§ãšããŠè¡šããŸãã (Cake ãã¿ãŒã³ã¯ããã®ã³ã³ãã€ã«å¯èœãªæ§æã¢ãããŒãã®èŠä»¶ã§ã¯ãããŸãããããã¯ãã¢ã€ãã¢ã® XNUMX ã€ã®å¯èœãªå®è£
ã«ãããŸããã)
äŸåé¢ä¿ã¯ãä»ã®ããŒãã®ãšã³ããã€ã³ããšã㊠Cake ãã¿ãŒã³ã䜿çšããŠè¡šãããšãã§ããŸãã
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)
}
ãšã³ãŒ ãµãŒãã¹ã«ã¯ããŒãã®èšå®ã®ã¿ãå¿
èŠã§ãã ãããŠããã®ããŒãããšã³ãŒ ãããã³ã«ããµããŒãããŠããããšã宣èšããŸãã ãã¬ã€ãã§ã¯æœè±¡ã¡ãœããã®å®£èšãèš±å¯ãããŠãããããçŸæç¹ã§ã¯ç¹å®ã®ããŒããæå®ããå¿
èŠããªãããšã«æ³šæããŠãã ããã æœè±¡ã¡ãœããã䜿çšããå Žåãã³ã³ãã€ã©ã¯æ§æã€ã³ã¹ã¿ã³ã¹ã§ã®å®è£
ãå¿
èŠãšããŸãã ããã§ã¯å®è£
ãæäŸããŸãã (8081
) ã§ãããå
·äœçãªèšå®ã§ã¹ãããããå Žåã¯ããã©ã«ãå€ãšããŠäœ¿çšãããŸãã
ãšã³ãŒ ãµãŒãã¹ ã¯ã©ã€ã¢ã³ãã®æ§æã§äŸåé¢ä¿ã宣èšã§ããŸãã
trait EchoClientConfig[A] {
def testMessage: String = "test"
def pollInterval: FiniteDuration
def echoServiceDependency: HttpSimpleGetEndPoint[_, EchoProtocol[A]]
}
äŸåé¢ä¿ã®ã¿ã€ã㯠echoService
ã ç¹ã«ãåããããã³ã«ãå¿
èŠã§ãã ãããã£ãŠãããã XNUMX ã€ã®äŸåé¢ä¿ãæ¥ç¶ãããšãæ£ããåäœããããšãä¿èšŒãããŸãã
ãµãŒãã¹ã®å®è£
ãµãŒãã¹ã«ã¯ãéå§ããã³æ£åžžã«ã·ã£ããããŠã³ããããã®æ©èœãå¿
èŠã§ãã (ãµãŒãã¹ãã·ã£ããããŠã³ã§ããããšã¯ããã¹ãã«ã¯éèŠã§ãã) ããã§ããç¹å®ã®æ§æã«å¯ŸããŠãã®ãããªé¢æ°ãæå®ãããªãã·ã§ã³ãããã€ããããŸã (ããšãã°ãåã¯ã©ã¹ã䜿çšã§ããŸã)ã ãã®æçš¿ã§ã¯ãããäžåºŠ 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
ã¿ã€ãã ãŸããå®å
šãªæ§æãæäŸããªããšããŒããèµ·åã§ããŸããã
ããŒãã¢ãã¬ã¹è§£æ±º
æ¥ç¶ã確ç«ããã«ã¯ãåããŒãã®å®éã®ãã¹ã ã¢ãã¬ã¹ãå¿ èŠã§ãã ããã¯ãæ§æã®ä»ã®éšåãããåŸã§å€æããå¯èœæ§ããããŸãã ãããã£ãŠãããŒã ID ãšãã®å®éã®ã¢ãã¬ã¹ã®éã®ãããã³ã°ãæäŸããæ¹æ³ãå¿ èŠã§ãã ãã®ãããã³ã°ã¯é¢æ°ã§ãã
case class NodeAddress[NodeId](host: Uri.Host)
trait AddressResolver[F[_]] {
def resolve[NodeId](nodeId: NodeId): F[NodeAddress[NodeId]]
}
ãã®ãããªé¢æ°ãå®è£ ããã«ã¯ããã€ãã®æ¹æ³ããããŸãã
- ãããã€ã¡ã³ãåãã€ãŸãããŒããã¹ãã®ã€ã³ã¹ã¿ã³ã¹åäžã«å®éã®ã¢ãã¬ã¹ãããã£ãŠããå Žåã¯ãå®éã®ã¢ãã¬ã¹ã䜿çšã㊠Scala ã³ãŒããçæãããã®åŸãã«ããå®è¡ã§ããŸã (ããã«ãããã³ã³ãã€ã«æã®ãã§ãã¯ãå®è¡ããããã®åŸãçµ±åãã¹ã ã¹ã€ãŒããå®è¡ãããŸã)ã ãã®å Žåããããã³ã°é¢æ°ã¯éçã«ç¥ãããŠããã次ã®ããã«åçŽåã§ããŸãã
Map[NodeId, NodeAddress]
. - å Žåã«ãã£ãŠã¯ãããŒããå®éã«éå§ãããåŸã®æç¹ã§ã®ã¿å®éã®ã¢ãã¬ã¹ãååŸããããšãããŸã éå§ãããŠããªãããŒãã®ã¢ãã¬ã¹ãååŸããŠããªãããšããããŸãã ãã®å Žåãä»ã®ãã¹ãŠã®ããŒããããå ã«éå§ãããæ€åºãµãŒãã¹ããããåããŒãããã®ãµãŒãã¹å ã§èªåã®ã¢ãã¬ã¹ãã¢ããã¿ã€ãºããäŸåé¢ä¿ã«ãµãã¹ã¯ã©ã€ãããå¯èœæ§ããããŸãã
- ä¿®æ£ã§ããã°
/etc/hosts
ãäºåå®çŸ©ããããã¹ãåã䜿çšã§ããŸã (äŸ:my-project-main-node
ããã³echo-backend
ïŒãå±éæã«ãã®ååã IP ã¢ãã¬ã¹ã«é¢é£ä»ããã ãã§ãã
ãã®æçš¿ã§ã¯ããããã®ã±ãŒã¹ã«ã€ããŠã¯è©³ãã説æããŸããã å®éãç§ãã¡ã®ããã¡ãã®äŸã§ã¯ããã¹ãŠã®ããŒããåã IP ã¢ãã¬ã¹ãæã¡ãŸãã 127.0.0.1
.
ãã®æçš¿ã§ã¯ãXNUMX ã€ã®åæ£ã·ã¹ãã ã¬ã€ã¢ãŠãã«ã€ããŠæ€èšããŸãã
- åäžããŒã ã¬ã€ã¢ãŠãããã¹ãŠã®ãµãŒãã¹ãåäžããŒãã«é 眮ãããŸãã
- ãµãŒãã¹ãšã¯ã©ã€ã¢ã³ããç°ãªãããŒãäžã«ãã XNUMX ããŒã ã¬ã€ã¢ãŠãã
ã®æ§æ
ã·ã³ã°ã«ããŒãæ§æ
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
ã€ã³ã¿ãŒãã«ãçµéããŸãã
åããµãŒãã¹ã®å®è£
ãšæ§æã®ã»ããã䜿çšããŠãXNUMX ã€ã®å¥åã®ããŒããå«ãã·ã¹ãã ã®ã¬ã€ã¢ãŠããäœæã§ããŸãã ããšã¯äœæããã ãã§ã
XNUMXããŒãæ§æ
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"
}
äŸåé¢ä¿ãæå®ããæ¹æ³ã確èªããŠãã ããã çŸåšã®ããŒãã®äŸåé¢ä¿ãšããŠãä»ã®ããŒããæäŸãããµãŒãã¹ã«ã€ããŠèšåããŸãã äŸåé¢ä¿ã®ã¿ã€ãã¯ããããã³ã«ãèšè¿°ãããã¡ã³ãã ã¿ã€ããå«ãŸããŠãããããã§ãã¯ãããŸãã ãããŠå®è¡æã«ã¯æ£ããããŒã ID ãåŸãããŸãã ããã¯ãææ¡ãããæ§æã¢ãããŒãã®éèŠãªåŽé¢ã® XNUMX ã€ã§ãã ããã«ãããããŒãã XNUMX åã ãèšå®ããŠãæ£ããããŒããåç §ããŠããããšã確èªã§ããããã«ãªããŸãã
XNUMX ã€ã®ããŒãã®å®è£
ãã®æ§æã§ã¯ããŸã£ããåããµãŒãã¹å®è£ ã䜿çšããŸãã ãŸã£ããå€åã¯ãããŸããã ãã ããç°ãªããµãŒãã¹ ã»ãããå«ã XNUMX ã€ã®ç°ãªãããŒãå®è£ ãäœæããŸãã
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
}
æåã®ããŒãã¯ãµãŒããŒãå®è£
ããŠããããµãŒããŒåŽã®æ§æã®ã¿ãå¿
èŠã§ãã XNUMX çªç®ã®ããŒãã¯ã¯ã©ã€ã¢ã³ããå®è£
ããŠãããæ§æã®å¥ã®éšåãå¿
èŠã§ãã ã©ã¡ãã®ããŒãã«ããäœããã®ã©ã€ãã¿ã€ã ä»æ§ãå¿
èŠã§ãã ãã®ãã¹ããµãŒãã¹ã®ç®çã®ããã«ãããŒãã¯ç¡éã®åç¶æéãæã¡ã次ã䜿çšããŠçµäºã§ããŸãã SIGTERM
äžæ¹ããšã³ãŒ ã¯ã©ã€ã¢ã³ãã¯ãèšå®ãããæéã®æéãçµéãããšçµäºããŸãã ãåç
§ããŠãã ããã
å šäœçãªéçºããã»ã¹
ãã®ã¢ãããŒãã«ãã£ãŠæ§æã®äœæ¥æ¹æ³ãã©ã®ããã«å€ããããèŠãŠã¿ãŸãããã
ã³ãŒããšããŠã®æ§æãã³ã³ãã€ã«ãããã¢ãŒãã£ãã¡ã¯ããçæãããŸãã æ§æã¢ãŒãã£ãã¡ã¯ããä»ã®ã³ãŒãã¢ãŒãã£ãã¡ã¯ãããåé¢ããã®ãåççãšæãããŸãã å€ãã®å Žåãåãã³ãŒã ããŒã¹äžã«å€æ°ã®æ§æãå«ããããšãã§ããŸãã ãããŠãã¡ãããããŸããŸãªæ§æãã©ã³ãã®è€æ°ã®ããŒãžã§ã³ãæã€ããšãã§ããŸãã æ§æã§ã¯ãã©ã€ãã©ãªã®ç¹å®ã®ããŒãžã§ã³ãéžæã§ããŸããããã¯ããã®æ§æããããã€ãããã³ã«äžå®ã«ä¿ãããŸãã
æ§æã®å€æŽã¯ã³ãŒãã®å€æŽã«ãªããŸãã ãããã£ãŠãåãå質ä¿èšŒããã»ã¹ã§ã«ããŒãããå¿ èŠããããŸãã
ãã±ãã -> PR -> ã¬ãã¥ãŒ -> ããŒãž -> ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ -> ç¶ç¶çãããã€ã¡ã³ã
ãã®ã¢ãããŒãã«ã¯æ¬¡ã®ãããªåœ±é¿ããããŸãã
- æ§æã¯ãç¹å®ã®ã·ã¹ãã ã®ã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠäžè²«ããŠããŸãã ããŒãéã®æ¥ç¶ãééã£ãŠããããšã¯ãªãããã§ãã
- XNUMX ã€ã®ããŒãã ãã§æ§æãå€æŽããã®ã¯ç°¡åã§ã¯ãããŸããã ãã°ã€ã³ããŠããã¹ããã¡ã€ã«ãå€æŽããã®ã¯ç¡çãããããã§ãã ãããã£ãŠãæ§æã®ããªããã¯èµ·ããã«ãããªããŸãã
- å°ããªæ§æå€æŽã¯ç°¡åã§ã¯ãããŸããã
- æ§æå€æŽã®ã»ãšãã©ã¯åãéçºããã»ã¹ã«åŸããããçšåºŠã®ã¬ãã¥ãŒã«åæ ŒããŸãã
éçšç°å¢èšå®çšã«å¥ã®ãªããžããªãå¿ èŠã§ãã? å®çšŒåæ§æã«ã¯ãå€ãã®äººã觊ããªãããã«ãããæ©å¯æ å ±ãå«ãŸããŠããå ŽåããããŸãã ãããã£ãŠãå®çšŒåæ§æãå«ããã¢ã¯ã»ã¹ãå¶éãããå¥ã®ãªããžããªãä¿æãã䟡å€ããããããããŸããã èšå®ã XNUMX ã€ã®éšåã«åå²ããå ŽåããããŸããXNUMX ã€ã¯æ¬çªç°å¢ã®æããªãŒãã³ãªãã©ã¡ãŒã¿ãå«ã¿ããã XNUMX ã€ã¯èšå®ã®ç§å¯éšåãå«ã¿ãŸãã ããã«ãããã»ãšãã©ã®éçºè ã¯å€§éšåã®ãã©ã¡ãŒã¿ã«ã¢ã¯ã»ã¹ã§ããããã«ãªããŸãããæ¬åœã«æ©å¯æ§ã®é«ããã®ãžã®ã¢ã¯ã»ã¹ã¯å¶éãããŸãã ããã©ã«ãã®ãã©ã¡ãŒã¿å€ãæã€äžéç¹æ§ã䜿çšãããšããããç°¡åã«å®çŸã§ããŸãã
ããªãšãŒã·ã§ã³
ä»ã®æ§æ管çææ³ãšæ¯èŒããŠãææ¡ãããã¢ãããŒãã®é·æãšçæãèŠãŠã¿ãŸãããã
ãŸãæåã«ãææ¡ãããŠããæ§æåŠçæ¹æ³ã®ããŸããŸãªåŽé¢ã«å¯Ÿãã代æ¿æ¡ãããã€ããªã¹ãããŸãã
- ã¿ãŒã²ãã ãã·ã³äžã®ããã¹ã ãã¡ã€ã«ã
- äžå
åãããããŒãšå€ã®ã¹ãã¬ãŒãž (
etcd
/zookeeper
). - ããã»ã¹ãåèµ·åããã«åæ§æ/åèµ·åã§ãããµãããã»ã¹ ã³ã³ããŒãã³ãã
- ã¢ãŒãã£ãã¡ã¯ãããã³ããŒãžã§ã³ç®¡çå€ã®æ§æã
ããã¹ã ãã¡ã€ã«ã䜿çšãããšãã¢ãããã¯ãªä¿®æ£ã«é¢ããŠããçšåºŠã®æè»æ§ãåŸãããŸãã ã·ã¹ãã 管çè ã¯ã¿ãŒã²ãã ããŒãã«ãã°ã€ã³ããå€æŽãå ããŠãµãŒãã¹ãåèµ·åããã ãã§æžã¿ãŸãã ããã¯ã倧èŠæš¡ãªã·ã¹ãã ã§ã¯ããŸãè¯ããªãå¯èœæ§ããããŸãã å€æŽã®çè·¡ã¯æ®ããŸããã å€æŽã¯å¥ã®ç®ã§ç¢ºèªãããŸããã äœãå€åãåŒãèµ·ãããã®ããèŠã€ããã®ã¯é£ãããããããŸããã ãã¹ãã¯ãããŠããŸããã åæ£ã·ã¹ãã ã®èŠ³ç¹ããèŠããšã管çè ã¯ä»ã®ããŒãã® XNUMX ã€ã§æ§æãæŽæ°ããããšãåçŽã«å¿ããå¯èœæ§ããããŸãã
(ãšããã§ãæçµçã«ããã¹ãæ§æãã¡ã€ã«ã®äœ¿çšãéå§ããå¿
èŠãããå Žåã¯ãåããã®ãçæã§ããããŒãµãŒãšããªããŒã¿ãŒãè¿œå ããã ãã§æžã¿ãŸãã Config
ãšå
¥åããã ãã§ãããã¹ãæ§æã®äœ¿çšãéå§ã§ããŸãã ããã¯ãããã¹ãããŒã¹ã®ããŒãžã§ã³ã§ã¯è¿œå ã®ã³ãŒããå¿
èŠãªãããã³ã³ãã€ã«æã®æ§æã®è€éããããã¹ãããŒã¹ã®æ§æã®è€éãããããããã«å°ããããšã瀺ããŠããŸã)ã
äžå
åãããããŒãšå€ã®ã¹ãã¬ãŒãžã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¿ ãã©ã¡ãŒã¿ãŒãé
åžããããã®åªããã¡ã«ããºã ã§ãã ããã§ãäœãæ§æå€ã§ããããäœãåãªãããŒã¿ã§ããããèããå¿
èŠããããŸãã äžããããé¢æ° C => A => B
ç§ãã¡ã¯éåžžããã£ãã«å€åããªãå€ããå€ããšåŒã³ãŸãã C
ãæ§æããé »ç¹ã«å€æŽãããããŒã¿ A
- ããŒã¿ãå
¥åããã ãã§ãã èšå®ã¯ããŒã¿ãããåã«é¢æ°ã«æäŸããå¿
èŠããããŸã A
ã ãã®èããèžãŸãããšãæ§æããŒã¿ãšåãªãããŒã¿ãåºå¥ããããã«äœ¿çšã§ããã®ã¯ãäºæ³ãããå€æŽã®é »åºŠã§ãããšèšããŸãã ãŸããéåžžãããŒã¿ã¯ XNUMX ã€ã®ãœãŒã¹ (ãŠãŒã¶ãŒ) ããååŸãããæ§æã¯å¥ã®ãœãŒã¹ (管çè
) ããååŸãããŸãã åæåããã»ã¹åŸã«å€æŽã§ãããã©ã¡ãŒã¿ãåŠçãããšãã¢ããªã±ãŒã·ã§ã³ã®è€éããå¢å ããŸãã ãã®ãããªãã©ã¡ãŒã¿ã®å Žåã¯ããã®é
ä¿¡ã¡ã«ããºã ã解æãšæ€èšŒãäžæ£ãªå€ã®åŠçãåŠçããå¿
èŠããããŸãã ãããã£ãŠãããã°ã©ã ã®è€éãã軜æžããã«ã¯ãå®è¡æã«å€æŽã§ãããã©ã¡ãŒã¿ãŒã®æ°ãæžãã (ãŸãã¯å®å
šã«åé€ãã) æ¹ãè¯ãã§ãããã
ãã®æçš¿ã®èŠ³ç¹ããã¯ãéçãã©ã¡ãŒã¿ãŒãšåçãã©ã¡ãŒã¿ãŒãåºå¥ããå¿
èŠããããŸãã ãµãŒãã¹ ããžãã¯ã§å®è¡æã«äžéšã®ãã©ã¡ãŒã¿ãŒããŸãã«å€æŽããå¿
èŠãããå Žåãããããåçãã©ã¡ãŒã¿ãŒãšåŒã¶ããšããããŸãã ãã以å€ã®å Žåããããã¯éçã§ãããææ¡ãããã¢ãããŒãã䜿çšããŠæ§æã§ããŸãã åçåæ§æã«ã¯ãä»ã®ã¢ãããŒããå¿
èŠã«ãªãå ŽåããããŸãã ããšãã°ãåæ£ã·ã¹ãã ã®åå¥ã®ããã»ã¹ãåèµ·åããã®ãšåæ§ã®æ¹æ³ã§ãã·ã¹ãã ã®äžéšãæ°ããæ§æãã©ã¡ãŒã¿ã䜿çšããŠåèµ·åãããå ŽåããããŸãã
(ç§ã®è¬èãªæèŠã¯ãã·ã¹ãã ã®è€éããå¢ããããå®è¡æã®åæ§æã¯é¿ããã¹ãã§ãã
ããã»ã¹ãåèµ·åããããã® OS ãµããŒãã«äŸåããæ¹ãç°¡åãããããŸããã ãã ããåžžã«å¯èœã§ãããšã¯éããŸããã)
éçæ§æã䜿çšããå Žåã(ä»ã®çç±ããªãã®ã«) åçæ§æãèæ
®ããããšãããéèŠãªåŽé¢ã® XNUMX ã€ã¯ãæ§ææŽæ°äžã®ãµãŒãã¹ã®ããŠã³ã¿ã€ã ã§ãã å®éãéçæ§æãå€æŽããå¿
èŠãããå Žåã¯ãæ°ããå€ãæå¹ã«ãªãããã«ã·ã¹ãã ãåèµ·åããå¿
èŠããããŸãã ããŠã³ã¿ã€ã ã®èŠä»¶ã¯ã·ã¹ãã ã«ãã£ãŠç°ãªããããããã»ã©éèŠã§ã¯ãªãå¯èœæ§ããããŸãã ãããéèŠãªå Žåã¯ãã·ã¹ãã ã®åèµ·åãäºåã«èšç»ããå¿
èŠããããŸãã ããšãã°ã次ã®ããã«å®è£
ã§ããŸãã
æ§æãããŒãžã§ã³ç®¡çãããã¢ãŒãã£ãã¡ã¯ãã®å éšãŸãã¯å€éšã«ä¿æããå Žåã¯ã©ãããã°ããã§ãããã? æ§æãã¢ãŒãã£ãã¡ã¯ãå ã«ä¿æãããšããããšã¯ãã»ãšãã©ã®å Žåããã®æ§æãä»ã®ã¢ãŒãã£ãã¡ã¯ããšåãå質ä¿èšŒããã»ã¹ã«åæ ŒããŠããããšãæå³ããŸãã ãããã£ãŠãæ§æãé«å質ã§ä¿¡é Œã§ãããã®ã§ãããšç¢ºä¿¡ã§ãããããããŸããã éã«ãå¥ã®ãã¡ã€ã«ã«æ§æãäœæãããšããã®ãã¡ã€ã«ã«èª°ãããªãå€æŽãå ãããã®çè·¡ãæ®ããªãããšã«ãªããŸãã ããã¯éèŠã§ãã? ç§ãã¡ã¯ãã»ãšãã©ã®å®çšŒåã·ã¹ãã ã§ã¯ãå®å®ããé«å質ã®æ§æã䜿çšããããšãæãŸãããšèããŠããŸãã
ã¢ãŒãã£ãã¡ã¯ãã®ããŒãžã§ã³ã«ãããã¢ãŒãã£ãã¡ã¯ãããã€äœæãããããã©ã®ãããªå€ãå«ãŸããŠããããã©ã®æ©èœãæå¹/ç¡å¹ã«ãªã£ãŠããããæ§æã®åå€æŽã誰ãè¡ã£ãããç¥ãããšãã§ããŸãã ã¢ãŒãã£ãã¡ã¯ãå ã«æ§æãä¿æããã«ã¯ããçšåºŠã®åªåãå¿ èŠã«ãªãå ŽåããããŸãããããã¯èšèšäžã®éžæãšãªããŸãã
é·æçæ
ããã§ã¯ãææ¡ãããã¢ãããŒãã®ããã€ãã®å©ç¹ã匷調ããããã€ãã®æ¬ ç¹ã«ã€ããŠèª¬æããããšæããŸãã
Advantages
å®å šãªåæ£ã·ã¹ãã ã®ã³ã³ãã€ã«å¯èœãªæ§æã®ç¹åŸŽ:
- æ§æã®éçãã§ãã¯ã ããã«ãããåå¶çŽãäžããããå Žåã«æ§æãæ£ãããšããé«ãã¬ãã«ã®ä¿¡é ŒãåŸãããŸãã
- è±å¯ãªèšå®èšèªã éåžžãä»ã®æ§æã¢ãããŒãã¯æ倧ã§ãå€æ°çœ®æã«éå®ãããŸãã
Scala ã䜿çšãããšãå¹ åºãèšèªæ©èœã䜿çšããŠæ§æãæ¹åã§ããŸãã ããšãã°ãç¹æ§ã䜿çšããŠããã©ã«ãå€ãæäŸãããããªããžã§ã¯ãã䜿çšããŠç°ãªãã¹ã³ãŒããèšå®ãããã§ããŸããval
â å€åŽã®ã¹ã³ãŒã (DRY) 㧠XNUMX åã ãå®çŸ©ãããŸãã ãªãã©ã« ã·ãŒã±ã³ã¹ãŸãã¯ç¹å®ã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã䜿çšããããšãã§ããŸã (Seq
,Map
ãªã©ïŒã - DSLã Scala 㯠DSL ã©ã€ã¿ãŒãé©åã«ãµããŒãããŠããŸãã ãããã®æ©èœã䜿çšããŠããã䟿å©ã§ãšã³ããŠãŒã¶ãŒã«åªããæ§æèšèªã確ç«ããæçµæ§æãå°ãªããšããã¡ã€ã³ ãŠãŒã¶ãŒã«èªã¿åããããã«ããããšãã§ããŸãã
- ããŒãéã®æŽåæ§ãšäžè²«æ§ã åæ£ã·ã¹ãã å šäœã®æ§æã XNUMX ãæã§è¡ãå©ç¹ã® XNUMX ã€ã¯ããã¹ãŠã®å€ãå³å¯ã«äžåºŠå®çŸ©ãããå¿ èŠãªãã¹ãŠã®å Žæã§åå©çšã§ããããšã§ãã ãŸããã¿ã€ã ã»ãŒã ããŒã宣èšã«ãããèãããããã¹ãŠã®æ£ããæ§æã§ã·ã¹ãã ã®ããŒããåãèšèªã話ãããšãä¿èšŒãããŸãã ããŒãéã«ã¯æ瀺çãªäŸåé¢ä¿ããããããäžéšã®ãµãŒãã¹ã®æäŸãå¿ãã«ãããªããŸãã
- é«å質ãªå€æŽã éåžžã® PR ããã»ã¹ãéããŠæ§æå€æŽãæž¡ããšããå šäœçãªã¢ãããŒãã«ãããæ§æã«ãããŠãé«ãå質åºæºã確ç«ãããŸãã
- åææ§æå€æŽã æ§æã«å€æŽãå ãããã³ã«ãèªåãããã€ã¡ã³ãã«ãã£ãŠãã¹ãŠã®ããŒãã確å®ã«æŽæ°ãããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã®ç°¡çŽ åã ã¢ããªã±ãŒã·ã§ã³ã¯æ§æã解æããŠæ€èšŒããããééã£ãæ§æå€ãåŠçãããããå¿ èŠããããŸããã ããã«ãããã¢ããªã±ãŒã·ã§ã³å šäœãç°¡çŽ åãããŸãã (æ§æèªäœãå€å°è€éã«ãªããŸãããããã¯å®å šæ§ãšã®æèçãªãã¬ãŒããªãã§ãã) éåžžã®æ§æã«æ»ãã®ã¯éåžžã«ç°¡åã§ãäžè¶³ããŠããéšåãè¿œå ããã ãã§ãã ã³ã³ãã€ã«ãããæ§æããéå§ããè¿œå éšåã®å®è£ ãåŸã§å»¶æããæ¹ãç°¡åã§ãã
- ããŒãžã§ã³ç®¡çãããæ§æã æ§æã®å€æŽã¯åãéçºããã»ã¹ã«åŸããããçµæãšããŠåºæã®ããŒãžã§ã³ã®ã¢ãŒãã£ãã¡ã¯ããåŸãããŸãã ããã«ãããå¿ èŠã«å¿ããŠèšå®ãå ã«æ»ãããšãã§ããŸãã XNUMX 幎åã«äœ¿çšãããæ§æããããã€ããããšãã§ãããŸã£ããåãããã«æ©èœããŸãã å®å®ããæ§æã«ãããåæ£ã·ã¹ãã ã®äºæž¬å¯èœæ§ãšä¿¡é Œæ§ãåäžããŸãã æ§æã¯ã³ã³ãã€ã«æã«åºå®ãããéçšã·ã¹ãã ã§ã¯ç°¡åã«æ¹ããã§ããŸããã
- ã¢ãžã¥ãŒã«æ§ã ææ¡ããããã¬ãŒã ã¯ãŒã¯ã¯ã¢ãžã¥ãŒã«åŒã§ãããã¢ãžã¥ãŒã«ã¯ããŸããŸãªæ¹æ³ã§çµã¿åãããããšãã§ããŸãã
ããŸããŸãªæ§æ (ã»ããã¢ãã/ã¬ã€ã¢ãŠã) ããµããŒãããŸãã ç¹ã«ãå°èŠæš¡ãªã·ã³ã°ã«ããŒãã®ã¬ã€ã¢ãŠããšå€§èŠæš¡ãªãã«ãããŒãã®èšå®ãå¯èœã§ãã è€æ°ã®éçšã¬ã€ã¢ãŠãã䜿çšããããšã¯åççã§ãã - ãã¹ãäžã ãã¹ãç®çã§ã¯ãã¢ã㯠ãµãŒãã¹ãå®è£ ãããããåå®å šãªæ¹æ³ã§äŸåé¢ä¿ãšããŠäœ¿çšããå ŽåããããŸãã ããŸããŸãªéšåãã¢ãã¯ã«çœ®ãæãããããã€ãã®ç°ãªããã¹ã ã¬ã€ã¢ãŠããåæã«ç¶æã§ããŸãã
- çµ±åãã¹ãã åæ£ã·ã¹ãã ã§ã¯ãçµ±åãã¹ãã®å®è¡ãé£ããå ŽåããããŸãã å®å
šãªåæ£ã·ã¹ãã ã®ã¿ã€ã ã»ãŒãæ§æã«èª¬æããã¢ãããŒãã䜿çšãããšããã¹ãŠã®åæ£éšåãåäžã®ãµãŒããŒäžã§å¶åŸ¡å¯èœãªæ¹æ³ã§å®è¡ã§ããŸãã ç¶æ³ãç䌌ããã®ã¯ç°¡åã§ã
ããããã®ãµãŒãã¹ãå©çšã§ããªããªã£ããšãã
ãã¡ãªãã
ã³ã³ãã€ã«ãããæ§æã¢ãããŒãã¯ãéåžžã®ãæ§æãšã¯ç°ãªãããããã¹ãŠã®ããŒãºã«é©åãããšã¯éããŸããã ã³ã³ãã€ã«ãããæ§æã®æ¬ ç¹ã®ããã€ãã次ã«ç€ºããŸãã
- éçæ§æã ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã«é©ããŠããããã§ã¯ãªããããããŸããã å Žåã«ãã£ãŠã¯ããã¹ãŠã®å®å šå¯Ÿçãåé¿ããŠãéçšç°å¢ã®æ§æãè¿ éã«ä¿®æ£ããå¿ èŠããããŸãã ãã®ã¢ãããŒãã§ã¯äœæ¥ãããå°é£ã«ãªããŸãã æ§æãå€æŽããåŸã¯ãã³ã³ãã€ã«ãšåãããã€ã¡ã³ããå¿ èŠã§ãã ãããç¹åŸŽã§ããããè² æ ã§ããããŸãã
- æ§æã®çæã æ§æãäœããã®èªååããŒã«ã«ãã£ãŠçæãããå Žåããã®ã¢ãããŒãã§ã¯ãã®åŸã®ã³ã³ãã€ã«ãå¿ èŠã«ãªããŸã (çµæçã«å€±æããå¯èœæ§ããããŸã)ã ãã®è¿œå æé ããã«ã ã·ã¹ãã ã«çµ±åããã«ã¯ãè¿œå ã®äœæ¥ãå¿ èŠã«ãªãå ŽåããããŸãã
- 楜åšã çŸåšãããã¹ãããŒã¹ã®æ§æã«äŸåããããŒã«ãæ°å€ã䜿çšãããŠããŸãã ãããã®ããã€ã
æ§æãã³ã³ãã€ã«ããããšãã¯é©çšãããŸããã - èãæ¹ã®è»¢æãå¿ èŠã§ãã éçºè ãš DevOps ã¯ããã¹ãæ§æãã¡ã€ã«ã«ç²ŸéããŠããŸãã 圌ãã«ãšã£ãŠãèšå®ãã³ã³ãã€ã«ãããšããèãã¯å¥åŠã«èŠãããããããŸããã
- ã³ã³ãã€ã«å¯èœãªæ§æãå°å ¥ããåã«ãé«å質ã®ãœãããŠã§ã¢éçºããã»ã¹ãå¿ èŠã§ãã
å®è£ ãããäŸã«ã¯ããã€ãã®å¶éããããŸãã
- ããŒãå®è£
ã«èŠæ±ãããŠããªãè¿œå ã®æ§æãæäŸããå Žåãã³ã³ãã€ã©ãŒã¯æ¬ èœããŠããå®è£
ãæ€åºããã®ã«åœ¹ç«ã¡ãŸããã ããã¯æ¬¡ã®æ¹æ³ã§è§£æ±ºã§ããŸãã
HList
ãŸãã¯ããã¬ã€ããš Cake Pattern ã®ä»£ããã«ããŒãæ§æçšã® ADT (ã±ãŒã¹ ã¯ã©ã¹)ã - èšå®ãã¡ã€ã«ã«å®åæãæå®ããå¿
èŠããããŸã:(
package
,import
,object
宣èš;
override def
ã¯ããã©ã«ãå€ãæã€ãã©ã¡ãŒã¿ãè¡šããŸã)ã ããã¯ãDSL ã䜿çšããŠéšåçã«å¯ŸåŠã§ããå¯èœæ§ããããŸãã - ãã®æçš¿ã§ã¯ãåæ§ã®ããŒãã®ã¯ã©ã¹ã¿ãŒã®åçåæ§æã«ã€ããŠã¯èª¬æããŸããã
ãŸãšã
ãã®æçš¿ã§ã¯ãã¿ã€ãã»ãŒããªæ¹æ³ã§ãœãŒã¹ ã³ãŒãå ã§æ§æãçŽæ¥è¡šããšããã¢ã€ãã¢ã«ã€ããŠèª¬æããŸããã ãã®ã¢ãããŒãã¯ãXML ããã®ä»ã®ããã¹ãããŒã¹ã®æ§æã®ä»£ãããšããŠãå€ãã®ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšã§ããŸãã ãã®äŸã¯ Scala ã§å®è£ ãããŠããŸãããä»ã®ã³ã³ãã€ã«å¯èœãªèšèª (KotlinãC#ãSwift ãªã©) ã«ç¿»èš³ããããšãã§ããŸãã æ°ãããããžã§ã¯ãã§ãã®ã¢ãããŒããè©ŠããŠãããŸãé©åããªãå Žåã¯ãæãªããã®æ¹æ³ã«åãæ¿ããããšãã§ããŸãã
ãã¡ãããã³ã³ãã€ã«å¯èœãªæ§æã«ã¯é«å質ã®éçºããã»ã¹ãå¿ èŠã§ãã ãã®ä»£ããã«ãåæ§ã«é«å質ã§å ç¢ãªæ§æãæäŸããããšãçŽæããŸãã
ãã®ã¢ãããŒãã¯ããŸããŸãªæ¹æ³ã§æ¡åŒµã§ããŸãã
- ãã¯ãã䜿çšããŠæ§ææ€èšŒãå®è¡ããããžãã¹ ããžãã¯å¶çŽã倱æããå Žåã«ã¯ã³ã³ãã€ã«æã«å€±æããå¯èœæ§ããããŸãã
- DSL ãå®è£ ãããšããã¡ã€ã³ ãŠãŒã¶ãŒã«ããããããæ¹æ³ã§æ§æãè¡šçŸã§ããŸãã
- èªåæ§æ調æŽã«ããåçãªãªãœãŒã¹ç®¡çã ããšãã°ãã¯ã©ã¹ã¿ãŒ ããŒãã®æ°ã調æŽããå Žåã(1) ããŒãã®æ§æããããã«å€æŽããå¿ èŠããããããããŸããã (2) ã¯ã©ã¹ã¿ãŒãããŒãžã£ãŒãæ°ããããŒãæ å ±ãåä¿¡ããŸãã
æè¬
ãã®æçš¿ã®èçš¿ã«å¯ŸããŠãç§ãããæ確ã«ããã®ã«åœ¹ç«ã€ã€ã³ã¹ãã¬ãŒã·ã§ã³ã«æºã¡ããã£ãŒãããã¯ãäžããŠããã Andrey SaksonovãPavel PopovãAnton Nehaev ã«æè¬ããããšæããŸãã
åºæïŒ habr.com