Skip to content

CloudBreadProject/CloudBread-Doc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

14 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

CloudBread-Doc ํ”„๋กœ์ ํŠธ

์ด ๋ฌธ์„œ๋Š” CloudBread ํ”„๋กœ์ ํŠธ์˜ ์ฃผ์š”๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์†Œ๊ฐœํ•˜๋Š” Repository

CloudBread๋Š”

ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„ ์„œ๋ฒ„ ํ”Œ๋žซํผ: MGBaaS
100% ๊ตญ์‚ฐ ๊ณต๊ฐœSW ํ”„๋กœ์ ํŠธ์ธ ํด๋ผ์šฐ๋“œ๋ธŒ๋ ˆ๋“œ(CloudBread)๋Š” ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜์˜ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋กœ์„œ ํญ๋ฐœ์ ์ธ ์„ฑ์žฅ์„ ํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„์„ ์œ„ํ•œ ์˜ฌ์ธ์›(all-in-one) ์„œ๋ฒ„ ์—”์ง„ ํ”Œ๋žซํผ์ด๋‹ค.

๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„์„ ํ†ตํ•ด ์ถ•์ ๋˜๋Š” ๋น…๋ฐ์ดํƒ€์ธ ์‚ฌ์šฉ์ž ํ–‰๋™(ํŒจํ„ด) ๋ถ„์„์„ ์ค‘์š”ํ•œ ์ฒซ ๋ฒˆ์งธ ์ด์ •ํ‘œ๋กœ ๋ชฉํ‘œํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํŠนํžˆ ๋จธ์‹ ๋Ÿฌ๋‹(Machine Learning) ์—”์ง„์„ ํ”„๋กœ์ ํŠธ์˜ ์ค‘์žฅ๊ธฐ์ ์ธ ์ฐจ๋ณ„ํ™” ๊ธฐ๋Šฅ์ค‘ ํ•˜๋‚˜๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋‹ค.

ํด๋ผ์šฐ๋“œ๋ธŒ๋ ˆ๋“œ ํ”„๋กœ์ ํŠธ๋Š” ํ˜„์žฌ ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„์„ ์œ„ํ•ด ์ตœ์ ํ™”๋œ ํ† ํƒˆ ์„œ๋ฒ„ ์—”์ง„๊ณผ ๋น…๋ฐ์ดํƒ€ ๋ถ„์„ ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ํ†ตํ•œ ๋จธ์‹ ๋Ÿฌ๋‹์œผ๋กœ ์ด์–ด์ง€๋Š” ์„ฑ์žฅ ๋กœ๋“œ๋งต(roadmap)์„ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋Ÿฐ ๋‹ค์–‘ํ•œ ๊ณต๊ฐœSW ๋ชจ๋“ˆ๋“ค์ด ๋‹ค์–‘ํ•œ ํƒ€ ๊ณต๊ฐœSW ์—์„œ๋„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณต๊ฐœ์„ฑ์ด ๋†’์€ MIT ๋ผ์ด์„ผ์Šค๋ฅผ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋‹ค.

ํ•œ๊ตญ์˜ ์•„ํ‹€๋ผ์‹œ์•ˆ(Atlassian)์„ ์ง€ํ–ฅํ•˜๋Š” ํด๋ผ์šฐ๋“œ๋ธŒ๋ ˆ๋“œ ํ”„๋กœ์ ํŠธ๋Š” ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„์„ ์œ„๋ž€ ํ†ตํ•ฉ ์„œ๋ฒ„ ์—”์ง„์œผ๋กœ์„œ MGBaaS(Mobile Game Backend as a Service) ํ”Œ๋žซํผ์„ ์ถ”๊ตฌํ•œ๋‹ค.

CloudBread ํ”„๋กœ์ ํŠธ ๊ณต์‹ ์›น์‚ฌ์ดํŠธ

CloudBread ํ”„๋กœ์ ํŠธ : https://github.com/CloudBreadProject
CloudBread ๋ฉ”์ธ : https://github.com/CloudBreadProject/CloudBread
CloudBread ์›น์‚ฌ์ดํŠธ : http://www.cloudbread.org/
CloudBread ๊ณต์‹ ํŽ˜์ด์Šค๋ถ ๊ทธ๋ฃน : https://www.facebook.com/groups/cloudBreadProject/
CloudBread ๊ฐœ๋ฐœ์ž ๊ฐ€์ด๋“œwiki(ํ•œ๊ธ€) : https://github.com/CloudBreadProject/CloudBread/wiki/Home-kor
CloudBread ์„ค์น˜ ๊ฐ€์ด๋“œ wiki(ํ•œ๊ธ€) : https://github.com/CloudBreadProject/CloudBread/wiki/Install-guide-kor
CloudBread API ๋ ˆํผ๋Ÿฐ์Šค : http://cloudbreadproject.github.io/

###1. ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„์„ ์œ„ํ•œ ๋กœ์ง ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„์— ํ•„์š”ํ•œ 100์—ฌ๊ฐ€์ง€์˜ ๋‹ค์–‘ํ•œ behavior ๋“ค์„ ๊ตฌํ˜„ํ•ด API๋ฅผ ํ˜ธ์ถœํ•ด ์ฆ‰์‹œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋„๋ก ๋กœ์ง ๊ตฌํ˜„
CloudBread ์„ค์น˜๊ฐ€์ด๋“œ ๋ฌธ์„œ ์ฐธ์กฐ
CloudBread API ๊ฐ€์ด๋“œ ๋ฌธ์„œ ์ฐธ์กฐ

###2. PaaS ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๊ฒŒ์ž„ ์„œ๋ฒ„ (์—”์ง„) CloudBread๋Š” PaaS/DaaS ๊ธฐ๋ฐ˜ ๊ฒŒ์ž„์„œ๋ฒ„๋กœ ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž(์‚ฌ)๊ฐ€ ํด๋ผ์ด์–ธํŠธ ๊ฐœ๋ฐœ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ด€๋ฆฌ ํฌ์ธํŠธ๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Œ
CloudBread ์บ ํ”„ ์•„ํ‚คํ…์ฒ˜ ๊ฐ€์ด๋“œ ๋ฌธ์„œ ์ฐธ์กฐ

###3. ๊ฐœ๋ฐœ/ํ…Œ์ŠคํŠธ/๋ฐฐํฌ ํ†ตํ•ฉํ™˜๊ฒฝ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํ™˜๊ฒฝ์„ ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์‚ฌ๊ฐ€ ๋” ์‰ฝ๊ฒŒ ํ™œ์šฉ ๊ฐ€๋Šฅํ•œ ํ”Œ๋žซํผ ์ œ๊ณต
๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐœ๋ฐœ / ๊ฒŒ์‹œ / ๋ฐฐํฌ ํ•  ๊ฒฝ์šฐ ์ต์ˆ™ํ•œ git/github์„ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, node.js๋กœ ๊ฐœ๋ฐœ๋œ Admin-Web์ด๋‚˜ Socket ๋“ฑ์˜ ํ”„๋กœ์ ํŠธ๋„ ์ฆ‰์‹œ App Service๋กœ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ธฐ๋ณธ PaaS์˜ ๊ธฐ๋Šฅ์œผ๋กœ ์ œ๊ณต
CloudBread ARM ๋ฐฐํฌ Repo
App Service์˜ git/github ๋“ฑ ํ†ตํ•ฉ ๋ฐฐํฌ

###4. ์„œ๋น„์Šค ๊ทœ๋ชจ์— ๋”ฐ๋ฅธ ํด๋ผ์ด์–ธํŠธ ๊ฒŒ์ž„๋ณ€๊ฒฝ ์—†์Œ ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„ ํด๋ผ์ด์–ธํŠธ๋Š” ์ œ๊ณต๋˜๋Š” API๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋˜๋ฉฐ, ๋ฌด์ œํ•œ์— ๊ฐ€๊นŒ์šด ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ API ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ๊ทธ๋Œ€๋กœ ํ™œ์šฉ ๊ฐ€๋Šฅ.
์ด๋ฏธ ์นด์นด์˜ค ์ž…์  ๊ฒŒ์ž„ ๋“ฑ์˜ stress test ๋“ฑ์„ ์ง„ํ–‰ํ–ˆ์œผ๋ฉฐ, ํด๋ผ์šฐ๋“œ PaaS App Service์˜ scale-up๊ณผ scale-out์„ ํ™œ์šฉํ•ด ๋ฌด์ œํ•œ์— ๊ฐ€๊นŒ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ํ™œ์šฉ ๊ฐ€๋Šฅ.
์ง€๋‚œ Unity United ํ–‰์‚ฌ์—์„œ jmetor ๋ฐ cloud ๊ธฐ๋ฐ˜ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๊ด€๋ จ ์‹œ์—ฐ์„ ์ˆ˜ํ–‰ํ–ˆ๊ณ , 6,000 RPS(Request per Second) ์ด์ƒ์˜ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ ๊ธฐ๋ณธ ์ œ๊ณต
Unity United 2016 ๋ฐœํ‘œ์ž๋ฃŒ ์„ฑ๋Šฅ์ง€ํ‘œ

###5. ํ…Œ์ŠคํŠธ/๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ Postman / Github wiki ๋ฐ CloudBread ์บ ํ”„๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋œ ์ฝ˜ํ…ํŠธ๋ฅผ ์ด์šฉํ•ด ๊ฒŒ์ž„ ๋ฐฑ์—”๋“œ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
ํŠนํžˆ, 100์—ฌ๊ฐœ์˜ Behavior๋ฅผ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์œ„ํ•ด ์ง์ ‘ Restful API๋ฅผ ์ œ์ž‘ํ•˜๊ฑฐ๋‚˜ ๋งŒ๋“ค ํ•„์š” ์—†์ด, Postman์˜ collection์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์–ด ๋ฐ”๋กœ Camp ๋“ฑ์—์„œ๋„ ์ฐธ์—ฌ์ž์™€ ํ˜‘์—… ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ ์ œ๊ณต
ํŠนํžˆ, CloudBread-Unity-SDK ํ”„๋กœ์ ํŠธ๋Š” Unity์—์„œ ๋ฐ”๋กœ CloudBread์˜ API๋ฅผ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ SDK ํ”„๋กœ์ ํŠธ๋กœ Unity์—์„œ์˜ CloudBread ๊ฐœ๋ฐœ์„ ๋” ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์ง„ํ–‰ ๊ฐ€๋Šฅ
CloudBread Unity SDK Repo
CloudBread wiki ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ

###6. ๊ฒŒ์ž„ ์„œ๋ฒ„ ๊ธ€๋กœ๋ฒŒ ๋ฐฐํฌ ARM ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด ์ „์„ธ๊ณ„ ์›ํ•˜๋Š” ์ง€์—ญ์˜ ๋ฐ์ดํ„ฐ์„ผํ„ฐ์— ์†์‰ฌ์šด ๋ฐฐํฌ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ž๋™ํ™”๋œ ๋ฐฐํฌํ™˜๊ฒฝ ๊ตฌํ˜„
๋ฐ์ดํ„ฐ ์„ผํ„ฐ๊ฐ€ ์ œ๊ณต๋˜๋Š” ์–ด๋А๊ณณ์—์„œ๋‚˜ 10๋ถ„ ์ด๋‚ด์— ๋ชจ๋“  CloudBread์˜ ์„œ๋น„์Šค ํ™˜๊ฒฝ์„ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•ด ๋™๋‚จ์•„ pre-launching์ด๋‚˜ ๋ถ๋ฏธ ์œ ๋Ÿฝ ์ง€์—ญ์— ์ตœ์ ํ™”๋œ latency ์ œ๊ณต ๊ฐ€๋Šฅ
CloudBread-ARM ํ”„๋กœ์ ํŠธ๋Š” GUI ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ Script ๊ธฐ๋ฐ˜์œผ๋กœ CloudBread ์‹คํ–‰์„ ์œ„ํ•ด ํ•„์š”ํ•œ Resource๋“ค์„ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ํ•„์ˆ˜ ์„ค์น˜ ํ”„๋กœ์ ํŠธ
๋ฐ์ดํ„ฐ ์„ผํ„ฐ ์œ„์น˜
CloudBread ARM ํ”„๋กœ์ ํŠธ Repo

###7. ๊ธ€๋กœ๋ฒŒ ๋™์‹œ ๋ฐฐํฌ/ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ ๊ธ€๋กœ๋ฒŒ ๋™์‹œ ๋ก ์นญ์‹œ ๊ฒŒ์ด๋จธ๊ฐ€ ๊ฐ€๊นŒ์šด ๋ฐ์ดํ„ฐ์„ผํ„ฐ์— ์ž๋™ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ํ™˜๊ฒฝ ๊ตฌํ˜„
Traffic manager๋ฅผ ์ด์šฉํ•œ ๊ธ€๋กœ๋ฒŒ ๋ก ์นญ ํ”„๋กœ์ ํŠธ ๊ฐ€๋Šฅ
๊ธ€๋กœ๋ฒŒ ๋ก ์นญ1

Traffic manager๋ฅผ ์ด์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฐ์ดํ„ฐ์„ผํ„ฐ๋กœ request๊ฐ€ ์š”์ฒญ๋จ

Traffic Manager ์ฐธ์กฐ๋ฌธ์„œ

###8. AES ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™” AES256์œผ๋กœ ๊ธฐ๋ณธ Encryption๋œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ CloudBread ๊ฐœ๋ฐœ์ž ๊ฐ€์ด๋“œ ์•”ํ˜ธํ™” ์ฐธ์กฐ๋งํฌ

  • Crypt ์ฒ˜๋ฆฌ๋กœ web.config์˜ ์„ค์ •์„ ์ด์šฉํ•ด AES256 ์•”ํ˜ธํ™” ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
    <!-- Encryption configuration. ์•”ํ˜ธํ™” ์„ค์ •-->
    <add key="CloudBreadCryptSetting" value="AES256"></add>
    <add key="CloudBreadCryptKey" value="1234567890123456"></add>
    <add key="CloudBreadCryptIV" value="1234567890123456"></add>
  • ํด๋ผ์ด์–ธํŠธ์—์„œ ์•”ํ˜ธํ™” ๊ตฌ์„ฑ์„ ์ˆ˜ํ–‰ํ•ด CloudBread API๋ฅผ ํ˜ธ์ถœ
  • ์•”ํ˜ธํ™”๋˜์–ด ์ „๋‹ฌ๋œ ํ…์ŠคํŠธ๋ฅผ CloudBread๊ฐ€ ๋ณตํ˜ธํ™”ํ•ด ์„œ๋ฒ„์— ์ €์žฅ
  • ์•”ํ˜ธํ™” ์„ค์ •์‹œ ์ž๋™ ํด๋ผ์ด์–ธํŠธ์— ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด response
  • **CloudBread-Encrypt-Text-Tool**๋กœ ์•”ํ˜ธํ™” ๋ณตํ˜ธํ™”๋ฅผ ๊ฐœ๋ฐœ์‹œ ๋ฌธ์ž์—ด ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ
  • Postman์— ๊ธฐ๋ณธ ์„ค์ •๋œ ์˜ˆ์ œ(Encrypt๋กœ ์‹œ์ž‘)๋ฅผ ํ™œ์šฉ ๊ฐ€๋Šฅ
  • DEMO ์šฉ๋„๋กœ, "https://cb2-crypt-demo.azurewebsites.net" ์„œ๋ฒ„ ์ด์šฉ ๊ฐ€๋Šฅ

###9. ๊ฒŒ์ž„ ๋กœ๊ทธ ์ €์žฅ NoSQL ์ €์žฅ์†Œ๋ฅผ ํ™œ์šฉํ•ด JSON๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ–ฅํ›„ ๋กœ๊ทธ ๋ถ„์„ ๋ชฉ์ ์œผ๋กœ ์ ์žฌ
CloudBread์—์„œ์˜ ๋กœ๊ทธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Behavior API๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๋ชจ๋“  ๋ฃจํ‹ด์—์„œ ํ˜ธ์ถœ๋จ
์˜ˆ๋ฅผ ๋“ค์–ด,
CBComInsMemberItem API ์˜ ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด ๋กœ๊ทธ๋ฅผ ์ ์žฌํ•˜๊ณ  RunLog()๋ฅผ ์ˆ˜ํ–‰

...
// task end log
logMessage.memberID = p.MemberID;
logMessage.Level = "INFO";
logMessage.Logger = "CBComInsMemberItemController";
logMessage.Message = jsonParam;
Logging.RunLog(logMessage);
...

RunLog()๋Š” CBLoggers ์— implement ๋˜์–ด์žˆ๊ณ , config์— ๋”ฐ๋ผ NoSQL Table Storage ๋“ฑ์— ์ ์žฌ ๊ฐ€๋Šฅ

...
switch (globalVal.CloudBreadLoggerSetting)
{
    case "SQL":
        /// Save log on SQL

    case "ATS":
        /// Save log on Azure Table Storage

    case "AQS":
        /// Save log on Azure Queue Storage

    case "redis":
        /// Save log on Azure Redis Cache
        /// yyyymmdd:memberid:Controller:GUID
}
...

์ด๋ ‡๊ฒŒ ์›ํ•˜๋Š” ํƒ€์ž…์˜ ๋ถ„์„ ์„ฑํ–ฅ๊ณผ ๋ชฉ์ ์— ๋งž๋Š” NoSQL์— ์ ์žฌ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๊ธฐ๋ณธ NoSQL - Table Storage ์„ค์ •์„ ๊ถŒ์žฅ

###10. ๊ธฐ๋ณธ ๊ด€๋ฆฌ์ž ํ™”๋ฉด ๊ฒŒ์ž„ ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋ณธ ๊ด€๋ฆฌ์ž ํ™”๋ฉด๊ณผ ํ†ต๊ณ„ ์ •๋ณด๋ฅผ ํ™•์ธ ๊ฐ€๋Šฅํ•œ ํ™”๋ฉด ์ œ๊ณต
CloudBread Admin Web ๊ณต์‹ Repo

ํ˜„์žฌ ๋ฐฐํฌ ์ค‘์ธ React๋กœ ๊ฐœ๋ฐœ๋œ 2.1 project branch๋ฅผ ์•„๋ž˜ ๋งํฌ์—์„œ ๊ฒ€ํ†  ๊ฐ€๋Šฅ
(์ฃผ์˜! ํ˜„์žฌ master branch๋Š” ์ง€์† ์—…๋ฐ์ดํŠธ ์ค‘)

๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ ํ”„๋กœ์ ํŠธ(2.1 stable)  
Admin-Web ๋ฐ๋ชจ ๋งํฌ : https://cb2-admin-demo.azurewebsites.net/  
id : demo@cb2admin.onmicrosoft.com  
pwd : P@ssw0rd!  

์ฐธ์กฐ : CB2 ๋ฐ๋ชจ ์‚ฌ์ดํŠธ๋Š” ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ดˆ๊ธฐํ™”๋จ(1์‹œ๊ฐ„์— 1ํšŒ)

CloudBread Admin Web 2.5 - node ํ”„๋กœ์ ํŠธ๋Š” ์ „์ฒด CloudBread-Admin-Web์„ ์•„๋ž˜์˜ ๋ถ„์„ ๊ธฐ๋Šฅ๋“ค์„ ํฌํ•จํ•˜๋Š” node.js ๋กœ ์ง€์† ๊ฐœ๋ฐœ ์ค‘

###11. DAU/HAU/ARPU ๋“ฑ์˜ ํ†ต๊ณ„ ์ผ์ผ ์‚ฌ์šฉ์ž ๋“ฑ์˜ ํ†ต๊ณ„ ์ •๋ณด๋ฅผ ์œ„์˜ 10๋ฒˆ Admin-Web ํ”„๋กœ์ ํŠธ์—์„œ ๋กœ๊ทธ์ธ ํ›„ ํ™•์ธ ๊ฐ€๋Šฅ
ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ๋ฅผ generateํ•˜๋Š” schduler ํ”„๋กœ์ ํŠธ๋Š” CloudBread-Scheduler Repo์—์„œ WebJob ์œผ๋กœ ์ƒ์„ฑํ•ด ์Šค์ผ€์ฅด ์ฒ˜๋ฆฌ

ํ˜„์žฌ Schduler๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜์˜ Slack ์ฑ„๋„์— messgae๊ฐ€ ๋„์ฐฉํ•˜๋„๋ก ๊ตฌ์„ฑ๋œ ์ƒํƒœ
CloudBread Slack Notification : https://cloudbread.slack.com/messages/general/
์ฆ‰, ํ•ด๋‹น notification์„ ๋ฐ›์•„์•ผ ํ•˜๋Š” ํŒ€์›์—๊ฒŒ ์•„๋ž˜ slack channel์—์„œ ๊ด€๋ จ batch ์ž‘์—…์ด ์™„๋ฃŒ ๋˜๋Š” ๊ฒƒ์„ PC์™€ ๋ชจ๋ฐ”์ผ ์–‘์ชฝ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅ

CloudBread-Scheduler ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ์— ๋Œ€ํ•ด์„œ๋Š” CloudBread ์„ค์น˜ ๊ฐ€์ด๋“œ wiki์˜ CloudBread-Scheduler ํ•ญ๋ชฉ ์ฐธ์กฐ

###12. ์ด๋ฒคํŠธ/์ฟ ํฐ/์„ ๋ฌผ๊ด€๋ฆฌ ๊ฒŒ์ž„์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์™„๋ฃŒ ์ƒํƒœ.
๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์—์„œ ๋ชจ๋‘ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” Postman ๋ฐ Behavior ๋ฆฌ์ŠคํŠธ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•ด ํ•ด๋‹น API๋ฅผ ํ˜ธ์ถœ ์ฒ˜๋ฆฌ

###13. ๋กœ๊ทธ๋ถ„์„ - Big data / Hadoop ์ ์žฌ๋˜๋Š” NoSQL๊ธฐ๋ฐ˜ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ Big-data Hadoop์„ ํ™œ์šฉํ•ด ๋ถ„์„
CloudBread๋Š” NoSQL์ธ Table Storage์˜ ๋ถ„์„์„ ์œ„ํ•ด HortonWorks์˜ Hadoop PaaS ๋ฐฐํฌํŒ์ธ HDInsight๋ฅผ ์ด์šฉํ•ด ๋ถ„์„ ์ˆ˜ํ–‰

HDInsight ๊ณต์‹ ์‚ฌ์ดํŠธ ๋งํฌ

Table Storage๋Š” Key/Value ๊ธฐ๋ฐ˜ NoSQL ์ €์žฅ์†Œ๋กœ, CloudBread์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ˆ˜์ • ์ž‘์—…์„ ๋กœ๊ทธ๋กœ ๊ธฐ๋กํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์–‘ํ•œ Big data ๋ถ„์„ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ , ์•„๋ž˜ ์˜ˆ์ œ๋Š” ์ง€๋‚œ CloudBread ์บ ํ”„์—์„œ ์š”์ฒญ ์ฃผ์…จ๋˜ ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„์˜ ์Šคํ…Œ์ด์ง€ ๋ ˆ๋ฒจ(๋‚œ์ด๋„) ๋””์ž์ธ ๋ถ„์„ ์‹œ๋‚˜๋ฆฌ์˜ค

๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„์˜ ์Šคํ…Œ์ด์ง€ ๋ ˆ๋ฒจ(๋‚œ์ด๋„) ๋””์ž์ธ ๋ถ„์„

  • ๋ชฉํ‘œ์ •์˜ : 30์—ฌ๊ฐœ์˜ ์Šคํ…Œ์ด์ง€๊ฐ€ ์กด์žฌํ•˜๋Š” ์บ์ฃผ์–ผ ๊ฒŒ์ž„. ์Šคํ…Œ์ด์ง€๋ณ„๋กœ ๋‚œ์ด๋„๋ฅผ ์ ์ ˆํžˆ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, ํ•ด๋‹น ์Šคํ…Œ์ด์ง€๋ณ„๋กœ ํด๋ฆฌ์–ด์— ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„ ๋“ฑ์„ ๊ธฐ๋กํ•ด ์Šคํ…Œ์ด์ง€ ๋‚œ์ด๋„๋ฅผ ์กฐ์ ˆํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ ํฌ๋ง. ์ด๋ฅผ ์œ„ํ•ด Closed Beta ์„œ๋น„์Šค๋ฅผ CloudBread๋กœ 7์ผ๊ฐ„ ์ง„ํ–‰ํ–ˆ๊ณ , 7์ผ๊ฐ„ ์ˆ˜์ง‘๋œ CloudBread ๋กœ๊ทธ์—์„œ ์Šคํ…Œ์ด์ง€๋ณ„ ๋‚œ์ด๋„ ๋ถ„์„์„ ํฌ๋ง

  • ๊ธฐ๋ณธ์ •๋ณด : ๊ฒŒ์ž„์˜ ์Šคํ…Œ์ด์ง€ ์ •๋ณด๋Š” Member : MemberGameInfoStage ํ…Œ์ด๋ธ”์— one to many relationship์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ์Œ. ์ด ์ •๋ณด๋Š” RDBMS์ด๊ธฐ ๋•Œ๋ฌธ์— state ์ •๋ณด๋งŒ์„ ์ €์žฅํ•ด log์„ฑ์œผ๋กœ ๋‚จ๊ธฐ์ง€๋Š” ์•Š์Œ.

  • CloudBread์˜ API์ธ CBComInsMemberGameInfoStagesController์—์„œ ๋กœ๊ทธ ์ ์žฌ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๊ฒŒ ๋˜๊ณ , ์ด ๋ฃจํ‹ด์— ์•„๋ž˜์˜ log๋ฅผ ๋‚จ๊ธฐ๋Š” ์ฒ˜๋ฆฌ๊ฐ€ ์กด์žฌ

// task end log
logMessage.memberID = p.MemberID;
logMessage.Level = "INFO";
logMessage.Logger = "CBComInsMemberGameInfoStagesController";
logMessage.Message = jsonParam;
Logging.RunLog(logMessage);
  • ์ผ๋ณ„ ์ ์žฌ๋˜๋Š” ๋กœ๊ทธ ๋ฐ์ดํ„ฐ์—์„œ CBComInsMemberGameInfoStagesController ์‹๋ณ„์ž๋ฅผ ์ด์šฉํ•ด Hadoop์—์„œ Hive๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์›ํ•˜๋Š” ์Šคํ…Œ์ด์ง€๋ณ„ ํด๋ฆฌ์–ด ์†Œ์š” ์‹œ๊ฐ„์„ ๊ณ„์‚ฐ ๊ฐ€๋Šฅ

  • HDInsight์˜ HDFS๋Š” Blob Storage์™€ ํ˜ธํ™˜๋จ

  • Blob ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ Storage Explorer ๊ฐœ๋ฐœ ๋„๊ตฌ์—์„œ blob ์„ ๋กœ๋“œ. blob๋“ค์€ "wasbs:///example/data/" ํ•˜์œ„๋กœ ๋งคํ•‘๋จ

  • Storage Explorer ๊ฐœ๋ฐœ ๋„๊ตฌ์—์„œ blob ์„ ๋กœ๋“œ Storage Explorer ๊ฐœ๋ฐœ ๋„๊ตฌ์—์„œ blob ์„ ๋กœ๋“œํ•˜๋Š” ํ™”๋ฉด

  • ๋กœ๋“œ๋œ csv ํŒŒ์ผ์˜ ๊ตฌ์กฐ

    PartitionKey|RowKey|Timestamp|Date|Level|Logger|Message ---|---|---|---|---|---|---| BECA21F0-8B5E-4877-A18A-FD2A4B04322D|4DC0C4A6-893C-4246-AF80-B990EDD10C54|0.011269676|2016-09-10T04:29:50.828Z|stage5|CBComInsMemberGameInfoStages|9 6EDC9E0F-5E7E-4A04-B420-5F3091052CE7|819F7AC7-61E9-40C8-9904-B53B1008311E|0.011269676|2016-06-13T17:40:10.131Z|stage21|CBComInsMemberGameInfoStages|14 9F86454F-4E96-4CAD-A0AE-05DED005774F|766461D9-5FE6-4135-8FB3-15AACE24C4A8|0.011269676|2016-10-18T08:06:05.589Z|stage15|CBComInsMemberGameInfoStages|7 920E72B5-377C-4590-82D5-387ED86EF757|3AB215E0-AAE7-4E69-AF8B-825FADBAF756|0.011269676|2016-06-13T17:38:02.779Z|stage14|CBComInsMemberGameInfoStages|1 ์ผ๋ณ„, ์•ฝ 1๋งŒ๊ฑด ์ •๋„์˜ ๋ฐ์ดํ„ฐ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ๋“ค์–ด์˜จ ์Šคํ…Œ์ด์ง€ ๋ฐ ํด๋ฆฌ์–ด ์†Œ์š” ์‹œ๊ฐ„ ์ •๋ณด๋ฅผ CloudBread ๋กœ๊ทธ๋กœ ์ ์žฌ

  • CloudBread์˜ Loggers๊ฐ€ CBComInsMemberGameInfoStages ํ•ญ๋ชฉ๋“ค์„์— ๋Œ€ํ•ด message์˜ ์†Œ์š” ์‹œ๊ฐ„(๋ถ„)์„ ์ฒ˜๋ฆฌ

  • Hive ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด HDInsigt Cluster Manager ์ˆ˜ํ–‰

  • HDInsigt Cluster Manager

  • Hive ์ฟผ๋ฆฌ ์ˆ˜ํ–‰์„ ์ค€๋น„

  • Hive ์ฟผ๋ฆฌ ์ˆ˜ํ–‰

  • csvํŒŒ์ผ๋“ค์„ Hive์—์„œ External Table๋กœ load ์ž‘์—… ์ˆ˜ํ–‰

    set hive.execution.engine=tez;
    DROP TABLE cloudbreadlog;
    CREATE EXTERNAL TABLE cloudbreadlog (
        PartitionKey string, 
        RowKey string, 
        `Timestamp` string, 
        `Date` string, 
        Level string, 
        Logger string, 
        Message string
    )
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
    STORED AS TEXTFILE LOCATION 'wasbs:///example/data/';
    SELECT 
        * 
    FROM 
        cloudbreadlog 
    WHERE 
        INPUT__FILE__NAME LIKE '%.csv' 
    --	where Logger like 'CBComInsMemberGameInfoStages'
    --	AND INPUT__FILE__NAME LIKE '%.csv' 
    --order by level asc;
    

    Hive ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰

  • Hive์˜ External Table๋กœ ๋กœ๋“œ ๋˜์—ˆ๋Š”์ง€ count ์ฒดํฌ

    SELECT count(*) FROM cloudbreadlog;
    
  • ๋น ๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด Internal Table ORC(Optimized Row Columnar) ํ…Œ์ด๋ธ”๋กœ ๋กœ๋“œ

    set hive.execution.engine=tez;
    CREATE TABLE IF NOT EXISTS CloudBreadStageTime(
        PartitionKey string, 
        RowKey string, 
        `Timestamp` string, 
        `Date` string, 
        Level string, 
        Logger string, 
        Message string
    )
    STORED AS ORC;
    INSERT OVERWRITE TABLE CloudBreadStageTime
    SELECT 
        PartitionKey,
        RowKey, 
        `Timestamp`, 
        `Date`, 
        Level, 
        Logger, 
        Message
    FROM 
        cloudbreadlog;
    
  • ORC ํ…Œ์ด๋ธ”์—์„œ ์ตœ์ข… ์กฐํšŒ ์ฟผ๋ฆฌ ์ˆ˜ํ–‰

    select 
        level, 
        avg(cast(Message as int)) as stage_play_avg_min, 
        sum(cast(Message as int)) as stage_play_sum_min 
    from CloudBreadStageTime
    where Logger = 'CBComInsMemberGameInfoStages'
    group by level
    order by level asc;
    
  • ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋กœ stage๋ณ„๋กœ ์ˆ˜ํ–‰๋œ ํ‰๊ท  ์‹œ๊ฐ„๊ณผ ์ดํ•ฉ ์‹œ๊ฐ„์„ ์กฐํšŒ ๊ฐ€๋Šฅ ์ด๋ ‡๊ฒŒ Hive ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Œ

    level stage_play_avg_min stage_play_sum_min
    stage0 7.032447466 22757
    stage1 6.923216995 22812
    stage10 6.990762125 24216
    stage11 6.962710861 23527
    stage12 6.99791294 23471
    stage13 7.04329525 23426
    stage14 7.060240964 24026
    stage15 7.005102041 23341
    stage16 6.991793313 23003
    stage17 6.954984894 23021
    stage18 7.089904421 23737
    stage19 7.13037037 24065
    stage2 7.110673135 23451
    ...
  • ์ด Hadoop ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ Power BI๋ฅผ ์ด์šฉํ•ด ์†์‰ฌ์šด ์‹œ๊ฐํ™” ๋ฐ Web์— ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅ(Power BI ๊ด€๋ จ ๊ตฌ์„ฑ์€ 26๋ฒˆ ํ•ญ๋ชฉ ์ฐธ์กฐ)

  • Power BI ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”

์ด ์™ธ์—๋„ ๋‹ค์–‘ํ•œ CloudBread Hadoop ๋ถ„์„ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋„์ถœ ๊ฐ€๋Šฅ

  • ์ฃผ์š” ์•„์ดํ…œ๋“ค์˜ ์‚ฌ์šฉ๋Ÿ‰ ๋ณ€ํ™” ์ถ”์ด(CBAddUseMemberItemController API์ฐธ์กฐ)
  • ์‚ฌ์šฉ์ž์˜ ๊ฒฝํ—˜์น˜ ๋˜๋Š” Rank๋ฅผ ์œ„ํ•œ Point ์ •๋ณด ์ถ”์ (CBComUdtMemberGameInfoesController API ์ฐธ์กฐ)
  • ํ˜„์žฌ ๊ฒŒ์ž„ ๋‚ด์—์„œ ์‹ค์ œ ๊ตฌ๋งค๋˜๋Š” ์ฃผ์š” ์•„์ดํ…œ์˜ ์ˆ˜๋Ÿ‰(CBAddMemberItemPurchaseController API ์ฐธ์กฐ)

๋“ฑ์˜ ๋‹ค์–‘ํ•œ log๋ฅผ ํ™œ์šฉํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ CloudBread์˜ ์ €์žฅ์†Œ์™€ Hadoop - Big data ๋ถ„์„ ๊ฐ€๋Šฅ

###14. Elastic DB โ€“ sharded parallel processing ๊ฒŒ์ž„ ๋ฐ์ดํ„ฐ์˜ ์ฆ๊ฐ€์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜ํ‰์ ์œผ๋กœ ๋ถ„์‚ฐ ๊ฐ€๋Šฅํ•˜๋„๋ก sharding์„ ๊ตฌํ˜„
(Microsoft ๊ฐœ๋ฐœ ์ค‘์ด๋ผ ๊ฐœ๋ฐœ ๋ณด๋ฅ˜, Elastic Scale for Azure SQL Database)
CloudBread์˜ Admin-Web์€ node.js ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์—, node.js์—์„œ Elastic DB์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ NPM package ๋“ฑ์ด ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•จ
Elastic DB
์ฐธ๊ณ ๋งํฌ : Get started with Elastic Database tools

###15. NoSQL sharded Table storage ๋กœ๊ทธ๊ฐ€ ์ ์žฌ๋˜๋Š” NoSQL ํ…Œ์ด๋ธ” ์ €์žฅ์†Œ์— ๋Œ€ํ•ด ๋ณ‘๋ ฌ, ์ˆ˜ํ‰์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ ์žฌ/์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„
PaaS๋กœ ์ œ๊ณต๋˜๋Š” NoSQL Key/Value ์ €์žฅ์†Œ์ธ Table Storage๋ฅผ ํ™œ์šฉํ•ด ๋ณ‘๋ ฌ ๋ถ„์‚ฐ ์ ์žฌ ์ˆ˜ํ–‰

NoSQL ์ €์žฅ์†Œ Table Storage

CloudBread๋Š” ๋ฐ์ดํ„ฐ์˜ ์ˆ˜ํ‰์  ๋ถ„์‚ฐ์„ ์œ„ํ•ด Logicalํ•œ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์ด๋‚˜ ๋‚ด๋ถ€์ ์œผ๋กœ PartitionKey๋ฅผ ์กฐ์ ˆํ•ด ํ•ด๋‹น Entity๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋‹ค๋ฅธ ํ•˜๋“œ์›จ์–ด์˜ Storage์— ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์ฒ˜๋ฆฌ

###16. redis cluster service ๊ฒŒ์ž„ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด In-Memory ๊ธฐ๋ฐ˜ Key/Value NoSQL ์ €์žฅ์†Œ์ธ redis ์บ์‹œ ์„œ๋น„์Šค์˜ ์•ˆ์ •์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ์œ„ํ•œ ํด๋Ÿฌ์Šคํ„ฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ถ”๊ฐ€
CloudBread๋Š” redis cache๋ฅผ Ranking ์„œ๋น„์Šค์™€ ๋กœ๊ทธ ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉ

CloudBread - CBRedis ์ฒ˜๋ฆฌ์—์„œ redis ์ฒ˜๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง.

public static bool SetSortedSetRank(string sid, double point)
{
    ConnectionMultiplexer connection = ConnectionMultiplexer.Connect(redisConnectionStringRank);

    try
    {
        IDatabase cache = connection.GetDatabase(1);
        cache.SortedSetAdd(globalVal.CloudBreadRankSortedSet, sid, point);
    }
    catch (Exception)
    {
        throw;
    }
    return true;
}

Redis ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์ด์šฉํ•ด API front-end์—์„œ ์ฒ˜๋ฆฌ๊ฐ€ ์ง„ํ–‰๋˜๊ณ , CBRankController ์—์„œ ๋žญํ‚น(๋ฆฌ๋”๋ณด๋“œ) API์— ๋Œ€ํ•ด ์‘๋‹ต ์ฒ˜๋ฆฌ ์ˆ˜ํ–‰
CloudBread์—์„œ ์ด๋Ÿฐ redis ์ฒ˜๋ฆฌ์˜ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด Clustering ๊ธฐ๋Šฅ์„ ๊ธฐ๋ณธ ์ ์šฉํ–ˆ์œผ๋ฉฐ, ๊ธฐ๋ณธ Cluster์˜ redis๋กœ CloudBread์˜ config ํŒŒ์ผ์— ๊ตฌ์„ฑ ํ›„ ์ ‘๊ทผํ•˜๋ฉด ์ถ”๊ฐ€ ์ž‘์—… ์—†์ด ์œ„์˜ API๋“ค์„ ๋ชจ๋‘ ํ™œ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ , ์ตœ๋Œ€ 10๊ฐœ์˜ Redis shard๋ฅผ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ

Redis

###17. NoSQL Table Storageโ€“to- Hadoop NoSQL์— ์ ์žฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ Big data ๋ถ„์„์„ ์œ„ํ•ด Hadoop์œผ๋กœ ์ ์žฌํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„
(๊ฒŒ์ž„ ๋ฐ์ดํ„ฐ์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง.)
13๋ฒˆ ๋กœ๊ทธ๋ถ„์„ - Big data / Hadoop ์—์„œ Table ์ €์žฅ์†Œ์˜ ๋กœ๊ทธ ๋ถ„์„์„ Hadoop์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณผ์ •์„ ์ด๋ฏธ ์ง„ํ–‰

###18. Stream Analytics API ์‹ค์‹œ๊ฐ„ Machine Learning ๋ถ„์„ ๊ธฐ๋ฒ•์„ ์œ„ํ•ด API๋ฅผ ๊ตฌํ˜„ / Machine Learning API์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ ๊ตฌ์„ฑ (CloudBread ์—์„œ Stream Analytics ๋ฅผ ํ†ตํ•˜์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ๋น„๋™๊ธฐ๋กœ Machine Learning API๋ฅผ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌ์„ฑ)

์ตœ์ดˆ Machine Learning์„ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์ด๋“œ ๋˜๋Š” ๋ฐฉ์•ˆ์œผ๋กœ, ๊ธฐ์กด R์—์„œ ์ œ๊ณตํ•˜๋Š” ์—ฌ๋Ÿฌ Machine Learning ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ํ™œ์šฉํ•ด ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ์•ˆ์— ๋Œ€ํ•ด CloudBread ontributor ํŒ€๋‚ด๋ถ€์—์„œ ํ˜‘์˜ ์ง„ํ–‰.
์ตœ์„ ์˜ real-time Machine Learning ์˜ˆ์ธก ๋ถ„์„ ๋ฐฉ์•ˆ์„ ํ˜‘์˜ ์ค‘์— Azure Machine Learning์œผ๋กœ ์˜ˆ์ธก ๋ถ„์„ ํ”Œ๋žซํผ ์„ ํƒ

์˜ˆ์ธก ๋ชจ๋ธ(Predictive Model)์„ ํด๋ผ์šฐ๋“œ PaaS ๊ธฐ๋ฐ˜์œผ๋กœ ๋…ธ์ถœ, ์†์‰ฝ๊ฒŒ API ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐฉ์•ˆ์„ ์ œ๊ณต.

CloudBread์˜ Front-end App Service์—์„œ ์ฆ‰๊ฐ์ ์œผ๋กœ Machine Learning์œผ๋กœ์˜ Predict API ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๊ณ , Stream Analytics๋Š” ์‹ค์‹œ๊ฐ„ ๋ผ์ด๋ธŒ ์ŠคํŠธํŒ€ ๋ฐ์ดํ„ฐ๋‚ด์˜ Fraud Detection ๋ถ„์„์—์„œ๋งŒ ํ™œ์šฉ.
Stream Analytics API ๋ฐ ๋ถ„์„ ์ ์šฉ ๋ถ€๋ถ„์€ ์•„๋ž˜ Fraud Detection ๋ถ„์„ ๊ธฐ๋Šฅ ์†Œ๊ฐœ์—์„œ ํ•จ๊ป˜ ์ˆ˜ํ–‰

###19. Data Factory Hadoop ์—์„œ data pre-processing ๋ฐ automated data pipelining
์„ ์œ„ํ•œ data factory ์„œ๋น„์Šค ๊ตฌ์ถ•(๊ฒŒ์ž„ ๋ฐ์ดํ„ฐ์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋ฉฐ, ํ•„์š”์„ฑ์ด ๋‚ฎ์Œ)
big data ๋ถ„์„์—์„œ ETL ๋„๊ตฌ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, CloudBread์˜ ๊ฒฝ์šฐ log ๋ถ„์„์— ํ•„์š”ํ•œ Hadoop์ธ HDInsight๋ฅผ Data Factory ๋‚ด์—์„œ ์ž๋™์œผ๋กœ provision/batch์ˆ˜ํ–‰/๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ETL์— ์˜ฌ๋ ค ์ˆ˜ํ–‰ ๊ณผ์ •์„ ํ™œ์šฉ ์˜ˆ์ •.

###20. Machine Learning algorithm Machine Learning์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•ด ์˜ˆ์ธก ๋ถ„์„ ์„œ๋น„์Šค๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•™์Šต์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ๋“ฌ ๋ฐ Machine Learning workflow ๋ฅผ ๊ตฌํ˜„

CloudBread์˜ ๊ณ ๊ฐ ์ดํƒˆ ์˜ˆ์ธก(Game user churn prediction) real-time prediction & Batch prediction

CloudBread Game User Chrun

CloudBread์˜ ๊ฒŒ์ž„๋‚ด ์•„์ดํ…œ ์ถ”์ฒœ(In-game item suggestion) real-time prediction & Batch prediction

์œ„์˜ ๋ชจ๋ธ์€ ๋ชจ๋‘ CloudBread ํŒ€์ด ๊ณต๊ฐœํ•œ CloudBread Machine Learning์˜ ์˜ˆ์ธก ๋ถ„์„ ๋ชจ๋ธ

**์˜ˆ์ธก ๋ถ„์„ ๋ชฉํ‘œ ์ •์˜ : **
์œ„์˜ ๊ณต๊ฐœํ•œ ๋ถ„์„๋ชจ๋ธ์„ ํ™œ์šฉํ•ด ์˜ˆ์ธก๋ชจ๋ธ(Predict model)์„ ๊ตฌ์ถ•ํ•˜๊ณ  CloudBread์˜ API๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ ์˜ˆ์ธก์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ.

  • CloudBread Machine Learning ๋ชจ๋ธ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜, ์œ„์˜ gallery์—์„œ ๋ณต์ œ

  • CloudBread Game User Chrun

  • ๋ชจ๋ธ์„ ์‹คํ–‰ํ•˜๊ณ , ์ˆ˜ํ–‰๋œ ์˜ˆ์ธก ๊ฒฐ๊ณผ ํ™•์ธ

  • CloudBread Game User Chrun

  • Predictive model๋กœ ์ƒ์„ฑ ํ›„ API Web Service๋กœ ๋ฐฐํฌ

  • CloudBread Game User Chrun

  • ์ƒ์„ฑ๋œ Web service์˜ API Key๋ฅผ ์ด์šฉํ•ด CloudBread์—์„œ real-time predict ์ˆ˜ํ–‰

    public class UserChurnController : ApiController  
    {
        // POST api/UserChurn
        public HttpResponseMessage POST(CBChurn p)
        {
            // Machine Learning ๋ถ„์„ ์š”์ฒญ
            InvokeRequestResponseService(p).Wait();
            ...
        }
    
        // Machine Learning Web Service ํ˜ธ์ถœ
        static async Task InvokeRequestResponseService(CBChurn p)
        {
            ...
            const string apiKey = "APIํ‚ค-์ˆ˜์ •"; // Replace this with the API key for the web service
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
            client.BaseAddress = new Uri("Machine-Learning-Web-Service-URL-์ˆ˜์ •");
            HttpResponseMessage response = await client.PostAsJsonAsync("", scoreRequest).ConfigureAwait(false);
            if (response.IsSuccessStatusCode)
            {
                string result = await response.Content.ReadAsStringAsync();
                Debug.WriteLine("Result: {0}", result);
                p.ChurnYN = result;
            }
            ...
        }
    }
    
  • CloudBread Game User Chrun

  • Machine Learning API Controller๋ฅผ publish ํ•˜๊ณ , Postman์—์„œ ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰ํ•ด real-time prediction ์ˆ˜ํ–‰

  • Batch ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ Machine Learning Batch execution์ด ์ œ๊ณตํ•˜๋Š” ์ฝ”๋“œ ์ด์šฉ์ด ๊ฐ€๋Šฅ.

  • CloudBread Game User Chrun

  • ์ถ”๊ฐ€์ ์œผ๋กœ, Functions๋ฅผ ์ด์šฉํ•ด server-less๋กœ batch ํ˜ธ์ถœ ์—ญ์‹œ ๊ฐ€๋Šฅ

  • CloudBread Game User Chrun

  • Excel์„ ์ด์šฉํ•ด Batch ๋ถ„์„๋„ ๊ฐ€๋Šฅ

  • In-game์—์„œ ๊ฒŒ์ด๋จธ์˜ ํŒจํ„ด๊ณผ ํŠน์„ฑ์„ ์ทจํ•ฉํ•ด ํ•™์Šต ์‹œํ‚จ ํ›„ ์ ์ ˆํ•œ ์œ ๋ฃŒ ์•„์ดํ…œ์„ ์ถ”์ฒœํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค ์—ญ์‹œ ๊ฒŒ์ž„ ์„œ๋น„์Šค์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ๋งค์ถœ๊ณผ ์ง๊ฒฐ๋˜๋Š” ์˜ˆ์ธก ๋ถ„์„์ด๋ฉฐ, ๊ด€๋ จํ•ด CloudBread๋Š” predict model๋กœ in-game item suggestion์„ ์ œ๊ณต

Postman collection ๋ฐ CloudBread-Machine-Learning์†Œ์Šค์ฝ”๋“œ ์ฐธ์กฐ

###21. Big data - Business Intelligence ํ”Œ๋žซํผ Hadoop์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ visualize ์‹œํ‚ค๊ธฐ ์œ„ํ•œ Business Intelligence
์ƒ์„ธํ•œ Business Intelligence ๋‚ด์šฉ์€ 26. Real-time Business Intelligence ํ”Œ๋žซํผ์—์„œ ์ œ๊ณต

###22. Big data - Business Intelligence ์›น์‚ฌ์ดํŠธ Hadoop ๋ฐ์ดํ„ฐ ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ Web์œผ๋กœ display ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์›น์‚ฌ์ดํŠธ ๊ตฌ์ถ•
์ƒ์„ธํ•œ Business Intelligence ๋‚ด์šฉ์€ 26. Real-time Business Intelligence ํ”Œ๋žซํผ์—์„œ ์ œ๊ณต

###23. Stream analytics pre-processing API ์‹ค์‹œ๊ฐ„ ๋ถ„์„์„ ์œ„ํ•ด F/E๋กœ ์ ‘๊ทผํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ stream ๋ถ„์„์ด ๊ฐ€๋Šฅํ•œ ํ”Œ๋žซํผ์— ์˜ฌ๋ ค Stream Analytics๋กœ ์‹ค์‹œ๊ฐ„ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด ๋กœ๋“œํ•˜๋Š” API๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , aggregation์„ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ ๋ถ„์„์ด ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋กœ pre-processing ์ˆ˜ํ–‰
์ƒ์„ธํ•œ Stream Analytics ๊ด€๋ จ ๋‚ด์šฉ์€ ์•„๋ž˜ ###24. Stream analytics real-time analytics API ์ฐธ์กฐ

###24. Stream analytics real-time analytics API Stream Analytics์—์„œ Fraud Detection์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌ์„ฑ

Fraud Detection ๋ถ„์„์„ ์œ„ํ•œ Stream analytics ๋ชฉํ‘œ :
Stream Analytics์—์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ purchase API์— 5์ดˆ์— 5ํšŒ ์ด์ƒ ์ ‘์†ํ•˜๋Š” ์–ด๋ทฐ์ง• ์‚ฌ์šฉ์ž๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฒ€์ถœ ์ˆ˜ํ–‰

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์š”์ฒญํ•˜๋Š” Normal-Device๋ฅผ simulateํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜ํ–‰
  • 5์ดˆ์— 30์—ฌํšŒ ์ด์ƒ ์š”์ฒญํ•˜๋Š” Fraud-Device๋ฅผ simulate ํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜ํ–‰
  • Stream ๋ถ„์„์€ SQL ์ฟผ๋ฆฌ์™€ ์œ ์‚ฌํ•œ ํŒจํ„ด์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉฐ, CloudBread์—์„œ ๋‹ค์–‘ํ•œ Absing์„ ๊ฒ€์ถœ ๊ฐ€๋Šฅ
while (i <= 50)
{
    int level = rand.Next(0, 100);
    int points = rand.Next(0, 50);
    int winnerYN = 0;

    var telemetryDataPoint = new
    {
        deviceId = "cb2-fraud-device",
        DateTime.Now,
        level,
        points,
        winnerYN
        //prediction
    };
    var messageString = JsonConvert.SerializeObject(telemetryDataPoint);
    var message = new Message(Encoding.ASCII.GetBytes(messageString));

    await deviceClient.SendEventAsync(message);
    Console.WriteLine("{0} > Sending message: {1}", DateTime.Now, messageString);

    Task.Delay(1).Wait();	// delay ์—†์ด ๋ฐ”๋กœ ๋‹ค์Œ loop ์ˆ˜ํ–‰ํ•ด fraud device ์‹œ๋ฎฌ๋ ˆ์ด์…˜
    i++;
}

EventHub ์ชฝ์œผ๋กœ ๋‘๊ฐœ์˜ ๋””๋ฐ”์ด์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ push ํ•˜๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ˆ˜ํ–‰

Stream Anlytics์—์„œ input์„ ํ†ตํ•ด stream data๋ฅผ ๊ฐ€์ ธ์™€ ์ฒ˜๋ฆฌ
์•„๋ž˜์˜ Stream ์ฟผ๋ฆฌ๋Š” 5์ดˆ ์ด๋‚ด์— 5ํšŒ ์ด์ƒ ์š”์ฒญ์ด ๋“ค์–ด์˜จ ๊ฒฝ์šฐ abusing์œผ๋กœ ํŒ๋‹จํ•ด, ์ด ๋ฐ์ดํ„ฐ๋ฅผ fraudoutput blob ์ €์žฅ์†Œ๋กœ ์ถœ๋ ฅ ์ˆ˜ํ–‰.

Stream Analytics ๋ถ„์„

SELECT
    *
INTO
    output
FROM
    input TIMESTAMP BY Now
SELECT
    deviceid, System.TimeStamp AS Now,
    COUNT(*) AS [Count]
INTO
    fraudoutput
FROM
    input TIMESTAMP BY Now
GROUP BY
    deviceid, 
    TumblingWindow(second, 5)
HAVING
    [Count] >= 5

Stream Analytics๋ฅผ ์‹คํ–‰ํ•˜๊ณ , fraud device๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„, fraudoutput์„ ํ™•์ธ

ํ•„์š”ํ•  ๊ฒฝ์šฐ ์ถ”๊ฐ€์ ์ธ event๋ฅผ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ web hook์„ ๋ณด๋‚ด slack ๋“ฑ์œผ๋กœ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ์ฒ˜๋ฆฌ๋„ CloudBread์— ์ ์šฉ ์˜ˆ์ •

###25. Real-time Machine Learning workflow + API Real-time ๋ถ„์„์„ ์œ„ํ•ด Stream Analytics์™€ Machine Learning ์„ ์—ฐ๊ณ„ํ•˜๊ธฐ ์œ„ํ•ด API ์†Œ๋น„๋ฅผ ์œ„ํ•œ function ๊ฐœ๋ฐœ
(CloudBread ์—์„œ Stream Analytics ๋ฅผ ํ†ตํ•˜์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ๋น„๋™๊ธฐ๋กœ Machine Learning API๋ฅผ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌ์„ฑ)

###26. Real-time Business Intelligence ํ”Œ๋žซํผ ๋ฐ์ดํ„ฐ๋ฅผ visualize ์‹œํ‚ค๊ธฐ ์œ„ํ•œ Business Intelligence ํ”Œ๋žซํผ ์ œ๊ณต
๊ฒŒ์ž„๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ ํ•„์š”ํ•œ property๋‚˜ entity๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, ๋‹จ์ˆœ rank ์„œ๋น„์Šค๊ฐ€ ํ•„์š”ํ•  ๊ฒฝ์šฐ์—๋Š” item ๋กœ์ง ๋“ฑ์„ ์„œ๋ฒ„์—์„œ ๋”ฐ๋กœ ์‚ฌ์šฉํ•  ์ด์œ ๋‚˜ ํ•„์š”๊ฐ€ ์—†์Œ.

CloudBread๋ฅผ ์ด์šฉํ•  ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, Business Intelligence๋ฅผ ์œ„ํ•œ ์‹œ๊ฐํ™” ์—ญ์‹œ, ๊ฐœ๋ณ„ property๊ฐ€ ์›Œ๋‚™์— ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์ธ ๋นŒ๋”ฉ ๋ธ”๋ก์„ CloudBread์—์„œ ์ œ์‹œํ•˜๊ณ  CloudBread๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒŒ์ž„์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋ฅผ ์›ํ•˜๋Š” ์‹œ๊ฐํ™”๋กœ ๋ฐฐํฌ ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ์ˆ˜ํ–‰

์ด๋ฅผ ์œ„ํ•ด Power BI๋ฅผ ์ด์šฉํ•ด ์‹œ๊ฐํ™” ๋ชจ๋ธ์„ ๋งŒ๋“ค๊ณ , ์ด๋ฅผ ์›น์—์„œ ๋ถ„์„ํ•˜๊ฑฐ๋‚˜ CloudBread ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์—์„œ iframe ๋“ฑ์œผ๋กœ embedํ•ด ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ๋ชฉํ‘œ๋กœ ๊ฐœ๋ฐœํ•จ.

  • Power BI Desktop์„ ์ด์šฉํ•œ ์‹œ๊ฐํ™” ๋””์ž์ธ ์ˆ˜ํ–‰

  • Power BI Data Visualization
    ๊ฐ„๋‹จํžˆ Hadoop์—์„œ Hive๋กœ ์ƒ์„ ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋กœ๋“œํ•˜๊ณ , ์‹œ๊ฐํ™” ๊ณผ์ •์„ ํ†ตํ•ด Bar-chart๋กœ ๊ตฌํ˜„

  • Power BI๋ฅผ Power BI ์„œ๋น„์Šค๋กœ ๋ฐฐํฌ

  • Power BI Data Visualization
    Power BI์— ๊ฒŒ์‹œ๋œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ํŒ€์—์„œ ์†์‰ฌ์šด Report ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ํ˜‘์—… ๊ฐ€๋Šฅ

  • ์ƒ์„ฑํ•œ Report๋ฅผ CloudBread์˜ Admin-Web ๋“ฑ์œผ๋กœ ๊ฒŒ์‹œํ•˜๊ธฐ ์œ„ํ•ด embed ์ฝ”๋“œ ์ƒ์„ฑ

  • Power BI Data Visualization
    ์ผ๋ฐ˜ ์›นํŽ˜์ด์ง€์— ๊ฒŒ์‹œํ•˜๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, Link ๋ฐฉ์‹๊ณผ Embed ๋ฐฉ์‹ ๋ชจ๋‘ ์ œ๊ณต

  • ์ƒ์„ฑ๋œ ๋ฆฌํฌํŠธ ๋ฐ์ดํ„ฐ๋ฅผ Admin-Web ๋˜๋Š” ํŒ€์‚ฌ์ดํŠธ ๋“ฑ์— ๊ฒŒ์‹œ

  • Power BI Data Visualization
    CloudBread-Admin-Web ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ ๋“ฑ์— Interactive Report๋กœ ์ฒจ๋ถ€๊ฐ€ ๊ฐ€๋Šฅ

###27. Real-time Business Intelligence ์›น์‚ฌ์ดํŠธ Real Time ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ Web์œผ๋กœ display ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์›น์‚ฌ์ดํŠธ ๊ตฌ์ถ• ๊ด€๋ จ ๋‚ด์šฉ์€ 26. Real-time Business Intelligence ํ”Œ๋žซํผ ์ฐธ์กฐ

About

CloudBread Project documentation repository

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors