แ‹จแ‰ฐแŠจแ‹แˆแˆˆ แˆตแˆญแ‹“แ‰ต แˆŠแŒฃแˆ˜แˆญ แ‹จแˆšแ‰ฝแˆ แ‹แ‰…แˆญ

แ‰ แ‹šแˆ… แˆแŒฅแ แ‹แˆตแŒฅ แ‹จแ‰ฐแŠจแ‹แˆแˆˆ แˆตแˆญแ‹“แ‰ต แ‹แ‰…แˆญแŠ• แ‹จแˆšแ‹ซแˆตแ‰ฐแŠ“แŒแ‹ตแ‰ แ‰ตแŠ• แŠ แˆตแ‹ฐแˆณแ‰ฝ แˆ˜แŠ•แŒˆแ‹ต แˆ›แŒ‹แˆซแ‰ต แŠฅแŠ•แˆแˆแŒ‹แˆˆแŠ•แข
แ‹แ‰…แˆฉ แ‰ แŠ แˆตแ‰ฐแˆ›แˆ›แŠ แˆแŠ”แ‰ณ แ‰ แ‰€แŒฅแ‰ณ แ‰  Scala แ‰‹แŠ•แ‰‹ แŠแ‹ แ‹จแˆšแ‹ˆแŠจแˆˆแ‹แข แŠ แŠ•แ‹ต แˆแˆณแˆŒ แ‰ตแŒแ‰ แˆซ แ‰ แ‹แˆญแ‹แˆญ แ‰ฐแŒˆแˆแŒฟแˆ. แ‰ แŠ แŒ แ‰ƒแˆ‹แ‹ญ แ‹จแŠฅแ‹ตแŒˆแ‰ต แˆ‚แ‹ฐแ‰ต แˆ‹แ‹ญ แ‰ฐแŒฝแŠฅแŠ–แŠ• แŒจแˆแˆฎ แ‹จแ‰ฐแˆˆแ‹ซแ‹ฉ แ‹จแ‹แˆณแŠ” แˆƒแˆณแ‰ฆแ‰ฝ แ‰ฐแ‰ฅแˆซแˆญแ‰ฐแ‹‹แˆ.

แ‹จแ‰ฐแŠจแ‹แˆแˆˆ แˆตแˆญแ‹“แ‰ต แˆŠแŒฃแˆ˜แˆญ แ‹จแˆšแ‰ฝแˆ แ‹แ‰…แˆญ

(แ‰ แˆฉแˆฒแ‹ซแŠ›)

แˆ˜แŒแ‰ขแ‹ซ

แŒ แŠ•แŠซแˆซ แ‹จแ‰ฐแŠจแ‹แˆแˆ‰ แˆตแˆญแ‹“แ‰ถแ‰ฝแŠ• แˆ˜แŒˆแŠ•แ‰ฃแ‰ต แ‰ แˆแˆ‰แˆ แŠ แŠ•แŒ“แ‹Žแ‰ฝ แˆ‹แ‹ญ แ‰ตแŠญแŠญแˆˆแŠ› แŠฅแŠ“ แ‹ˆแŒฅแŠแ‰ต แ‹ซแˆˆแ‹ แ‹แ‰…แˆญ แˆ˜แŒ แ‰€แˆแŠ• แ‹ญแŒ แ‹ญแ‰ƒแˆแข แ‹จแ‰ฐแˆˆแˆ˜แ‹ฐแ‹ แˆ˜แแ‰ตแˆ” แ‹จแŒฝแˆ‘แ แˆ›แˆฐแˆ›แˆซแ‰ต แˆ˜แŒแˆˆแŒซแŠ• (แ‰ดแˆซแŽแˆญแˆแฃ แˆŠแ‰ปแˆ แ‹จแˆšแ‰ฝแˆ แ‹ˆแ‹ญแˆ แ‰ฐแˆ˜แˆณแˆณแ‹ญ แ‹จแˆ†แŠ แŠแŒˆแˆญ) แŠฅแŠ“ แ‰ แˆซแˆต-แˆฐแˆญ แ‹จแˆšแˆ˜แŠแŒฉ แ‹จแ‹แ‰…แˆญ แ‹แ‹ญแˆŽแ‰ฝแŠ• (แ‰ฅแ‹™แ‹แŠ• แŒŠแ‹œ - แˆˆแŠฅแ‹ซแŠ•แ‹ณแŠ•แ‹ฑ แˆ˜แˆตแ‰€แˆˆแŠ› แˆ˜แŠ•แŒˆแ‹ต/แˆšแŠ“) แˆ˜แŒ แ‰€แˆ แŠแ‹แข แ‰ แŠฅแ‹ซแŠ•แ‹ณแŠ•แ‹ฑ แ‹จแŒแŠ•แŠ™แŠแ‰ต แŠ แŠ•แŒ“แ‹Žแ‰ฝ แˆ‹แ‹ญ แ‰ฐแˆ˜แˆณแˆณแ‹ญ แˆตแˆชแ‰ถแ‰ฝ แ‰ฐแˆ˜แˆณแˆณแ‹ญ แ•แˆฎแ‰ถแŠฎแˆŽแ‰ฝแŠ• แˆ˜แŒ แ‰€แˆ แŠฅแŠ•แˆแˆแŒ‹แˆˆแŠ• (แŠ แˆˆแ‰ แˆˆแ‹šแ‹ซ แ‰ฐแŠณแŠ‹แŠแŠแ‰ต แ‰ฝแŒแˆฎแ‰ฝ แ‹ซแŒ‹แŒฅแˆ™แŠ“แˆ)แข แ‰ JVM แ‹“แˆˆแˆ แ‹ญแˆ… แˆ›แˆˆแ‰ต แ‰ขแ‹ซแŠ•แˆต แ‹จแˆ˜แˆแŠฅแŠญแ‰ต แˆ˜แˆ‹แˆ‹แŠชแ‹ซ แ‰คแ‰ฐ-แˆ˜แŒฝแˆแแ‰ต แ‰ แˆแˆ‰แˆ แ‹จแˆ˜แŒˆแŠ“แŠ› แŠ–แ‹ถแ‰ฝ แˆ‹แ‹ญ แŠ แŠ•แ‹ต แŠ แ‹ญแŠแ‰ต แˆตแˆชแ‰ต แˆ˜แˆ†แŠ• แŠ แˆˆแ‰ แ‰ต แˆ›แˆˆแ‰ต แŠแ‹แข

แˆตแˆญแ‹“แ‰ฑแŠ• แˆตแˆˆแˆ˜แˆžแŠจแˆญแˆต? แŠฅแˆญแŒแŒฅ แŠแ‹แฃ แ‹ˆแ‹ฐ แ‹แˆ…แ‹ฐแ‰ต แˆแ‰ฐแŠ“แ‹Žแ‰ฝ แŠจแˆ˜แˆแŒฃแ‰ณแ‰ฝแŠ• แ‰ แŠแ‰ต แˆˆแˆแˆ‰แˆ แŠ แŠซแˆ‹แ‰ต แ‹จแ‹ฉแŠ’แ‰ต แˆแ‰ฐแŠ“แ‹Žแ‰ฝ แˆŠแŠ–แˆจแŠ• แ‹ญแŒˆแ‰ฃแˆแข แ‹จแˆแ‰ฐแŠ“ แ‹แŒคแ‰ถแ‰ฝแŠ• แ‰  runtime แˆ‹แ‹ญ แˆˆแˆ›แ‹แŒฃแ‰ต แŠฅแŠ•แ‹ตแŠ•แ‰ฝแˆ แ‹จแˆแˆ‰แˆ แ‰คแ‰ฐ-แˆ˜แŒปแˆ•แแ‰ต แˆตแˆชแ‰ถแ‰ฝ แ‰ แˆแˆˆแ‰ฑแˆ แ‹จแˆฉแŒซ แŒŠแ‹œ แŠฅแŠ“ แ‹จแˆ™แŠจแˆซ แŠ แŠซแ‰ฃแ‰ขแ‹Žแ‰ฝ แ‰ฐแˆ˜แˆณแˆณแ‹ญ แˆ˜แ‹ซแ‹›แ‰ธแ‹แŠ• แˆ›แˆจแŒ‹แŒˆแŒฅ แŠ แˆˆแ‰ฅแŠ•แข

แ‹จแ‹แˆ…แ‹ฐแ‰ต แˆ™แŠจแˆซแ‹Žแ‰ฝแŠ• แ‰ แˆšแ‹ซแŠซแˆ‚แ‹ฑแ‰ แ‰ต แŒŠแ‹œ แ‰ แˆแˆ‰แˆ แŠ แŠ•แŒ“แ‹Žแ‰ฝ แˆ‹แ‹ญ แŠ แŠ•แ‹ต แŠ แ‹ญแŠแ‰ต แ‹จแˆ˜แˆ›แˆชแ‹ซ แˆ˜แŠ•แŒˆแ‹ต แŠฅแŠ•แ‹ฒแŠ–แˆญแ‹Žแ‰ต แ‰ฅแ‹™ แŒŠแ‹œ แ‰€แˆ‹แˆ แŠแ‹แข แ‰ฐแˆ˜แˆณแˆณแ‹ญ แ‹จแŠญแแˆ แ‹ฑแŠซ แ‰ แˆ›แˆฐแˆ›แˆซแ‰ต แˆ‹แ‹ญ แˆ˜แŒ แ‰€แˆ™แŠ• แˆ›แˆจแŒ‹แŒˆแŒฅ แŠ แˆˆแ‰ฅแŠ•แข (แ‰ แ‰ฐแˆˆแ‹ซแ‹ฉ แŠ แŠ•แŒ“แ‹Žแ‰ฝ แˆ‹แ‹ญ แ‹จแ‰ฐแˆˆแ‹ซแ‹ฉ แ‹จแŠญแแˆ แ‹ฑแŠซแ‹Žแ‰ฝแŠ• แˆ˜แŒ แ‰€แˆ แ‹ญแ‰ปแˆ‹แˆแฃแŠแŒˆแˆญ แŒแŠ• แ‹ญแˆ…แŠ• แ‹แ‰…แˆญ แˆˆแˆ˜แ‹ˆแŠจแˆ แŠฅแŠ“ แ‰ แ‰ตแŠญแŠญแˆ แˆˆแˆ›แˆฐแˆ›แˆซแ‰ต แ‹จแ‰ แˆˆแŒ  แŠจแ‰ฃแ‹ต แŠแ‹แข

แ‹แ‰…แˆจแ‰ต แŠจแˆถแแ‰ตแ‹Œแˆฉ แŒ‹แˆญ แŠ แ‰ฅแˆฎ แ‹จแˆ˜แˆปแˆปแˆ แŠ แ‹แˆ›แˆšแ‹ซ แŠ แˆˆแ‹แข แ‹จแ‰ฐแˆˆแ‹ซแ‹ฉ แŠแŒˆแˆฎแ‰ฝแŠ• แˆˆแˆ˜แˆˆแ‹จแ‰ต แ‰ฅแ‹™ แŒŠแ‹œ แˆตแˆชแ‰ถแ‰ฝแŠ• แŠฅแŠ•แŒ แ‰€แˆ›แˆˆแŠ•แข
แ‹จแˆถแแ‰ตแ‹Œแˆญ แ‹แŒแˆ˜แ‰ฐ แˆˆแ‹แŒฅ แ‹ฐแˆจแŒƒแ‹Žแ‰ฝ. แ‰ แˆตแˆชแ‰ต แŠ แˆตแ‰ฐแ‹ณแ‹ฐแˆญ แˆตแˆญ แ‹ซแˆˆแ‹แŠ• แ‹แ‰…แˆจแ‰ต แˆˆแˆ˜แˆธแˆแŠ• แŠฅแŠ“ แ‹จแ‰ฐแˆˆแ‹ซแ‹ฉ แ‹แ‰…แˆฎแ‰ฝแŠ• แŠจแŠ แŠ•แ‹ณแŠ•แ‹ต แˆ˜แˆˆแ‹ซแ‹Žแ‰ฝ แŒ‹แˆญ แˆ˜แˆˆแ‹จแ‰ต แˆแŠญแŠ•แ‹ซแ‰ณแ‹Š แ‹ญแˆ˜แˆตแˆ‹แˆแข แ‰ แˆแˆญแ‰ต แ‹แˆตแŒฅ แŠ แŠ•แ‹ต แ‹แ‰…แˆจแ‰ต แ‰ฅแ‰ป แŠซแˆˆ แŠแŒ แˆ‹ แˆฅแˆชแ‰ตแŠ• แŠฅแŠ•แ‹ฐ แˆ˜แˆˆแ‹ซ แˆแŠ•แŒ แ‰€แˆ แŠฅแŠ•แ‰ฝแˆ‹แˆˆแŠ•แข แŠ แŠ•แ‹ณแŠ•แ‹ต แŒŠแ‹œ แ‰ แˆญแŠซแ‰ณ แ‹จแˆแˆญแ‰ต แŠ แŠซแ‰ฃแ‰ขแ‹Žแ‰ฝ แˆŠแŠ–แˆจแŠ• แ‹ญแ‰ฝแˆ‹แˆแข แŠฅแŠ“ แˆˆแŠฅแ‹ซแŠ•แ‹ณแŠ•แ‹ฑ แŠ แŠซแ‰ฃแ‰ข แ‹จแ‰ฐแˆˆแ‹จ แ‹จแˆ›แ‹‹แ‰€แˆชแ‹ซ แ‰…แˆญแŠ•แŒซแ แˆŠแ‹ซแˆตแˆแˆแŒˆแŠ• แ‹ญแ‰ฝแˆ‹แˆแข แˆตแˆˆแ‹šแˆ… แ‹แ‰…แˆจแ‰ถแ‰ฝ แˆแ‹ฉ แˆแ‹ฉ แ‹แ‰…แˆฎแ‰ฝแŠ• แˆˆแˆ˜แˆˆแ‹จแ‰ต แ‰ แ‰…แˆญแŠ•แŒซแ แŠฅแŠ“ แˆตแˆชแ‰ต แˆŠแˆฐแ‹จแˆ™ แ‹ญแ‰ฝแˆ‹แˆ‰แข แŠฅแ‹ซแŠ•แ‹ณแŠ•แ‹ฑ แ‹จแ‰…แˆญแŠ•แŒซแ แˆ˜แˆˆแ‹ซ แŠฅแŠ“ แˆฅแˆชแ‰ต แ‰ แŠฅแ‹ซแŠ•แ‹ณแŠ•แ‹ฑ แˆ˜แˆตแ‰€แˆˆแŠ› แˆ˜แŠ•แŒˆแ‹ต แˆ‹แ‹ญ แŠซแˆ‰ แ‹จแ‰ฐแŠจแ‹แˆแˆ‰ แŠ–แ‹ถแ‰ฝแฃ แ‹ˆแ‹ฐแ‰ฆแ‰ฝแฃ แ‹จแ‹แŒช แˆ€แ‰ฅแ‰ถแ‰ฝแฃ แ‹จแŠญแแˆ แ‹ฑแŠซ แ‰คแ‰ฐแˆ˜แƒแˆ•แแ‰ต แŠแŒ แˆ‹ แŒฅแˆแˆญ แŒ‹แˆญ แ‹ญแ‹›แˆ˜แ‹ณแˆแข แŠฅแ‹šแˆ… แŠแŒ แˆ‹แ‹แŠ• แ‰…แˆญแŠ•แŒซแ แ‰ฅแ‰ป แŠฅแŠ•แˆธแแŠ“แˆˆแŠ• แŠฅแŠ“ แŠ แ‹ˆแ‰ƒแ‰€แˆฎแ‰ฝแŠ• แ‰ แˆถแˆตแ‰ต แŠ แŠซแˆ แŠ แˆตแˆญแ‹ฎแˆฝ แˆตแˆชแ‰ต (1.2.3) แŠฅแŠ•แˆˆแ‹ซแˆˆแŠ•แฃ แˆแŠญ แŠฅแŠ•แ‹ฐ แˆŒแˆŽแ‰ฝ แ‰…แˆญแˆถแ‰ฝแข

แ‰ แ‹˜แˆ˜แŠ“แ‹Š แŠ แŠซแ‰ฃแ‰ขแ‹Žแ‰ฝ แ‹จแˆ›แ‹‹แ‰€แˆชแ‹ซ แ‹แ‹ญแˆŽแ‰ฝ แŠจแŠ แˆแŠ• แ‰ แŠ‹แˆ‹ แ‰ แŠฅแŒ… แŠ แˆแ‰ฐแˆปแˆปแˆ‰แˆแข แ‰ แ‰ฐแˆˆแˆแ‹ถ แŠฅแŠ› แŠฅแŠ•แˆแŒฅแˆซแˆˆแŠ•
แ‰ แˆ›แˆฐแˆ›แˆซแ‰ต แŒŠแ‹œ แ‹แ‹ญแˆŽแ‰ฝแŠ• แˆ›แ‹‹แ‰€แˆญ แŠฅแŠ“ แ‰ แแŒนแˆ แŠ แ‰ตแŠ•แŠซแ‰ธแ‹ แ‰ แŠ‹แˆ‹. แˆตแˆˆแ‹šแˆ… แˆˆแˆแŠ•แ‹ตแŠแ‹ แŠ แˆแŠ•แˆ แˆˆแˆแŠ•แ‹ตแŠแ‹ แˆˆแˆ›แ‹‹แ‰€แˆญ แ‹แ‹ญแˆŽแ‰ฝ แ‹จแŒฝแˆแ แ‰…แˆญแŒธแ‰ต แ‹จแˆแŠ•แŒ แ‰€แˆ˜แ‹? แŠ แ‹‹แŒญ แŠ แˆ›แˆซแŒญ แŠ แ‹ˆแ‰ƒแ‰€แˆฉแŠ• แ‰ แˆ›แŒ แŠ“แ‰€แˆญ แŠญแแˆ แ‹แˆตแŒฅ แˆ›แˆตแ‰€แˆ˜แŒฅ แŠฅแŠ“ แ‰ แˆ›แŒ แŠ“แ‰€แˆญ-แŒŠแ‹œ แ‹แ‰…แˆญ แˆ›แˆจแŒ‹แŒˆแŒฅ แŒฅแ‰…แˆ แˆ›แŒแŠ˜แ‰ต แŠแ‹แข

แ‰ แ‹šแˆ… แˆแŠกแŠญ แŒฝแˆแ แ‹แˆตแŒฅ แŠ แ‹ˆแ‰ƒแ‰€แˆฉแŠ• แ‰ แ‰ฐแ‰€แŠแ‰ฃแ‰ แˆจ แ‰…แˆญแˆต แ‹แˆตแŒฅ แ‹จแˆ˜แŒ แ‰ แ‰…แŠ• แˆ€แˆณแ‰ฅ แŠฅแŠ•แˆ˜แˆจแˆแˆซแˆˆแŠ•.

แˆŠแŒฃแˆ˜แˆญ แ‹จแˆšแ‰ฝแˆ แ‹แ‰…แˆญ

แ‰ แ‹šแˆ… แŠญแแˆ แ‹แˆตแŒฅ แ‹จแˆตแ‰ณแ‰ฒแŠญ แ‹แ‰…แˆจแ‰ต แˆแˆณแˆŒแŠ• แŠฅแŠ•แŠแŒ‹แŒˆแˆซแˆˆแŠ•. แˆแˆˆแ‰ต แ‰€แˆ‹แˆ แŠ แŒˆแˆแŒแˆŽแ‰ถแ‰ฝ - แ‹จ echo แŠ แŒˆแˆแŒแˆŽแ‰ต แŠฅแŠ“ แ‹จ echo แŠ แŒˆแˆแŒแˆŽแ‰ต แ‹ฐแŠ•แ‰ แŠ› แŠฅแ‹จแ‰ฐแ‹‹แ‰€แˆฉ แŠฅแŠ“ แŠฅแ‹จแ‰ฐแ‰ฐแŒˆแ‰ แˆฉ แŠ“แ‰ธแ‹แข แŠจแ‹šแ‹ซแˆ แŠจแˆแˆˆแ‰ฑแˆ แŠ แŒˆแˆแŒแˆŽแ‰ถแ‰ฝ แŒ‹แˆญ แˆแˆˆแ‰ต แ‹จแ‰ฐแˆˆแ‹ซแ‹ฉ แ‹จแ‰ฐแŠจแ‹แˆแˆ‰ แˆตแˆญแ‹“แ‰ถแ‰ฝ แ‰ แ‰…แŒฝแ‰ แ‰ต แ‹ญแ‹ฐแˆจแŒ‹แˆ‰. แŠ แŠ•แ‹ฐแŠ›แ‹ แˆˆแŠ แŠ•แ‹ต แŠแŒ แˆ‹ แˆ˜แˆตแ‰€แˆˆแŠ› แˆ˜แŠ•แŒˆแ‹ต แ‹แ‰…แˆญ แˆฒแˆ†แŠ• แˆŒแˆ‹แŠ›แ‹ แ‹ฐแŒแˆž แˆˆแˆแˆˆแ‰ต แŠ แŠ•แŒ“แ‹Žแ‰ฝ แ‹แ‰…แˆญ แŠแ‹แข

แ‹จแ‰ฐแˆˆแˆ˜แ‹ฐแ‹ แ‹จแ‰ฐแŠจแ‹แˆแˆˆ แˆตแˆญแ‹“แ‰ต แŒฅแ‰‚แ‰ต แŠ แŠ•แŒ“แ‹Žแ‰ฝแŠ• แ‹ซแŠซแ‰ตแ‰ณแˆ. แŠ แŠ•แŒ“แ‹Žแ‰น แŠ แŠ•แ‹ณแŠ•แ‹ต แ‹“แ‹ญแŠแ‰ถแ‰ฝแŠ• แ‰ แˆ˜แŒ แ‰€แˆ แˆŠแ‰ณแ‹ˆแ‰ แ‹ญแ‰ฝแˆ‹แˆ‰-

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-แ‰ขแ‰ต แŠฅแˆดแ‰ถแ‰ฝ แ‰ฅแ‰ป แŠฅแŠ•แ‹ฒแŠ–แˆซแ‰ธแ‹ แ‰ฐแˆแ‰…แ‹ถแˆˆแ‰ณแˆแข แˆˆแ‹šแˆ… แ‹แ‰…แˆจแ‰ต แŠ แ‰€แˆซแˆจแ‰ฅ แ‹ญแˆ…แŠ•แŠ• แ‰คแ‰ฐ-แˆ˜แŒฝแˆแแ‰ต แˆˆแˆ˜แŒ แ‰€แˆ แˆแŠ•แˆ แˆ˜แˆตแˆแˆญแ‰ต แ‹จแˆˆแˆแข แˆแŠญ แ‰ แŒฃแˆ แŒฅแˆฉ แ‹จแˆšแˆตแˆ›แˆ› แ‹ญแˆ˜แˆตแˆ‹แˆแข

แˆˆแŠคแ‰ฝแ‰ฒแ‰ฒแ’ (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 แ‰ฐแŠจแ‰ณแ‰ณแ‹ญแŠแ‰ต แŒ‹แˆญ แŠแ‹แก-

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

แ‹จแ‰ต RequestMessage แ‹ฐแŠ•แ‰ แŠ› แ‹ˆแ‹ฐ แŠ แŒˆแˆแŒ‹แ‹ญ แˆ˜แˆ‹แŠญ แ‹จแˆšแ‰ฝแˆ‹แ‰ธแ‹ แˆ˜แˆฐแˆจแ‰ณแ‹Š แ‹จแˆ˜แˆแŠฅแŠญแ‰ต แŠ แ‹ญแŠแ‰ต แŠแ‹แข ResponseMessage แ‹จแŠ แŒˆแˆแŒ‹แ‹ญ แˆแˆ‹แˆฝ แˆ˜แˆแŠฅแŠญแ‰ต แŠแ‹แข แ‰ แŠฅแˆญแŒแŒฅ แ‹จแŒแŠ•แŠ™แŠแ‰ต แ•แˆฎแ‰ถแŠฎแˆ‰แŠ• แ‰ แˆšแˆแˆˆแŒˆแ‹ แ‰ตแŠญแŠญแˆˆแŠ›แŠแ‰ต แ‹จแˆšแŒˆแˆแŒน แˆŒแˆŽแ‰ฝ แ‹จแ•แˆฎแ‰ถแŠฎแˆ แˆ˜แŒแˆˆแŒซแ‹Žแ‰ฝแŠ• แˆแŠ•แˆแŒฅแˆญ แŠฅแŠ•แ‰ฝแˆ‹แˆˆแŠ•แข

แˆˆแ‹šแˆ… แˆแŒฅแ แ‹“แˆ‹แˆ› แ‰€แˆˆแˆ แ‹ซแˆˆ แ‹จแ•แˆฎแ‰ถแŠฎแˆ‰แŠ• แˆตแˆชแ‰ต แŠฅแŠ•แŒ แ‰€แˆ›แˆˆแŠ•แก-

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

แ‰ แ‹šแˆ… แ‹จแ•แˆฎแ‰ถแŠฎแˆ แŒฅแ‹ซแ‰„ แˆ˜แˆแŠฅแŠญแ‰ต แ‰ แ‹ฉแŠ แˆญแŠคแˆ แˆ‹แ‹ญ แ‰ฐแ‹ซแ‹ญแ‹Ÿแˆ แŠฅแŠ“ แ‹จแˆแˆ‹แˆฝ แˆ˜แˆแŠฅแŠญแ‰ต แŠฅแŠ•แ‹ฐ แŒแˆแŒฝ แˆ•แ‰ฅแˆจแ‰แˆแŠ แ‹ญแˆ˜แˆˆแˆณแˆแข

แ‹จแŠ แŒˆแˆแŒแˆŽแ‰ต แ‹แ‰…แˆญ แ‰ แŠ แŒˆแˆแŒแˆŽแ‰ต แˆตแˆแฃ แ‰ แ‹ˆแ‹ฐแ‰ฆแ‰ฝ แˆตแ‰ฅแˆตแ‰ฅ แŠฅแŠ“ แ‰ แŠ แŠ•แ‹ณแŠ•แ‹ต แŒฅแŒˆแŠžแ‰ฝ แˆŠแŒˆแˆˆแŒฝ แ‹ญแ‰ฝแˆ‹แˆแข แ‰  Scala แ‹แˆตแŒฅ แŠฅแŠแ‹šแˆ…แŠ• แˆแˆ‰ แŠ แŠซแˆ‹แ‰ต แŠฅแŠ•แ‹ดแ‰ต แˆ˜แ‹ˆแŠจแˆ แŠฅแŠ•แ‹ฐแˆšแ‰ปแˆ แŒฅแ‰‚แ‰ต แˆŠแˆ†แŠ‘ แ‹จแˆšแ‰ฝแˆ‰ แˆ˜แŠ•แŒˆแ‹ถแ‰ฝ แŠ แˆ‰ (แˆˆแˆแˆณแˆŒแฃ HList, แŠ แˆแŒ€แ‰ฅแˆซ แ‹แˆ‚แ‰ฅ แŠ แ‹ญแŠแ‰ถแ‰ฝ). แˆˆแ‹šแˆ… แˆแŒฅแ แ‹“แˆ‹แˆ› แ‹จแŠฌแŠญ แ“แ‰ฐแˆญแŠ• แŠฅแŠ•แŒ แ‰€แˆ›แˆˆแŠ• แŠฅแŠ“ แˆŠแŒฃแˆ˜แˆฉ แ‹จแˆšแ‰ฝแˆ‰ แ‰แˆญแŒฅแˆซแŒฎแ‰ฝแŠ• (แˆžแŒแˆŽแ‰ฝแŠ•) แŠฅแŠ•แ‹ฐ แ‰ฃแˆ…แˆชแ‹ซแ‰ต แŠฅแŠ•แ‹ˆแŠญแˆ‹แˆˆแŠ•แข (แ‹จแŠฌแŠญ แ“แ‰ฐแˆญแŠ• แˆˆแ‹šแˆ… แ‹จแ‰ฐแ‰€แŠ“แŒ€ แ‹จแ‹แ‰…แˆจแ‰ต แŠ แ‰€แˆซแˆจแ‰ฅ แˆ˜แˆตแˆแˆญแ‰ต แŠ แ‹ญแ‹ฐแˆˆแˆแก แ‹จแˆƒแˆณแ‰ก แ‰ฐแŒแ‰ฃแˆซแ‹Š แˆŠแˆ†แŠ• แ‹จแˆšแ‰ฝแˆ แŠ แŠ•แ‹ต แ‰ฅแ‰ป แŠแ‹แข)

แŒฅแŒˆแŠžแ‰ฝ แ‹จแŠฌแŠญ แŒฅแˆˆแ‰ตแŠ• แŠฅแŠ•แ‹ฐ แˆŒแˆŽแ‰ฝ แŠ แŠ•แŒ“แ‹Žแ‰ฝ แ‹จแˆ˜แŒจแˆจแˆป แŠแŒฅแ‰ฆแ‰ฝแŠ• แ‰ แˆ˜แŒ แ‰€แˆ แˆŠแ‹ˆแŠจแˆ‰ แ‹ญแ‰ฝแˆ‹แˆ‰แก

  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) แŠฅแŠ“ แ‰ แŠฎแŠ•แŠญแˆชแ‰ต แ‹แ‰…แˆจแ‰ต แ‹แˆตแŒฅ แŠจแ‹˜แˆˆแˆแŠ• แŠฅแŠ•แ‹ฐ แŠแ‰ฃแˆช แŠฅแˆดแ‰ต แŒฅแ‰…แˆ แˆ‹แ‹ญ แ‹ญแ‹แˆ‹แˆ.

แ‰  echo แŠ แŒˆแˆแŒแˆŽแ‰ต แ‹ฐแŠ•แ‰ แŠ› แ‹แ‰…แˆญ แˆ‹แ‹ญ แŒฅแŒˆแŠแŠแ‰ตแŠ• แˆ›แ‹ˆแŒ… แŠฅแŠ•แ‰ฝแˆ‹แˆˆแŠ•แก-

  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 - แ‰ แ‰ฐแŒแ‰ฃแˆญ แˆ‹แ‹ญ แ‹ซแˆ‰ แ‰ฐแŒแ‰ฃแˆซแ‰ต แˆ˜แŒ แ‰…แˆˆแ‹ซ (แˆžแŠ“แ‹ต แˆ›แˆˆแ‰ต แ‹ญแ‰ปแˆ‹แˆ) (แ‰ แˆ˜แŒจแˆจแˆป แ‰ แˆŒแˆ‹ แŠแŒˆแˆญ แˆ˜แ‰ฐแŠซแ‰ต แŠฅแŠ•แ‰ฝแˆ‹แˆˆแŠ•)

แ‹ญแˆ…แŠ•แŠ• แ‰ แ‹ญแŠแŒˆแŒฝ แ‰ แˆ˜แŒ แ‰€แˆ แŒฅแ‰‚แ‰ต แŠ แŒˆแˆแŒแˆŽแ‰ถแ‰ฝแŠ• แˆ˜แ‰ฐแŒแ‰ แˆญ แŠฅแŠ•แ‰ฝแˆ‹แˆˆแŠ•แข แˆˆแˆแˆณแˆŒแฃ แˆแŠ•แˆ แ‹จแˆ›แ‹ซแ‹ฐแˆญแŒ แŠ แŒˆแˆแŒแˆŽแ‰ตแก-

  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
}

แ‰ แˆ˜แˆตแ‰€แˆˆแŠ› แˆ˜แŠ•แŒˆแ‹ต แ‰ แ‹šแˆ… แˆ˜แˆตแ‰€แˆˆแŠ› แˆ˜แŠ•แŒˆแ‹ต แ‹จแˆšแ‹ซแˆตแˆแˆแŒˆแ‹แŠ• แ‰ตแŠญแŠญแˆˆแŠ› แ‹จแ‹แ‰…แˆญ แŠ แ‹ญแŠแ‰ต แŠฅแŠ•แŒˆแˆแƒแˆˆแŠ•. แŠฎแˆแ•แˆŒแ‰ฐแˆญ แŠฅแ‰ƒแ‹แŠ• (แŠฌแŠญ) แ‰ แ‰‚ แ‰ฃแˆแˆ†แŠ แŠ แ‹ญแŠแ‰ต แŠฅแŠ•แ‹ตแŠ•แŒˆแŠแ‰ฃ แŠ แ‹ญแˆแ‰…แ‹ตแˆแŠ•แˆแฃ แˆแŠญแŠ•แ‹ซแ‰ฑแˆ แŠฅแ‹ซแŠ•แ‹ณแŠ•แ‹ฑ แ‹จแŠ แŒˆแˆแŒแˆŽแ‰ต แ‰ฃแˆ…แˆช แ‰  Config แ‹“แ‹ญแŠแ‰ต. แŠฅแŠ•แ‹ฒแˆแˆ แ‹จแ‰ฐแˆŸแˆ‹ แ‹แ‰…แˆจแ‰ต แˆณแŠ“แ‰€แˆญแ‰ฅ แˆ˜แˆตแ‰€แˆˆแŠ› แˆ˜แŠ•แŒˆแ‹ต แˆ˜แŒ€แˆ˜แˆญ แŠ แŠ•แ‰ฝแˆแˆแข

แ‹จแˆ˜แˆตแ‰€แˆˆแŠ› แŠ แ‹ตแˆซแˆป แŒฅแˆซแ‰ต

แŒแŠ•แŠ™แŠแ‰ต แˆˆแˆ˜แˆ˜แˆตแˆจแ‰ต แˆˆแŠฅแ‹ซแŠ•แ‹ณแŠ•แ‹ฑ แˆ˜แˆตแ‰€แˆˆแŠ› แˆ˜แŠ•แŒˆแ‹ต แŠฅแ‹แŠแ‰ฐแŠ› แŠ แˆตแ‰ฐแŠ“แŒ‹แŒ… แŠ แ‹ตแˆซแˆป แŠฅแŠ•แˆแˆแŒ‹แˆˆแŠ•แข แŠจแˆŒแˆŽแ‰ฝ แ‹จแˆ›แ‹‹แ‰€แˆชแ‹ซแ‹ แŠญแแˆŽแ‰ฝ แ‰ แŠ‹แˆ‹ แˆŠแ‰ณแ‹ˆแ‰… แ‹ญแ‰ฝแˆ‹แˆแข แˆตแˆˆแ‹šแˆ…แฃ แ‰ แŠ–แ‹ต แˆ˜แ‰ณแ‹ˆแ‰‚แ‹ซ แŠฅแŠ“ แ‰ แ‰ตแŠญแŠญแˆˆแŠ› แŠ แ‹ตแˆซแˆปแ‹ แˆ˜แŠซแŠจแˆ แŠซแˆญแ‰ณ แ‹จแˆแŠ•แˆฐแŒฅแ‰ แ‰ต แˆ˜แŠ•แŒˆแ‹ต แŠฅแŠ•แˆแˆแŒ‹แˆˆแŠ•แข แ‹ญแˆ… แŠซแˆญแ‰ณ แˆตแˆซ แ‰ฐแŒแ‰ฃแˆญ แŠแ‹แก-

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

แŠฅแŠ•แ‹ฐแ‹šแˆ… แŠ แ‹ญแŠแ‰ต แ‰ฐแŒแ‰ฃแˆญ แˆˆแˆ˜แ‰ฐแŒแ‰ แˆญ แŒฅแ‰‚แ‰ต แˆŠแˆ†แŠ‘ แ‹จแˆšแ‰ฝแˆ‰ แˆ˜แŠ•แŒˆแ‹ถแ‰ฝ แŠ แˆ‰.

  1. แŠจแˆ›แˆฐแˆ›แˆซแ‰ฑ แ‰ แŠแ‰ต แ‰ตแŠญแŠญแˆˆแŠ› แŠ แ‹ตแˆซแˆปแ‹Žแ‰ฝแŠ• แŠซแ‹ˆแ‰…แŠ• แฃ แ‰ แˆ˜แˆตแ‰€แˆˆแŠ› แŠ แˆตแ‰ฐแŠ“แŒ‹แŒ… แ‰…แŒฝแ‰ แ‰ต แฃ แŠจแ‹šแ‹ซ แ‹จ Scala แŠฎแ‹ตแŠ• แŠจแ‰ตแŠญแŠญแˆˆแŠ› แŠ แ‹ตแˆซแˆปแ‹Žแ‰ฝ แŒ‹แˆญ แˆ›แˆ˜แŠ•แŒจแ‰ต แŠฅแŠ“ แ‰ แŠ‹แˆ‹ แŒแŠ•แ‰ฃแ‰ณแ‹แŠ• แˆ›แŠซแˆ„แ‹ต แŠฅแŠ•แ‰ฝแˆ‹แˆˆแŠ• (แ‹ญแˆ…แˆ แ‹จแˆฐแ‹“แ‰ต แ‰ผแŠฎแ‰ฝแŠ• แ‹ซแŒ แŠ“แ‰…แˆซแˆ แŠฅแŠ“ แŠจแ‹šแ‹ซ แ‹จแ‹แˆ…แ‹ฐแ‰ต แˆ™แŠจแˆซ แˆตแ‰ฅแˆตแ‰ฅแŠ• แ‹ซแŠซแˆ‚แ‹ณแˆ)แข แ‰ แ‹šแˆ… แŠ แŒ‹แŒฃแˆš แ‹จแŠซแˆญแ‰ณ แˆตแˆซแŠ แ‰ฝแŠ• แ‰ แˆตแ‰ณแ‰ฒแˆตแ‰ฒแŠญแˆต แ‹จแˆšแ‰ณแ‹ˆแ‰… แŠฅแŠ“ แˆˆแˆ˜แˆณแˆฐแˆ‰แ‰ต แ‰€แˆ‹แˆ แˆŠแˆ†แŠ• แ‹ญแ‰ฝแˆ‹แˆแข Map[NodeId, NodeAddress].
  2. แŠ แŠ•แ‹ณแŠ•แ‹ต แŒŠแ‹œ แ‰ตแŠญแŠญแˆˆแŠ› แŠ แ‹ตแˆซแˆปแ‹Žแ‰ฝแŠ• แ‹จแˆแŠ“แŒˆแŠ˜แ‹ แˆ˜แˆตแ‰€แˆˆแŠ› แˆ˜แŠ•แŒˆแ‹ฑ แ‰ แ‰ตแŠญแŠญแˆ แˆฒแŒ€แˆ˜แˆญ แ‹ˆแ‹ญแˆ แŒˆแŠ“ แ‹ซแˆแ‰ฐแŒ€แˆ˜แˆฉ แ‹จแŠ แŠ•แŒ“แ‹Žแ‰ฝ แŠ แ‹ตแˆซแˆปแ‹Žแ‰ฝ แ‹จแˆˆแŠ•แˆแข แ‰ แ‹šแˆ… แŠ แŒ‹แŒฃแˆš แŠจแˆแˆ‰แˆ แŠ แŠ•แŒ“แ‹Žแ‰ฝ แ‰ แŠแ‰ต แ‹จแ‰ฐแŒ€แˆ˜แˆจ แ‹จแŒแŠแ‰ต แŠ แŒˆแˆแŒแˆŽแ‰ต แˆŠแŠ–แˆจแŠ• แ‹ญแ‰ฝแˆ‹แˆ แŠฅแŠ“ แŠฅแ‹ซแŠ•แ‹ณแŠ•แ‹ฑ แˆ˜แˆตแ‰€แˆˆแŠ› แˆ˜แŠ•แŒˆแ‹ต แ‰ แ‹šแ‹ซ แŠ แŒˆแˆแŒแˆŽแ‰ต แ‹แˆตแŒฅ แŠ แ‹ตแˆซแˆปแ‹แŠ• แˆŠแ‹ซแˆตแ‰ฐแ‹‹แ‹แ‰… แŠฅแŠ“ แˆˆแŒฅแŒˆแŠ›แ‹Žแ‰ฝ แˆ˜แˆ˜แ‹แŒˆแ‰ฅ แ‹ญแ‰ฝแˆ‹แˆแข
  3. แˆ›แˆปแˆปแˆ แŠจแ‰ปแˆแŠ• /etc/hostsแฃ แŠ แˆตแ‰€แ‹ตแˆž แ‹จแ‰ฐแŒˆแˆˆแŒน แ‹จแŠ แˆตแ‰ฐแŠ“แŒ‹แŒ… แˆตแˆžแ‰ฝแŠ• แˆ˜แŒ แ‰€แˆ แŠฅแŠ•แ‰ฝแˆ‹แˆˆแŠ• (แŠฅแŠ•แ‹ฐ my-project-main-node แŠ“ echo-backend) แŠฅแŠ“ แ‹ญแˆ…แŠ• แˆตแˆ แ‰ แˆ›แˆฐแˆ›แˆซแ‰ต แŒŠแ‹œ แŠจแŠ แ‹ญแ’ แŠ แ‹ตแˆซแˆป แŒ‹แˆญ แ‰ฅแ‰ป แ‹ซแŒˆแŠ“แŠ™แ‰ตแข

แ‰ แ‹šแˆ… แˆแŒฅแ แ‹แˆตแŒฅ แŠฅแŠแ‹šแˆ…แŠ• แŒ‰แ‹ณแ‹ฎแ‰ฝ แ‰ แ‰ แˆˆแŒ  แ‹แˆญแ‹แˆญ แŠ แŠ•แˆธแแŠ“แ‰ธแ‹แˆแข แ‰ แŠฅแ‹แŠแ‰ฑ แ‰ แŠ แˆปแŠ•แŒ‰แˆŠแ‰ณแ‰ฝแŠ• แˆแˆณแˆŒ แ‹แˆตแŒฅ แˆแˆ‰แˆ แŠ แŠ•แŒ“แ‹Žแ‰ฝ แŠ แŠ•แ‹ต แŠ แ‹ญแŠแ‰ต แŠ แ‹ญแ’ แŠ แ‹ตแˆซแˆป แ‹ญแŠ–แˆซแ‰ธแ‹‹แˆ - 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 แ‹ฐแŠ•แ‰ แŠ› แŠจแ‰ฐแ‹‹แ‰€แˆจ แ‹จแˆ˜แŒจแˆจแˆป แ‰†แ‹ญแ‰ณ แ‰ แŠ‹แˆ‹ แ‹ซแ‰ แ‰ƒแˆแข แ‹ญแˆ˜แˆแŠจแ‰ฑ แˆ›แˆตแŒ€แˆ˜แˆชแ‹ซ แˆ˜แ‰ฐแŒแ‰ แˆชแ‹ซ แ‹แˆญแ‹แˆฎแ‰ฝแŠ• แˆˆแˆ›แŒแŠ˜แ‰ต.

แŠ แŒ แ‰ƒแˆ‹แ‹ญ แ‹จแŠฅแ‹ตแŒˆแ‰ต แˆ‚แ‹ฐแ‰ต

แ‹ญแˆ… แŠ แŠซแˆ„แ‹ต แŠจแ‹แ‰…แˆจแ‰ต แŒ‹แˆญ แ‹จแˆแŠ•แˆฐแˆซแ‰ แ‰ตแŠ• แˆ˜แŠ•แŒˆแ‹ต แŠฅแŠ•แ‹ดแ‰ต แŠฅแŠ•แ‹ฐแˆšแˆˆแ‹แŒฅ แŠฅแŠ•แ‹ญแข

แŠฅแŠ•แ‹ฐ แŠฎแ‹ต แˆ›แ‹‹แ‰€แˆฉ แ‰ฐแˆฐแ‰ฅแˆตแ‰ฆ แŠ แŠ•แ‹ต แ‰…แˆญแˆต แ‹ญแˆ แˆซแˆแข แ‹จแ‹แ‰…แˆจแ‰ต แ‰…แˆญแˆถแ‰ฝแŠ• แŠจแˆŒแˆŽแ‰ฝ แ‹จแŠฎแ‹ต แ‰…แˆญแˆถแ‰ฝ แˆ˜แˆˆแ‹จแ‰ต แˆแŠญแŠ•แ‹ซแ‰ณแ‹Š แ‹ญแˆ˜แˆตแˆ‹แˆแข แ‰ฅแ‹™แ‹แŠ• แŒŠแ‹œ แ‰ แ‰ฐแˆ˜แˆณแˆณแ‹ฉ แŠฎแ‹ต แˆ˜แˆ แˆจแ‰ต แˆ‹แ‹ญ แ‰ฅแ‹™ แ‹แ‰…แˆฎแ‰ฝ แˆŠแŠ–แˆจแŠ• แ‹ญแ‰ฝแˆ‹แˆแข แŠฅแŠ“ แ‰ แŠฅแˆญแŒแŒฅ แฃ แ‹จแ‰ฐแˆˆแ‹ซแ‹ฉ แ‹จแ‹แ‰…แˆจแ‰ต แ‰…แˆญแŠ•แŒซแŽแ‰ฝ แ‰ แˆญแŠซแ‰ณ แˆตแˆชแ‰ถแ‰ฝ แˆŠแŠ–แˆฉแŠ• แ‹ญแ‰ฝแˆ‹แˆ‰แข แ‰ แŠ แŠ•แ‹ต แ‹แ‰…แˆญ แ‹แˆตแŒฅ แ‹จแ‰ฐแ‹ˆแˆฐแŠ‘ แ‹จแ‰คแ‰ฐ-แˆ˜แŒปแˆ…แแ‰ต แˆตแˆชแ‰ถแ‰ฝแŠ• แˆ˜แˆแˆจแŒฅ แŠฅแŠ•แ‰ฝแˆ‹แˆˆแŠ• แŠฅแŠ“ แ‹ญแˆ…แŠ• แ‹แ‰…แˆญ แ‰ฃแˆตแ‰€แˆ˜แŒฅแŠ• แ‰แŒฅแˆญ แ‹ญแˆ… แ‰‹แˆš แˆ†แŠ– แ‹ญแ‰†แ‹ซแˆแข

แ‹จแ‹แ‰…แˆจแ‰ต แˆˆแ‹แŒฅ แ‹จแŠฎแ‹ต แˆˆแ‹แŒฅ แ‹ญแˆ†แŠ“แˆแข แˆตแˆˆแ‹šแˆ… แ‰ แ‰ฐแˆ˜แˆณแˆณแ‹ญ แ‹จแŒฅแˆซแ‰ต แˆ›แˆจแŒ‹แŒˆแŒซ แˆ‚แ‹ฐแ‰ต แˆ˜แˆธแˆแŠ• แŠ แˆˆแ‰ แ‰ตแก-

แ‰ฒแŠฌแ‰ต -> PR -> แŒแˆแŒˆแˆ› -> แ‹แˆ…แ‹ฐแ‰ต -> แ‰€แŒฃแ‹ญแŠแ‰ต แ‹ซแˆˆแ‹ แ‹แˆ…แ‹ฐแ‰ต -> แ‰€แŒฃแ‹ญแŠแ‰ต แ‹ซแˆˆแ‹ แˆ›แˆฐแˆ›แˆซแ‰ต

แ‹จแŠ แ‰€แˆซแˆจแ‰ฅ แ‹˜แ‹ดแ‹Žแ‰ฝ แ‹จแˆšแŠจแ‰ฐแˆ‰แ‰ต แ‹แŒคแ‰ถแ‰ฝ แŠ แˆ‰.

  1. แ‹แ‰…แˆฉ แˆˆแŠ แŠ•แ‹ต แ‹จแ‰ฐแ‹ˆแˆฐแŠ แ‹จแˆตแˆญแ‹“แ‰ต แˆแˆณแˆŒ แ‹ˆแŒฅแŠแ‰ต แ‹ซแˆˆแ‹ แŠแ‹แข แ‰ แŠ แŠ•แŒ“แ‹Žแ‰ฝ แˆ˜แŠซแŠจแˆ แ‰ตแŠญแŠญแˆ แ‹ซแˆแˆ†แŠ แŒแŠ•แŠ™แŠแ‰ต แˆˆแˆ˜แแŒ แˆญ แˆแŠ•แˆ แˆ˜แŠ•แŒˆแ‹ต แ‹ซแˆˆ แŠ แ‹ญแˆ˜แˆตแˆแˆแข
  2. แ‰ แŠ แŠ•แ‹ต แˆ˜แˆตแ‰€แˆˆแŠ› แˆ˜แŠ•แŒˆแ‹ต แ‹แˆตแŒฅ แ‹แ‰…แˆจแ‰ตแŠ• แˆ˜แ‰€แ‹จแˆญ แ‰€แˆ‹แˆ แŠ แ‹ญแ‹ฐแˆˆแˆ. แŠ แŠ•แ‹ณแŠ•แ‹ต แ‹จแŒฝแˆ‘แ แ‹แ‹ญแˆŽแ‰ฝแŠ• แ‹ˆแ‹ฐ แ‹แˆตแŒฅ แˆˆแˆ˜แŒแ‰ฃแ‰ต แŠฅแŠ“ แˆˆแˆ˜แˆˆแ‹ˆแŒฅ แˆแŠญแŠ•แ‹ซแ‰ณแ‹Š แ‹ซแˆแˆ†แŠ แ‹ญแˆ˜แˆตแˆ‹แˆ. แˆตแˆˆแ‹šแˆ… แ‹จแ‹แ‰…แˆจแ‰ต แˆ˜แŠ•แˆธแˆซแ‰ฐแ‰ต แŠ แŠแˆตแ‰ฐแŠ› แ‹ญแˆ†แŠ“แˆแข
  3. แŠ แŠแˆตแ‰ฐแŠ› แ‹จแ‹แ‰…แˆจแ‰ต แˆˆแ‹แŒฆแ‰ฝแŠ• แˆ›แ‹ตแˆจแŒ แ‰€แˆ‹แˆ แŠ แ‹ญแ‹ฐแˆˆแˆ.
  4. แŠ แ‰ฅแ‹›แŠ›แ‹Žแ‰น แ‹จแ‹แ‰…แˆจแ‰ต แˆˆแ‹แŒฆแ‰ฝ แ‰ฐแˆ˜แˆณแˆณแ‹ญ แ‹จแŠฅแ‹ตแŒˆแ‰ต แˆ‚แ‹ฐแ‰ตแŠ• แ‹ญแŠจแ‰ฐแˆ‹แˆ‰แฃ แŠฅแŠ“ แ‹จแ‰ฐแ‹ˆแˆฐแŠ แŒแˆแŒˆแˆ›แŠ• แ‹ซแˆแ‹แˆแข

แˆˆแˆแˆญแ‰ต แ‹แ‰…แˆญ แ‹จแ‰ฐแˆˆแ‹จ แˆ›แŠจแˆ›แ‰ป แ‹ซแˆตแˆแˆแŒˆแŠ“แˆ? แ‹จแˆแˆญแ‰ต แŠ แ‹ˆแ‰ƒแ‰€แˆฉ แ‰ฅแ‹™ แˆฐแ‹Žแ‰ฝ แŠฅแŠ•แ‹ณแ‹ญแ‹ฐแˆญแˆฑแ‰ แ‰ต แˆแŠ“แ‹ฐแˆญแŒˆแ‹ แ‹จแˆแŠ•แˆแˆแŒˆแ‹แŠ• แˆšแˆตแŒฅแˆซแ‹ŠแŠแ‰ต แ‹ซแˆˆแ‹ แˆ˜แˆจแŒƒ แˆŠแ‹ญแ‹ แ‹ญแ‰ฝแˆ‹แˆแข แˆตแˆˆแ‹šแˆ… แ‹จแˆแˆญแ‰ต แŠ แ‹ˆแ‰ƒแ‰€แˆฉแŠ• แ‹จแˆšแ‹ซแŠซแ‰ตแ‰ต แ‹จแ‰ฐแŒˆแ‹ฐแ‰  แˆ˜แ‹ณแˆจแˆป แ‹ซแˆˆแ‹ แ‹จแ‰ฐแˆˆแ‹จ แˆ›แŠจแˆ›แ‰ป แˆ›แˆตแ‰€แˆ˜แŒฅ แŒ แ‰ƒแˆš แˆŠแˆ†แŠ• แ‹ญแ‰ฝแˆ‹แˆแข แŠ แ‹ˆแ‰ƒแ‰€แˆฉแŠ• แ‰ แˆแˆˆแ‰ต แŠญแแˆŽแ‰ฝ แˆแŠ•แŠจแแˆˆแ‹ แŠฅแŠ•แ‰ฝแˆ‹แˆˆแŠ•-แŠ แŠ•แ‹ฐแŠ›แ‹ แ‰ แŒฃแˆ แŠญแแ‰ต แ‹จแˆ†แŠ‘ แ‹จแˆแˆญแ‰ต แˆ˜แˆˆแŠชแ‹ซแ‹Žแ‰ฝแŠ• แ‹จแ‹ซแ‹˜ แŠฅแŠ“ แ‹จแ‹แ‰…แˆจแ‰ต แˆšแˆตแŒฅแˆซแ‹Š แŠญแแˆ แ‹จแ‹ซแ‹˜แข แ‹ญแˆ… แˆˆแŠ แ‰ฅแ‹›แŠ›แ‹Žแ‰น แŒˆแŠ•แ‰ขแ‹Žแ‰ฝ แˆˆแŠ แ‰ฅแ‹›แŠžแ‰น แˆ˜แˆ˜แ‹˜แŠ›แ‹Žแ‰ฝ แˆ˜แ‹ณแˆจแˆต แ‹ซแˆตแ‰ฝแˆ‹แˆแฃ แŠแŒˆแˆญ แŒแŠ• แ‹จแŠฅแ‹แŠแ‰ฐแŠ› แŒฅแŠ•แ‰ƒแ‰„แŠ• แ‹จแˆšแŒˆแ‹ตแ‰ฅ แŠแ‹แข แ‰ แŠแ‰ฃแˆช แ‹จแˆ˜แˆˆแŠชแ‹ซ แŠฅแˆดแ‰ถแ‰ฝ แŠ แˆ›แŠซแŠแŠแ‰ต แˆ˜แŠซแŠจแˆˆแŠ› แ‰ฃแˆ…แˆชแ‹ซแ‰ตแŠ• แ‰ แˆ˜แŒ แ‰€แˆ แ‹ญแˆ…แŠ•แŠ• แˆ›แŠจแŠ“แ‹ˆแŠ• แ‰€แˆ‹แˆ แŠแ‹แข

แˆแ‹ฉแŠแ‰ถแ‰ฝ

แŠจแˆŒแˆŽแ‰ฝ แ‹จแ‹แ‰…แˆจแ‰ต แŠ แˆตแ‰ฐแ‹ณแ‹ฐแˆญ แ‰ดแŠญแŠ’แŠฎแ‰ฝ แŒ‹แˆญ แˆฒแ‹ˆแ‹ณแ‹ฐแˆญ แ‹จแ‰ณแ‰€แ‹ฐแ‹ แŠ แŠซแˆ„แ‹ต แŒฅแ‰…แˆ™แŠ•แŠ“ แŒ‰แ‹ณแ‰ฑแŠ• แŠฅแŠ•แ‹ญแข

แ‰ แˆ˜แŒ€แˆ˜แˆชแ‹ซ แ‹ฐแˆจแŒƒแฃ แ‹แ‰…แˆจแ‰ตแŠ• แˆˆแˆ›แˆตแ‰ฐแŠ“แŒˆแ‹ต แ‰ แ‰ณแ‰€แ‹ฐแ‹ แˆ˜แŠ•แŒˆแ‹ต แˆˆแ‰ฐแˆˆแ‹ซแ‹ฉ แŒˆแŒฝแ‰ณแ‹Žแ‰ฝ แŒฅแ‰‚แ‰ต แŠ แˆ›แˆซแŒฎแ‰ฝแŠ• แŠฅแŠ•แ‹˜แˆจแ‹แˆซแˆˆแŠ•แข

  1. แ‰ แ‹’แˆ‹แˆ›แ‹ แˆ›แˆฝแŠ• แˆ‹แ‹ญ แ‹จแŒฝแˆ‘แ แ‹แ‹ญแˆ.
  2. แ‹จแ‰ฐแˆ›แŠจแˆˆ แ‰แˆแ-แŠฅแˆดแ‰ต แˆ›แŠจแˆ›แ‰ป (แŠฅแŠ•แ‹ฐ etcd/zookeeper).
  3. แŠฅแŠ•แ‹ฐแŒˆแŠ“ แˆณแ‹ญแŒ€แˆ˜แˆญ แŠฅแŠ•แ‹ฐแŒˆแŠ“ แˆŠแ‹‹แ‰€แˆฉ/แˆŠแŒ€แˆ˜แˆฉ แ‹จแˆšแ‰ฝแˆ‰ แŠ•แ‹‘แˆต แ‹จแˆ‚แ‹ฐแ‰ต แŠญแแˆŽแ‰ฝแข
  4. แŠจแ‰…แˆญแˆต แŠฅแŠ“ แ‹จแˆตแˆชแ‰ต แ‰แŒฅแŒฅแˆญ แ‹แŒญ แˆ›แ‹‹แ‰€แˆญแข

แ‹จแŒฝแˆ‘แ แ‹แ‹ญแˆ แŠจแŠ แ‹ต-แˆ†แŠญ แŒฅแŒˆแŠ“แ‹Žแ‰ฝ แŠ แŠ•แƒแˆญ แŠ แŠ•แ‹ณแŠ•แ‹ต แ‰ฐแˆˆแ‹‹แ‹‹แŒญแŠแ‰ตแŠ• แ‹ญแˆฐแŒฃแˆแข แ‹จแˆตแˆญแ‹“แ‰ต แŠ แˆตแ‰ฐแ‹ณแ‹ณแˆช แ‹ˆแ‹ฐ แŠขแˆ‹แˆ›แ‹ แˆ˜แˆตแ‰€แˆˆแŠ› แˆ˜แŠ•แŒˆแ‹ต แˆ˜แŒแ‰ฃแ‰ตแฃ แˆˆแ‹แŒฅ แˆ›แ‹ตแˆจแŒ แŠฅแŠ“ แ‰ แ‰€แˆ‹แˆ‰ แŠ แŒˆแˆแŒแˆŽแ‰ฑแŠ• แŠฅแŠ•แ‹ฐแŒˆแŠ“ แˆ›แˆตแŒ€แˆ˜แˆญ แ‹ญแ‰ฝแˆ‹แˆแข แ‹ญแˆ… แˆˆแ‰ตแˆ‹แˆแ‰… แˆตแˆญแ‹“แ‰ถแ‰ฝ แŒฅแˆฉ แˆ‹แ‹ญแˆ†แŠ• แ‹ญแ‰ฝแˆ‹แˆ. แŠจแˆˆแ‹แŒก แ‰ แˆตแ‰ฐแŒ€แˆญแ‰ฃ แˆแŠ•แˆ แ‹ฑแŠซ แŠ แˆแ‰€แˆจแˆแข แˆˆแ‹แŒก แ‰ แˆŒแˆ‹ แŒฅแŠ•แ‹ต แ‹“แ‹ญแŠ–แ‰ฝ แŠ แ‹ญแŒˆแˆ˜แŒแˆแˆ. แ‹จแˆˆแ‹แŒกแŠ• แˆ˜แŠ•แˆตแŠค แˆแŠ• แŠฅแŠ•แ‹ฐแˆ†แŠ แˆˆแˆ›แ‹ˆแ‰… แŠ แˆตแ‰ธแŒ‹แˆช แˆŠแˆ†แŠ• แ‹ญแ‰ฝแˆ‹แˆแข แŠ แˆแ‰ฐแˆแ‰ฐแŠแˆแข แŠจแ‰ฐแŠจแ‹แˆแˆˆแ‹ แ‹จแˆตแˆญแ‹“แ‰ต แŠฅแ‹ญแ‰ณ แŠ แŠ•แ‹ต แŠ แˆตแ‰ฐแ‹ณแ‹ณแˆช แ‰ แˆŒแˆŽแ‰น แŠ แŠ•แŒ“แ‹Žแ‰ฝ แ‹แˆตแŒฅ แ‹ซแˆˆแ‹แŠ• แ‹แ‰…แˆจแ‰ต แˆ›แ‹˜แˆ˜แŠ• แ‰ แ‰€แˆ‹แˆ‰ แˆŠแˆจแˆณ แ‹ญแ‰ฝแˆ‹แˆแข

(Btwแฃ แ‹แˆŽ แŠ แ‹ตแˆฎ แ‹จแŒฝแˆ‘แ แˆ›แ‹‹แ‰€แˆญ แ‹แ‹ญแˆŽแ‰ฝแŠ• แˆ˜แŒ แ‰€แˆ แˆ˜แŒ€แˆ˜แˆญ แ‹จแˆšแ‹ซแˆตแˆแˆแŒ แŠจแˆ†แŠแฃ แ‹ซแŠ•แŠ‘ แˆŠแˆแŒฅแˆญ แ‹จแˆšแ‰ฝแˆ แ‰ฐแŠ•แ‰ณแŠ + แŠ แˆจแŒ‹แŒ‹แŒญ แˆ›แŠจแˆ แ‰ฅแ‰ป แŠ แˆˆแ‰ฅแŠ•แข Config แ‹ญแ‰ฐแ‹ญแ‰ก แŠฅแŠ“ แ‹ซ แ‹จแŒฝแˆ‘แ แ‹แ‰…แˆฎแ‰ฝแŠ• แˆ˜แŒ แ‰€แˆ แˆˆแˆ˜แŒ€แˆ˜แˆญ แ‰ แ‰‚ แŠแ‹แข แ‹ญแˆ… แ‹ฐแŒแˆž แ‹จแˆ›แŒ แŠ“แ‰€แˆญ-แŒŠแ‹œ แ‹แ‰…แˆญ แ‹แˆตแ‰ฅแˆตแ‰ฅแŠแ‰ต แŠจแŒฝแˆ‘แ-แ‰ฐแŠฎแˆญ แ‹แ‰…แˆฎแ‰ฝ แ‹แˆตแ‰ฅแˆตแ‰ฅแŠแ‰ต แ‰ตแŠ•แˆฝ แ‹ซแŠแˆฐ แˆ˜แˆ†แŠ‘แŠ• แ‹ซแˆณแ‹ซแˆแฃ แˆแŠญแŠ•แ‹ซแ‰ฑแˆ แ‰ แŒฝแˆ‘แ แˆ‹แ‹ญ แ‹จแ‰ฐแˆ˜แˆ แˆจแ‰ฐ แˆฅแˆชแ‰ต แŠ แŠ•แ‹ณแŠ•แ‹ต แ‰ฐแŒจแˆ›แˆช แŠฎแ‹ต แŠฅแŠ•แˆแˆแŒ‹แˆˆแŠ•แข)

แ‹จแ‰ฐแˆ›แŠจแˆˆ แ‰แˆแ-แŠฅแˆดแ‰ต แˆ›แŠจแˆ›แ‰ป แ‹จแˆ˜แ‰ฐแŒแ‰ แˆชแ‹ซ แˆœแ‰ณ แˆ˜แˆˆแŠชแ‹ซแ‹Žแ‰ฝแŠ• แˆˆแˆ›แˆฐแˆซแŒจแ‰ต แŒฅแˆฉ แ‹˜แ‹ด แŠแ‹แข แŠฅแ‹šแˆ… แŠฅแŠ•แ‹ฐ แ‹จแ‹แ‰…แˆญ แŠฅแˆดแ‰ถแ‰ฝ แ‹จแˆแŠ•แ‰†แŒฅแˆซแ‰ธแ‹แŠ• แŠฅแŠ“ แ‹แˆ‚แ‰ฅ แ‰ฅแ‰ป แˆแŠ• แŠฅแŠ•แ‹ฐแˆ†แŠ แˆ›แˆฐแ‰ฅ แŠ แˆˆแ‰ฅแŠ•แข แ‰ฐแŒแ‰ฃแˆญ แ‰ฐแˆฐแŒฅแ‰ทแˆแข C => A => B แ‰ฅแ‹™ แŒŠแ‹œ แ‹จแˆ›แ‹ญแˆˆแ‹‹แ‹ˆแŒก แŠฅแˆดแ‰ถแ‰ฝ แ‰ฅแˆˆแŠ• แŠฅแŠ•แŒ แˆซแ‰ธแ‹‹แˆˆแŠ• C "แˆ›แ‹‹แ‰€แˆญ"แฃ แ‰ แ‰ฐแ‹ฐแŒ‹แŒ‹แˆš แ‹แˆ‚แ‰ฅ แˆฒแ‰€แ‹จแˆญ A - แ‹แˆ‚แ‰ฅ แ‰ฅแ‰ป แ‹ซแˆตแŒˆแ‰กแข แ‹แ‰…แˆญ แŠจแˆ˜แˆจแŒƒแ‹ แ‰€แ‹ฐแˆ แ‰ฅแˆŽ แˆˆแ‰ฐแŒแ‰ฃแˆฉ แˆ˜แ‰…แˆจแ‰ฅ แŠ แˆˆแ‰ แ‰ตแข A. แ‹ญแˆ…แŠ• แˆƒแˆณแ‰ฅ แˆตแŠ•แˆ˜แˆˆแŠจแ‰ต แ‹จแ‹แ‰…แˆญ แ‹แˆ‚แ‰ฅแŠ• แŠจแ‹แˆ‚แ‰ฅ แˆˆแˆ˜แˆˆแ‹จแ‰ต แˆแŠ• แŒฅแ‰…แˆ แˆ‹แ‹ญ แŠฅแŠ•แ‹ฐแˆšแ‹แˆ แ‹จแˆšแŒ แ‰ แ‰€แ‹ แ‹ตแŒแŒแˆžแˆฝ แŠแ‹ แˆ›แˆˆแ‰ต แŠฅแŠ•แ‰ฝแˆ‹แˆˆแŠ•แข แŠฅแŠ•แ‹ฒแˆแˆ แ‹แˆ‚แ‰ฅ แ‰ แ‰ฐแˆˆแˆแ‹ถ แŠจแŠ แŠ•แ‹ต แˆแŠ•แŒญ (แ‰ฐแŒ แ‰ƒแˆš) แŠฅแŠ“ แ‹แ‰…แˆจแ‰ต แ‹จแˆšแˆ˜แŒฃแ‹ แŠจแˆŒแˆ‹ แˆแŠ•แŒญ (แŠ แˆตแ‰ฐแ‹ณแ‹ณแˆช) แŠแ‹แข แŠจแˆ˜แŠแˆปแ‹ แˆ‚แ‹ฐแ‰ต แ‰ แŠ‹แˆ‹ แˆŠแˆˆแ‹ˆแŒก แ‹จแˆšแ‰ฝแˆ‰ แˆ˜แˆˆแŠชแ‹ซแ‹Žแ‰ฝแŠ• แˆ›แˆตแ‰ฐแŠ“แŒˆแ‹ต แ‹จแˆ˜แ‰ฐแŒแ‰ แˆชแ‹ซแ‹แŠ• แ‹แˆตแ‰ฅแˆตแ‰ฅแŠแ‰ต แˆ˜แŒจแˆ˜แˆญ แ‹ซแˆ˜แŒฃแˆ. แˆˆแŠฅแŠ•แ‹ฐแ‹šแˆ… แŠ แ‹ญแŠแ‰ต แˆ˜แˆ˜แ‹˜แŠ›แ‹Žแ‰ฝ แ‹จแˆ˜แˆ‹แŠชแ‹ซ แˆตแˆแ‰ณแ‰ธแ‹แŠ•แฃ แˆ˜แ‰ฐแŠ•แ‰ฐแŠ• แŠฅแŠ“ แˆ›แˆจแŒ‹แŒˆแŒฅแฃ แ‹จแ‰ฐแˆณแˆณแ‰ฑ แŠฅแˆดแ‰ถแ‰ฝแŠ• แˆ›แˆตแ‰ฐแŠ“แŒˆแ‹ต แŠ แˆˆแ‰ฅแŠ•แข แˆตแˆˆแ‹šแˆ… แ‹จแ•แˆฎแŒแˆซแˆ™แŠ• แ‹แˆตแ‰ฅแˆตแ‰ฅแŠแ‰ต แˆˆแˆ˜แ‰€แŠแˆต แ‰ แˆ‚แ‹ฐแ‰ต แˆ‹แ‹ญ แˆŠแˆˆแ‹ˆแŒก แ‹จแˆšแ‰ฝแˆ‰แ‰ตแŠ• แˆ˜แˆˆแŠชแ‹ซแ‹Žแ‰ฝ (แ‹ˆแ‹ญแˆ แˆ™แˆ‰ แ‰ แˆ™แˆ‰ แˆ›แˆตแ‰€แˆจแ‰ต) แ‰ฅแŠ•แ‰€แŠ•แˆต แ‹ญแˆปแˆ‹แˆแข

แŠจแ‹šแˆ… แˆแŒฅแ แŠ แŠ•แƒแˆญ แ‰ แ‰‹แˆš แŠฅแŠ“ แ‰ฐแˆˆแ‹‹แ‹‹แŒญ แˆ˜แˆˆแŠชแ‹ซแ‹Žแ‰ฝ แˆ˜แŠซแŠจแˆ แˆแ‹ฉแŠแ‰ต แˆ˜แแŒ แˆญ แŠ แˆˆแ‰ฅแŠ•แข แ‹จแŠ แŒˆแˆแŒแˆŽแ‰ต แŠ แˆ˜แŠญแŠ•แ‹ฎ แ‰ แˆ‚แ‹ฐแ‰ต แŒŠแ‹œ แ‹จแŠ แŠ•แ‹ณแŠ•แ‹ต แŒแ‰คแ‰ถแ‰ฝแŠ• แ‰ฅแˆญแ‰… แˆˆแ‹แŒฅ แ‹จแˆšแˆแˆแŒ แŠจแˆ†แŠ แ‰ฐแˆˆแ‹‹แ‹‹แŒญ แˆ˜แˆˆแŠชแ‹ซแ‹Žแ‰ฝ แˆแŠ•แˆ‹แ‰ธแ‹ แŠฅแŠ•แ‰ฝแˆ‹แˆˆแŠ•แข แŠ แˆˆแ‰ แˆˆแ‹šแ‹ซ แŠฅแŠแˆฑ แ‹จแˆ›แ‹ญแŠ•แ‰€แˆณแ‰€แˆฑ แŠ“แ‰ธแ‹ แŠฅแŠ“ แ‹จแ‰ณแ‰€แ‹ฐแ‹แŠ• แŠ แŠซแˆ„แ‹ต แ‰ แˆ˜แŒ แ‰€แˆ แˆŠแ‹‹แ‰€แˆฉ แ‹ญแ‰ฝแˆ‹แˆ‰. แˆˆแ‰ฐแˆˆแ‹‹แ‹‹แŒญ แˆ˜แˆแˆถ แˆ›แ‹‹แ‰€แˆญ แˆŒแˆŽแ‰ฝ แŠ แŠซแˆ„แ‹ถแ‰ฝ แˆŠแ‹ซแˆตแˆแˆแŒ แ‹ญแ‰ฝแˆ‹แˆแข แˆˆแˆแˆณแˆŒแฃ แ‹จแˆตแˆญแŠ แ‰ฑ แŠญแแˆŽแ‰ฝ แ‹จแ‰ฐแŠจแ‹แˆแˆˆ แˆตแˆญแ‹“แ‰ตแŠ• แ‹จแ‰ฐแˆˆแ‹ซแ‹ฉ แˆ‚แ‹ฐแ‰ถแ‰ฝแŠ• แŠฅแŠ•แ‹ฐแŒˆแŠ“ แˆˆแˆ›แˆตแŒ€แˆ˜แˆญ แ‰ แ‰ฐแˆ˜แˆณแˆณแ‹ญ แˆ˜แˆแŠฉ แ‰ แŠ แ‹ฒแˆฑ แ‹จแ‹แ‰…แˆญ แˆ˜แˆˆแŠชแ‹ซแ‹Žแ‰ฝ แŠฅแŠ•แ‹ฐแŒˆแŠ“ แˆŠแŒ€แˆ˜แˆฉ แ‹ญแ‰ฝแˆ‹แˆ‰แข
(แ‹จแŠฅแŠ” แ‰ตแˆแ‰ต แŠ แˆตแ‰ฐแ‹ซแ‹จแ‰ต แ‹จแˆตแˆญแ‹“แ‰ฑแŠ• แ‹แˆตแ‰ฅแˆตแ‰ฅแŠแ‰ต แˆตแˆˆแˆšแŒจแˆแˆญ แ‹จแˆฉแŒซ แŒŠแ‹œ แ‹ณแŒแˆ แˆ›แ‹‹แ‰€แˆญแŠ• แˆ›แˆตแ‹ˆแŒˆแ‹ต แŠแ‹แข
แŠฅแŠ•แ‹ฐแŒˆแŠ“ แ‹จแˆ›แˆตแŒ€แˆ˜แˆญ แˆ‚แ‹ฐแ‰ถแ‰ฝแŠ• แ‰ แˆตแˆญแ‹“แ‰ฐ แŠญแ‹ˆแŠ“ แ‹ตแŒ‹แ แˆ‹แ‹ญ แ‰ฅแ‰ป แˆ˜แ‰ฐแˆ›แˆ˜แŠ• แ‹จแ‰ แˆˆแŒ  แ‰€แˆ‹แˆ แˆŠแˆ†แŠ• แ‹ญแ‰ฝแˆ‹แˆแข แˆแŠ•แˆ แŠฅแŠ•แŠณแŠ• แˆแˆแŒŠแ‹œ แˆ‹แ‹ญแˆ†แŠ• แ‹ญแ‰ฝแˆ‹แˆ.)

แŠ แŠ•แ‹ณแŠ•แ‹ต แŒŠแ‹œ แˆฐแ‹Žแ‰ฝ แ‰ฐแˆˆแ‹‹แ‹‹แŒญ แ‹แ‰…แˆญ (แ‹ซแˆˆ แˆŒแˆŽแ‰ฝ แˆแŠญแŠ•แ‹ซแ‰ถแ‰ฝ) แ‰ฐแˆˆแ‹‹แ‹‹แŒญ แ‹แ‰…แˆญ แŠฅแŠ•แ‹ฒแ‹ซแˆตแ‰ก แ‹จแˆšแ‹ซแ‹ฐแˆญแŒ แ‹จแˆ›แ‹ญแŠ•แ‰€แˆณแ‰€แˆต แ‹แ‰…แˆจแ‰ตแŠ• แ‹จแˆ˜แŒ แ‰€แˆ แŠ แŠ•แ‹ฑ แŠ แˆตแˆแˆ‹แŒŠ แŒˆแŒฝแ‰ณ แ‰ แ‹แ‰…แˆจแ‰ต แˆ›แˆปแˆปแ‹ซ แ‹ˆแ‰…แ‰ต แ‹จแŠ แŒˆแˆแŒแˆŽแ‰ต แˆ˜แ‰‹แˆจแŒฅ แŠแ‹แข แ‰ แŠฅแˆญแŒแŒฅ แ‰ แˆตแ‰ณแ‰ฒแŠญ แ‹แ‰…แˆจแ‰ต แˆ‹แ‹ญ แˆˆแ‹แŒฆแ‰ฝแŠ• แˆ›แ‹ตแˆจแŒ แŠซแˆˆแ‰ฅแŠ• แŠ แ‹ณแ‹ฒแˆต แŠฅแˆดแ‰ถแ‰ฝ แ‹แŒคแ‰ณแˆ› แŠฅแŠ•แ‹ฒแˆ†แŠ‘ แˆตแˆญแ‹“แ‰ฑแŠ• แŠฅแŠ•แ‹ฐแŒˆแŠ“ แˆ›แˆตแŒ€แˆ˜แˆญ แŠ แˆˆแ‰ฅแŠ•แข แˆˆแ‰ฐแˆˆแ‹ซแ‹ฉ แˆตแˆญแ‹“แ‰ถแ‰ฝ แ‹จแŠฅแˆจแแ‰ต แŒŠแ‹œ แˆ˜แˆตแˆแˆญแ‰ถแ‰ฝ แ‹ญแˆˆแ‹ซแ‹ซแˆ‰, แˆตแˆˆแ‹šแˆ… แ‹ซแŠ• แ‹ซแˆ…แˆ แ‹ˆแˆณแŠ แˆ‹แ‹ญแˆ†แŠ• แ‹ญแ‰ฝแˆ‹แˆ. แŠ แˆตแˆแˆ‹แŒŠ แŠจแˆ†แŠ, แˆˆแˆ›แŠ•แŠ›แ‹แˆ แˆตแˆญแ‹“แ‰ต แŠฅแŠ•แ‹ฐแŒˆแŠ“ แŠฅแŠ•แ‹ฒแŒ€แˆ˜แˆญ แŠ แˆตแ‰€แ‹ตแˆ˜แŠ• แˆ›แ‰€แ‹ต แŠ แˆˆแ‰ฅแŠ•. แˆˆแˆแˆณแˆŒแฃ แˆ˜แ‰ฐแŒแ‰ แˆญ แŠฅแŠ•แ‰ฝแˆ‹แˆˆแŠ• AWS ELB แŒแŠ•แŠ™แŠแ‰ต แˆ˜แแˆฐแˆต. แ‰ แ‹šแˆ… แˆแŠ”แ‰ณ แˆตแˆญแ‹“แ‰ฑแŠ• แŠฅแŠ•แ‹ฐแŒˆแŠ“ แˆ›แˆตแŒ€แˆ˜แˆญ แ‰ แˆšแ‹ซแˆตแˆแˆแŒˆแŠ• แŒŠแ‹œแฃ แ‹จแˆตแˆญแ‹“แ‰ฑแŠ• แŠ แ‹ฒแˆต แˆแˆณแˆŒ แ‰ แ‰ตแ‹ญแ‹ฉ แŠฅแŠ•แŒ€แˆแˆซแˆˆแŠ•แฃ แŠจแ‹šแ‹ซแˆ ELB แ‹ˆแ‹ฐ แŠฅแˆฑ แŠฅแŠ•แ‰€แ‹ญแˆซแˆˆแŠ•แฃ แŠ แˆฎแŒŒแ‹ แˆตแˆญแ‹“แ‰ต แ‹ซแˆ‰แ‰ตแŠ• แŒแŠ•แŠ™แŠแ‰ถแ‰ฝ แŠฅแŠ•แ‹ฒแ‹ซแŒ แŠ“แ‰…แ‰… แŠฅแŠ“แ‹ฐแˆญแŒ‹แˆˆแŠ•แข

แ‰ แ‰…แˆชแ‰ฐ แŠ แŠซแˆ แ‹แˆตแŒฅ แ‹ˆแ‹ญแˆ แ‰ แ‹แŒญ แ‹แ‰…แˆญ แˆตแˆˆแˆ›แ‰†แ‹จแ‰ตแˆต? แ‹แ‰…แˆญแŠ• แ‰ แ‰…แˆญแˆต แ‹แˆตแŒฅ แˆ›แ‰†แ‹จแ‰ต แˆ›แˆˆแ‰ต แ‰ แŠ แ‰ฅแ‹›แŠ›แ‹Žแ‰น แˆแŠ”แ‰ณแ‹Žแ‰ฝ แ‹ญแˆ… แ‹แ‰…แˆญ แŠจแˆŒแˆŽแ‰ฝ แ‰…แˆญแˆถแ‰ฝ แŒ‹แˆญ แ‰ฐแˆ˜แˆณแˆณแ‹ญ แ‹จแŒฅแˆซแ‰ต แˆ›แˆจแŒ‹แŒˆแŒซ แˆ‚แ‹ฐแ‰ต แŠ แˆˆแˆ แˆ›แˆˆแ‰ต แŠแ‹แข แˆตแˆˆแ‹šแˆ… แŠ แŠ•แ‹ต แˆฐแ‹ แŠ แ‹ˆแ‰ƒแ‰€แˆฉ แŒฅแˆฉ แŒฅแˆซแ‰ต แ‹ซแˆˆแ‹ แŠฅแŠ“ แŠฅแˆแŠแ‰ต แ‹จแˆšแŒฃแˆแ‰ แ‰ต แˆ˜แˆ†แŠ‘แŠ• แŠฅแˆญแŒแŒ แŠ› แˆŠแˆ†แŠ• แ‹ญแ‰ฝแˆ‹แˆ. แ‰ แ‰ฐแ‰ƒแˆซแŠ’แ‹ แ‹แ‰…แˆญ แ‰ แ‰ฐแˆˆแ‹จ แ‹แ‹ญแˆ แ‹แˆตแŒฅ แˆ›แŠ• แŠฅแŠ“ แˆˆแˆแŠ• แ‰ แ‹šแ‹ซ แ‹แ‹ญแˆ แˆ‹แ‹ญ แˆˆแ‹แŒฆแ‰ฝ แŠฅแŠ•แ‹ณแ‹ฐแˆจแŒ‰ แˆแŠ•แˆ แ‹ฑแŠซแ‹Žแ‰ฝ แ‹จแˆ‰แˆ แˆ›แˆˆแ‰ต แŠแ‹แข แ‹ญแˆ… แŠ แˆตแˆแˆ‹แŒŠ แŠแ‹? แˆˆแŠ แ‰ฅแ‹›แŠ›แ‹Žแ‰น แ‹จแˆแˆญแ‰ต แˆตแˆญแ‹“แ‰ถแ‰ฝ แ‹จแ‰ฐแˆจแŒ‹แŒ‹ แŠฅแŠ“ แŠจแแ‰ฐแŠ› แŒฅแˆซแ‰ต แ‹ซแˆˆแ‹ แ‹แ‰…แˆญ แ‰ขแŠ–แˆจแ‹ แ‹ญแˆปแˆ‹แˆ แ‰ฅแˆˆแŠ• แŠฅแŠ“แˆแŠ“แˆˆแŠ•แข

แ‹จแ‰…แˆชแ‰ฐ แŠ แŠซแˆ แˆฅแˆชแ‰ต แˆ˜แ‰ผ แŠฅแŠ•แ‹ฐแ‰ฐแˆแŒ แˆจแฃ แˆแŠ• แ‹“แ‹ญแŠแ‰ต แŠฅแˆดแ‰ถแ‰ฝแŠ• แŠฅแŠ•แ‹ฐแ‹ซแ‹˜แฃ แˆแŠ• แŠ แ‹ญแŠแ‰ต แ‰ฃแˆ…แˆชแ‹ซแ‰ต แŠฅแŠ•แ‹ฐแŠแ‰/แ‰ฐแˆฐแŠ“แŠจแˆ‰แฃ แ‰ แˆ›แ‹‹แ‰€แˆฉ แˆ‹แ‹ญ แŠฅแ‹ซแŠ•แ‹ณแŠ•แ‹ฑแŠ• แˆˆแ‹แŒฅ แ‹จแˆ›แ‹ตแˆจแŒ แŠƒแˆ‹แŠแŠแ‰ต แ‹จแŠแ‰ แˆจแ‹ แˆ›แŠ• แŠฅแŠ•แ‹ฐแˆ†แŠ แˆˆแˆ›แ‹ˆแ‰… แ‹ซแˆตแ‰ฝแˆ‹แˆแข แ‰ แ‰…แˆญแˆต แ‹แˆตแŒฅ แ‹แ‰…แˆญ แˆˆแˆ›แ‰†แ‹จแ‰ต แ‹จแ‰ฐแ‹ˆแˆฐแŠ แŒฅแˆจแ‰ต แˆŠแŒ แ‹ญแ‰… แ‹ญแ‰ฝแˆ‹แˆ แŠฅแŠ“ แ‹จแŠ•แ‹ตแ แˆแˆญแŒซ แŠแ‹แข

แŒฅแ‰…แˆžแ‰ฝ แŠฅแŠ“ แŒ‰แ‹ณแ‰ถแ‰ฝ

แŠฅแ‹šแˆ… แŠ แŠ•แ‹ณแŠ•แ‹ต แŒฅแ‰…แˆžแ‰ฝแŠ• แˆ›แŒ‰แˆ‹แ‰ต แŠฅแŠ“ แ‹จแ‰ณแ‰€แ‹ฐแ‹ แŠ แŠซแˆ„แ‹ต แŠ แŠ•แ‹ณแŠ•แ‹ต แŒ‰แ‹ณแ‰ถแ‰ฝแŠ• แˆ˜แ‹ˆแ‹ซแ‹จแ‰ต แŠฅแŠ•แˆแˆแŒ‹แˆˆแŠ•แข

แŒฅแ‰…แˆžแ‰ฝ

แ‹จแ‰ฐแŒ แŠ“แ‰€แ‰€ แ‹จแ‰ฐแŠจแ‹แˆแˆˆ แˆตแˆญแ‹“แ‰ต แ‹จแ‰ฐแ‹‹แˆƒแ‹ฐ แ‹แ‰…แˆญ แ‰ฃแˆ…แˆชแ‹Žแ‰ฝ

  1. แ‹จแˆ›แ‹ญแŠ•แ‰€แˆณแ‰€แˆต แ‹จแˆ›แ‹‹แ‰€แˆชแ‹ซ แแ‰ฐแˆปแข แ‹ญแˆ… แŠจแแ‰ฐแŠ› แ‰ แˆซแˆต แ‹จแˆ˜แ‰ฐแˆ›แˆ˜แŠ• แˆตแˆœแ‰ตแŠ• แ‹ญแˆฐแŒฃแˆ แฃ แ‹ญแˆ…แˆ แŠ แ‹ˆแ‰ƒแ‰€แˆฉ แ‰ตแŠญแŠญแˆ แŠแ‹ แŠจแ‹“แ‹ญแŠแ‰ต แŒˆแ‹ฐแ‰ฆแ‰ฝแข
  2. แ‹จแ‰ แˆˆแŒธแŒˆ แ‹จแˆ›แ‹‹แ‰€แˆญ แ‰‹แŠ•แ‰‹แข แ‰ แ‰ฐแˆˆแˆแ‹ถ แˆŒแˆŽแ‰ฝ แ‹จแˆ›แ‹‹แ‰€แˆญ แŠ แ‰€แˆซแˆจแ‰ฆแ‰ฝ แ‰ แŠ แ‰ฅแ‹›แŠ›แ‹Žแ‰น แ‰ฐแˆˆแ‹‹แ‹‹แŒญ แˆแ‰ตแŠญ แ‰ฅแ‰ป แ‹จแ‰ฐแŒˆแ‹ฐแ‰ก แŠ“แ‰ธแ‹แข
    Scala แŠ• แ‰ แˆ˜แŒ แ‰€แˆ แ‹แ‰…แˆจแ‰ตแŠ• แ‹จแ‰ฐแˆปแˆˆ แˆˆแˆ›แ‹ตแˆจแŒ แˆฐแŠ แ‹จแ‰‹แŠ•แ‰‹ แ‰ฃแˆ…แˆชแ‹ซแ‰ตแŠ• แˆ˜แŒ แ‰€แˆ แ‹ญแ‰ฝแˆ‹แˆแข แˆˆแˆแˆณแˆŒแฃ แŠแ‰ฃแˆช แŠฅแˆดแ‰ถแ‰ฝแŠ• แˆˆแˆ›แ‰…แˆจแ‰ฅ แ‰ฃแˆ…แˆชแ‹ซแ‰ตแŠ• แˆ˜แŒ แ‰€แˆ แŠฅแŠ•แ‰ฝแˆ‹แˆˆแŠ•แฃ แ‹จแ‰ฐแˆˆแ‹ซแ‹ฉ แ‹ˆแˆฐแŠ• แˆˆแˆ›แ‹˜แŒ‹แŒ€แ‰ต แŠฅแ‰ƒแ‹Žแ‰ฝแŠ•แฃ แˆแŠ•แŒ แ‰…แˆต แŠฅแŠ•แ‰ฝแˆ‹แˆˆแŠ• valแ‰ แ‹แŒซแ‹Š แ‹ˆแˆฐแŠ• (DRY) แŠ แŠ•แ‹ต แŒŠแ‹œ แ‰ฅแ‰ป แ‹ญแŒˆแˆˆแŒปแˆแข แ‰€แŒฅแ‰ฐแŠ› แ‰…แ‹ฐแˆ แ‰ฐแŠจแ‰ฐแˆŽแ‰ฝแŠ• แ‹ˆแ‹ญแˆ แ‹จแ‰ฐแ‹ˆแˆฐแŠ‘ แŠญแแˆŽแ‰ฝแŠ• (แŠ แ‰ฅแŠแ‰ถแ‰ฝแŠ•) แˆ˜แŒ แ‰€แˆ แ‹ญแ‰ปแˆ‹แˆ (Seq, Map, แ‹ˆแ‹˜แ‰ฐ.).
  3. DSL Scala แˆˆ DSL แŒธแˆƒแŠแ‹Žแ‰ฝ แŒฅแˆฉ แ‹ตแŒ‹แ แŠ แˆˆแ‹แข แ‹จแˆ˜แŒจแˆจแˆปแ‹ แ‹แ‰…แˆจแ‰ต แ‰ขแ‹ซแŠ•แˆต แ‰ แŒŽแˆซ แ‰ฐแŒ แ‰ƒแˆšแ‹Žแ‰ฝ แˆŠแŠแ‰ แ‰ฅ แ‹จแˆšแ‰ฝแˆ แŠฅแŠ•แ‹ฒแˆ†แŠ• แŠฅแŠแ‹šแˆ…แŠ• แ‰ฃแˆ…แˆชแ‹ซแ‰ต แ‹จแ‰ แˆˆแŒ  แˆแ‰น แŠฅแŠ“ แˆˆแ‹‹แŠ“ แ‰ฐแŒ แ‰ƒแˆš แ‰ฐแˆตแˆ›แˆš แ‹จแˆ†แŠ แ‹จแ‹แ‰…แˆญ แ‰‹แŠ•แ‰‹ แˆˆแˆ˜แˆ˜แˆตแˆจแ‰ต แŠฅแŠแ‹šแˆ…แŠ• แ‰ฃแˆ…แˆชแ‹ซแ‰ต แˆ˜แŒ แ‰€แˆ แ‹ญแ‰ฝแˆ‹แˆแข
  4. แ‰ แŠ แŠ•แŒ“แ‹Žแ‰ฝ แˆ‹แ‹ญ แ‰ณแˆ›แŠแŠแ‰ต แŠฅแŠ“ แ‹ˆแŒฅแŠแ‰ตแข แˆˆแŒ แ‰…แˆ‹แˆ‹แ‹ แ‹จแ‰ฐแŠจแ‹แˆแˆˆแ‹ แˆตแˆญแ‹“แ‰ต แ‰ แŠ แŠ•แ‹ต แ‰ฆแ‰ณ แˆ‹แ‹ญ แˆ›แ‹‹แ‰€แˆญ แŠจแˆšแ‹ซแˆตแŒˆแŠ›แ‰ธแ‹ แŒฅแ‰…แˆžแ‰ฝ แŠ แŠ•แ‹ฑ แˆแˆ‰แˆ แŠฅแˆดแ‰ถแ‰ฝ แŠ แŠ•แ‹ต แŒŠแ‹œ แ‰ แŒฅแ‰ฅแ‰… แ‹จแ‰ฐแŒˆแˆˆแŒน แŠฅแŠ“ แŠฅแŠ› แ‰ แˆแŠ•แˆแˆแŒ‹แ‰ธแ‹ แ‰ฆแ‰ณแ‹Žแ‰ฝ แˆแˆ‰ แŠฅแŠ•แ‹ฐแŒˆแŠ“ แŒฅแ‰…แˆ แˆ‹แ‹ญ แˆ˜แ‹‹แˆ แŠ แˆˆแ‰ฃแ‰ธแ‹แข แŠฅแŠ•แ‹ฒแˆแˆ แ‹ฐแˆ…แŠ•แŠแ‰ฑ แ‹จแ‰ฐแŒ แ‰ แ‰€ แ‹ˆแ‹ฐแ‰ฅ แˆ˜แŒแˆˆแŒซแ‹Žแ‰ฝแŠ• แ‹ญแ‰ฐแ‹ญแ‰ก แ‰ แˆแˆ‰แˆ แ‰ตแŠญแŠญแˆˆแŠ› แŠ แ‹ˆแ‰ƒแ‰€แˆฎแ‰ฝ แ‹จแˆตแˆญแ‹“แ‰ฑ แŠ แŠ•แŒ“แ‹Žแ‰ฝ แŠ แŠ•แ‹ต แŠ แ‹ญแŠแ‰ต แ‰‹แŠ•แ‰‹ แŠฅแŠ•แ‹ฐแˆšแŠ“แŒˆแˆฉ แ‹ซแˆจแŒ‹แŒแŒกแข แŠ แŠ•แ‹ณแŠ•แ‹ต แŠ แŒˆแˆแŒแˆŽแ‰ถแ‰ฝแŠ• แˆ˜แˆตแŒ แ‰ตแŠ• แˆˆแˆ˜แˆญแˆณแ‰ต แŠ แˆตแ‰ธแŒ‹แˆช แ‹จแˆšแ‹ซแ‹ฐแˆญแŒˆแ‹ แ‰ แˆ˜แˆตแ‰€แˆˆแŠ› แˆ˜แŠ•แŒˆแ‹ต แˆ˜แŠซแŠจแˆ แŒแˆแŒฝ แŒฅแŒˆแŠžแ‰ฝ แŠ แˆ‰แข
  5. แŠจแแ‰ฐแŠ› แŒฅแˆซแ‰ต แ‹ซแˆ‹แ‰ธแ‹ แˆˆแ‹แŒฆแ‰ฝ. แ‹แ‰…แˆจแ‰ตแŠ• แ‹จแˆ›แˆˆแ แŠ แŒ แ‰ƒแˆ‹แ‹ญ แŠ แ‰€แˆซแˆจแ‰ฅ แ‰ แ‰ฐแˆˆแˆ˜แ‹ฐแ‹ แ‹จ PR แˆ‚แ‹ฐแ‰ต แ‹แˆตแŒฅ แ‹ญแˆˆแ‹ˆแŒฃแˆ แŠจแแ‰ฐแŠ› แ‹จแŒฅแˆซแ‰ต แ‹ฐแˆจแŒƒแ‹Žแ‰ฝ แ‰ แˆ›แ‹‹แ‰€แˆญแˆ แ‹แˆตแŒฅแข
  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 แ‹แˆตแŒฅ แ‰ขแ‰ฐแŒˆแ‰ แˆญแˆ แ‹ˆแ‹ฐ แˆŒแˆŽแ‰ฝ แˆŠแ‹˜แŒ‹แŒ แ‹จแˆšแ‰ฝแˆ‰ แ‰‹แŠ•แ‰‹แ‹Žแ‰ฝ (แŠฅแŠ•แ‹ฐ แŠฎแ‰ตแˆŠแŠ• แฃ แˆฒ # แฃ แˆตแ‹Šแแ‰ต แฃ แ‹ˆแ‹˜แ‰ฐ) แˆŠแ‰ฐแˆจแŒŽแˆ แ‹ญแ‰ฝแˆ‹แˆแข แŠ แŠ•แ‹ต แˆฐแ‹ แ‹ญแˆ…แŠ•แŠ• แŠ แŠซแˆ„แ‹ต แ‰ แŠ แ‹ฒแˆต แ•แˆฎแŒ€แŠญแ‰ต แˆŠแˆžแŠญแˆญ แ‹ญแ‰ฝแˆ‹แˆ แŠฅแŠ“ แ‰ แŒฅแˆฉ แˆแŠ”แ‰ณ แ‹จแˆ›แ‹ญแˆตแˆ›แˆ› แŠจแˆ†แŠ แ‹ˆแ‹ฐ แŠ แˆฎแŒŒแ‹ แ‹แˆฝแŠ• แˆ˜แŠ•แŒˆแ‹ต แ‹ญแ‰€แ‹ญแˆฉแข

แŠฅแˆญแŒแŒฅ แŠแ‹, แ‹จแ‰ฐแŒ แŠ“แ‰€แˆจ แ‹แ‰…แˆญ แŠจแแ‰ฐแŠ› แŒฅแˆซแ‰ต แ‹ซแˆˆแ‹ แ‹จแŠฅแ‹ตแŒˆแ‰ต แˆ‚แ‹ฐแ‰ต แ‹ญแŒ แ‹ญแ‰ƒแˆ. แ‰ แˆแˆ‹แˆนแˆ แ‰ แ‰ฐแˆ˜แˆณแˆณแ‹ญ แŠจแแ‰ฐแŠ› แŒฅแˆซแ‰ต แ‹ซแˆˆแ‹ แŒ แŠ•แŠซแˆซ แ‹แ‰…แˆญ แˆˆแˆ›แ‰…แˆจแ‰ฅ แ‰ƒแˆ แŒˆแ‰ฅแ‰ทแˆแข

แ‹ญแˆ… แ‹˜แ‹ด แ‰ แ‰ฐแˆˆแ‹ซแ‹ฉ แˆ˜แŠ•แŒˆแ‹ถแ‰ฝ แˆŠแˆซแ‹˜แˆ แ‹ญแ‰ฝแˆ‹แˆ-

  1. แ‹จแ‹แ‰…แˆจแ‰ต แˆ›แˆจแŒ‹แŒˆแŒซแŠ• แˆˆแˆ›แŠซแˆ„แ‹ต แˆ›แŠญแˆฎแ‹Žแ‰ฝแŠ• แˆ˜แŒ แ‰€แˆ แŠฅแŠ“ แ‰ แˆ›แŠ•แŠ›แ‹แˆ แ‹จแŠ•แŒแ‹ต-แˆŽแŒ‚แŠญ แŒˆแ‹ฐแ‰ฆแ‰ฝ แ‹แ‹ตแ‰€แ‰ถแ‰ฝ แŒŠแ‹œ แ‰ แˆ›แŒ แŠ“แ‰€แˆญ แŒŠแ‹œ แˆŠแˆณแŠซ แ‹ญแ‰ฝแˆ‹แˆแข
  2. DSL แ‹แ‰…แˆญแŠ• แ‰ แŒŽแˆซ แˆˆแ‰ฐแŒ แ‰ƒแˆš แˆแ‰น แ‰ แˆ†แŠ แˆ˜แŠ•แŒˆแ‹ต แˆˆแˆ˜แ‹ˆแŠจแˆ แˆŠแ‰ฐแŒˆแ‰ แˆญ แ‹ญแ‰ฝแˆ‹แˆแข
  3. แ‰ฐแˆˆแ‹‹แ‹‹แŒญ แ‹จแŠ•แ‰ฅแˆจแ‰ต แŠ แˆตแ‰ฐแ‹ณแ‹ฐแˆญ แŠจแˆซแˆต-แˆฐแˆญ แ‹แ‰…แˆญ แˆ›แˆตแ‰ฐแŠซแŠจแ‹ซแ‹Žแ‰ฝ แŒ‹แˆญแข แˆˆแˆแˆณแˆŒแฃ แ‹จแŠญแˆ‹แˆตแ‰ฐแˆญ แŠ–แ‹ถแ‰ฝแŠ• แ‰แŒฅแˆญ แˆตแŠ“แˆตแ‰ฐแŠซแŠญแˆ แˆแŠ•แˆแˆแŒ‹แ‰ธแ‹ แŠฅแŠ•แ‰ฝแˆ‹แˆˆแŠ• (1) แŠ–แ‹ถแ‰น แ‰ แ‰ตแŠ•แˆน แ‹จแ‰ฐแˆปแˆปแˆˆ แ‹แ‰…แˆญ แˆˆแˆ›แŒแŠ˜แ‰ตแค (2) แ‹จแŠญแˆ‹แˆตแ‰ฐแˆญ แŠ แˆตแ‰ฐแ‹ณแ‹ณแˆช แŠ แ‹ฒแˆต แ‹จแŠ แŠ•แŒ“แ‹Žแ‰ฝแŠ• แˆ˜แˆจแŒƒ แˆˆแˆ˜แ‰€แ‰ แˆแข

แŠ แˆ˜แˆฐแŒแŠ“แˆˆแˆ

แ‰ แ‹šแˆ… แˆแŠกแŠญ แŒฝแˆแ แˆจแ‰‚แ‰… แˆ‹แ‹ญ แŠ แŠแˆณแˆฝ แŠ แˆตแ‰ฐแ‹ซแ‹จแ‰ต แˆตแˆˆแˆฐแŒกแŠ แŠ แŠ•แ‹ตแˆฌ แˆณแŠญแˆถแŠ–แ‰ญแฃ แ“แ‰ฌแˆ แ–แ–แ‰ญแฃ แŠ แŠ•แ‰ถแŠ• แŠ”แˆƒแ‹ฌแ‰ญ แ‹จแ‰ แˆˆแŒ  แŒแˆแ… แŠฅแŠ•แ‹ณแ‹ฐแˆญแŒ แ‹จแˆจแ‹ฑแŠแŠ• แŠ แˆ˜แˆฐแŒแŠ“แˆˆแˆ แˆ›แˆˆแ‰ต แŠฅแˆแˆแŒ‹แˆˆแˆแข

แˆแŠ•แŒญ: hab.com