ããã«ã¡ã¯ãhabravchaneïŒ ãã®èšäºã§ã¯ãNode.JSã§ã®ã¢ã¯ã¿ãŒã®å®è£
ã§ããã³ã¡ãã£ãã¬ãŒã ã¯ãŒã¯ã玹ä»ããŸãã ã¢ã¯ã¿ãŒã䜿çšãããšãã³ãŒããå€æŽããã«Node.JSã¢ããªã±ãŒã·ã§ã³ã®åã
ã®ã¢ãžã¥ãŒã«ãã¹ã±ãŒãªã³ã°ã§ããŸãã
俳åªã«ã€ããŠ
çŸåšã俳åªã¢ãã«ã¯éåžžã«äººæ°ããããŸããã誰ããç¥ã£ãŠããããã§ã¯ãããŸããã ãŠã£ãããã£ã¢ã®èšäºã¯ããæããããã®ã®ã俳åªã¯éåžžã«ã·ã³ãã«ã§ãã
俳åªãšã¯äœã§ããïŒ ããã¯æ¬¡ã®ããšãã§ãããããªãã®ã§ãïŒ
- ã¡ãã»ãŒãžãåãåã
- ã¡ãã»ãŒãžãéã
- å圹ãäœæãã

俳åªãšäœããããå¯äžã®æ¹æ³ã¯ã圌ã«ã¡ãã»ãŒãžãéãããšã§ãã ã¢ã¯ã¿ãŒã®å
éšç¶æ
ã¯ãå€éšã®äžçããå®å
šã«éé¢ãããŠããŸãã ããã«ãããã¢ã¯ã¿ãŒã¯ã¢ããªã±ãŒã·ã§ã³ã¹ã±ãŒãªã³ã°ã®æ®éçãªåäœã§ãã ãŸããåã¢ã¯ã¿ãçæããæ©èœã«ãããæ確ãªè²¬ä»»åæ
ã䌎ãã¢ãžã¥ãŒã«ã®ç解å¯èœãªæ§é ãäœæã§ããŸãã
ç§ã¯ãããããæœè±¡çã«èãããããšãç解ããŠããŸãã 以äžã§ã¯ã俳åªãã³ã¡ãã£ãŒãšã®ä»äºãã©ã®ããã«è¡ããããã®å
·äœçãªçããäŸãèŠãŠãããŸãã ããããæåã«...
ãªãã§ãããªããš
...æåã®åæ©ã
Node.JSïŒãã®äžã§ãè¬èãªäººïŒã§ããã°ã©ã ãäœæãã人ã¯èª°ã§ããNode.JSãã·ã³ã°ã«ã¹ã¬ããã§ããããšãããç¥ã£ãŠããŸãã äžæ¹ã§ãããã¯éåžžã«æãã§åçŸãã«ãããã°ã®ã¯ã©ã¹ïŒãã«ãã¹ã¬ãããã°ïŒããç§ãã¡ãæãã®ã§è¯ãã§ãã ç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãååãšããŠãã®ãããªãã°ã¯ååšã§ããŸãããããã«ãããã³ã¹ãã倧å¹
ã«åæžãããéçºãé«éåãããŸãã
äžæ¹ãããã¯Node.JSã®é©çšæ§ãå¶éããŸãã æ¯èŒçè² è·ã®å°ãªããããã¯ãŒã¯éçŽåã¢ããªã±ãŒã·ã§ã³ã«ã¯æé©ã§ãããCPUéçŽåã¢ããªã±ãŒã·ã§ã³ã«ã¯ããŸãé©ããŠããŸããããªããªããéçŽåã³ã³ãã¥ãŒãã£ã³ã°ã¯è²Žéãªåäžã¹ã¬ããããããã¯ãããã¹ãŠãè¡ãè©°ãŸã£ãŠããŸãããã§ãã ãããããç¥ã£ãŠããŸãã
ãããã«ãããå®éã®ã¢ããªã±ãŒã·ã§ã³ã¯ãããã«ããäžå®éã®CPUãæ¶è²»ããããšãããã£ãŠããŸãïŒããžãã¹ããžãã¯ããŸã£ãããªãå Žåã§ããã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã§ãããã¯ãŒã¯ãã©ãã£ãã¯ãåŠçããå¿
èŠããããŸãïŒHTTPãããŒã¿ããŒã¹ãããã³ã«ãªã©ïŒã ãããŠãè² è·ãå¢å€§ãããšãé
ããæ©ãããå¯äžã®ã¹ã¬ãããã³ã¢é»åã®100ïŒ
ãæ¶è²»ããç¶æ³ã«ãªããŸãã ãããŠããã®å Žåã¯ã©ããªããŸããïŒ ã¡ãã»ãŒãžãåŠçããæéããªããã¿ã¹ã¯ã®ãã¥ãŒãèç©ãããå¿çæéãé·ããªãããã ïŒ -ã¡ã¢ãªäžè¶³ã
ãããŠããã§ããã§ã«ããã€ãã®CPUã³ã¢ã§ã¢ããªã±ãŒã·ã§ã³ãã¹ã±ãŒãªã³ã°ããå¿
èŠãããç¶æ³ã«ãªããŸãã ãããŠçæ³çã«ã¯ã1å°ã®ãã·ã³äžã®ã«ãŒãã«ã ãã«å¶éãããã¯ãããŸãããè€æ°ã®ãã·ã³ãå¿
èŠã«ãªãå ŽåããããŸãã åæã«ãã¢ããªã±ãŒã·ã§ã³ãã§ããéãæžãæããªãããã«ããŸãã åçŽãªæ§æå€æŽã«ãã£ãŠã¢ããªã±ãŒã·ã§ã³ãã¹ã±ãŒãªã³ã°ããããšäŸ¿å©ã§ãã ãããŠããã«è¯ã-è² è·ã«å¿ããŠãèªåçã«ã
ãããŠãããã§ä¿³åªã¯ç§ãã¡ã®å©ãã«ãªããŸãã
ã±ãŒã¹ã¹ã¿ãã£ïŒãã©ã€ã ãµãŒãã¹
ã³ã¡ãã£ãã©ã®ããã«æ©èœãããã瀺ãããã«ãç§ã¯å°ããªäŸãã¹ã±ããããŸãããçŽ æ°ãèŠã€ãããã€ã¯ããµãŒãã¹ã§ãã ãµãŒãã¹ãžã®ã¢ã¯ã»ã¹ã¯REST APIãä»ããŠè¡ãããŸãã
ãã¡ãããçŽ æ°ãèŠã€ããããšã¯CPUãéäžçã«äœ¿çšããã¿ã¹ã¯ã§ãã ãã®ãããªãµãŒãã¹ãå®éã«èšèšããå ŽåãNode.JSãéžæããåã«10åèããã¹ãã§ããã ãã ãããã®å Žåã1ã€ã®ã³ã¢ã§ã¯äžååãªå Žåã«ç¶æ³ãåçŸããããããããã«ãæå³çã«èšç®ã¿ã¹ã¯ãéžæããŸããã
ã ããã ãµãŒãã¹ã®æ¬è³ªããå§ããŸããã-çŽ æ°ãèŠã€ããã¢ã¯ã¿ãŒãå®è£
ããŸãã 圌ã®ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
class PrimeFinderActor { nextPrime(n) { if (n < 1) throw new Error('Illegal input'); const n0 = n + 1; if (this._isPrime(n0)) return n0; return this.nextPrime(n0); } _isPrime(x) { for (let i = 2; i < x; i++) { if (x % i === 0) return false; } return true; } }
nextPrime()
ã¡ãœããã¯ãæå®ãããïŒå¿
ãããçŽ æ°ã§ã¯ãªãïŒã«ç¶ãçŽ æ°ãèŠã€ããŸãã ãã®ã¡ãœããã¯ãNode.JS 8ã§æ£ç¢ºã«ãµããŒããããŠããæ«å°Ÿååž°ã䜿çšããŸãïŒäŸãå®è¡ããã«ã¯ããŸã async-awaitãããã®ã§ãå°ãªããšãããŒãžã§ã³8ã䜿çšããå¿
èŠããããŸãïŒã ãã®ã¡ãœããã¯ããã«ããŒã¡ãœãã_isPrime()
䜿çšããŸãããã®ã¡ãœããã¯ãç°¡åã«ããããã«çªå·ããã§ãã¯ããŸãã ããã¯ããã®ãããªãã§ãã¯ã«æé©ãªã¢ã«ãŽãªãºã ã§ã¯ãããŸãããããã®äŸã§ã¯åªããŠããŸãã
äžèšã®ã³ãŒãã§èŠããã®ã¯ãäžæ¹ã§ã¯æ®éã®ã¯ã©ã¹ã§ãã äžæ¹ãç§ãã¡ã«ãšã£ãŠãããã¯ããããã¢ã¯ã¿ãŒã®å®çŸ© ãã€ãŸãã¢ã¯ã¿ãŒã®æ¯ãèãã®èšè¿°ã§ãã ã¯ã©ã¹ã¯ãã¢ã¯ã¿ãŒãåä¿¡ã§ããã¡ãã»ãŒãžïŒåã¡ãœããã¯åããããã¯ãæã€ã¡ãã»ãŒãžãã³ãã©ãŒïŒããããã®ã¡ãã»ãŒãžãåãå
¥ããããšã§è¡ãããšïŒã¡ãœããã®å®è£
ïŒãããã³çµæãçæããã¡ãã»ãŒãžïŒæ»ãå€ïŒãèšè¿°ããŸãã
ããã«ãããã¯éåžžã®ã¯ã©ã¹ã§ãããããåäœãã¹ããäœæããŠããã®å®è£
ã®æ£ç¢ºæ§ãç°¡åã«ãã¹ãã§ããŸãã
åäœãã¹ãã¯æ¬¡ã®ããã«ãªããŸã describe('PrimeFinderActor', () => { it('should correctly find next prime', () => { const pf = new PrimeFinderActor(); expect(pf.nextPrime(1)).to.be.equal(2); expect(pf.nextPrime(2)).to.be.equal(3); expect(pf.nextPrime(3)).to.be.equal(5); expect(pf.nextPrime(30)).to.be.equal(31); }); it('should only accept positive numbers', () => { const pf = new PrimeFinderActor(); expect(() => pf.nextPrime(0)).to.throw(); expect(() => pf.nextPrime(-1)).to.throw(); }); });
ããã§ã¢ã¯ã¿ãŒãã¡ã€ã³ããŒãã©ã€ã ãã§ããŸããã

次ã®ã¹ãããã¯ãRESTãµãŒããŒã¢ã¯ã¿ãŒãå®è£
ããããšã§ãã å®çŸ©ã¯æ¬¡ã®ããã«ãªããŸãã
const restify = require('restify'); const restifyErrors = require('restify-errors'); const P = require('bluebird'); class RestServerActor { async initialize(selfActor) { this.log = selfActor.getLog(); this.primeFinder = await selfActor.createChild(PrimeFinderActor); return this._initializeServer(); } _initializeServer() { const server = restify.createServer({ name: 'prime-finder' });
ããã§äœãèµ·ãã£ãŠããŸããïŒ äž»ãªå¯äžã®ããšã¯ã initialize()
ã¡ãœãããããããšã§ãã ãã®ã¡ãœããã¯ã俳åªãåæåãããšãã«ã³ã¡ãã£ã«ãã£ãŠåŒã³åºãããŸãã ã¢ã¯ã¿ãŒã€ã³ã¹ã¿ã³ã¹ãæž¡ãããŸãã ããã¯ãŸãã«ã¡ãã»ãŒãžãéä¿¡ã§ãããã®ã§ãã ã€ã³ã¹ã¿ã³ã¹ã«ã¯ä»ã«ã䟿å©ãªã¡ãœãããããã€ããããŸãã getLog()
ã¯ã¢ã¯ã¿ãŒã®ãã¬ãŒãè¿ããŸãïŒããã¯äŸ¿å©ã§ãïŒ createChild()
ã¡ãœããã䜿çšããŠãåã¢ã¯ã¿ãŒãäœæããŸã-æåã«å®è£
ããPrimeFinderActor
ã§ãã createChild()
ã§ãã¢ã¯ã¿ãŒã®å®çŸ©ãæž¡ãã代ããã«ãåã¢ã¯ã¿ãŒãåæåããããšããã«è§£æ±ºãããããã¹ãåãåããäœæãããåã¢ã¯ã¿ãŒã®ã€ã³ã¹ã¿ã³ã¹ãæäŸããŸã ã
ãæ°ã¥ãã®ãšãããã¢ã¯ã¿ãŒã®åæåã¯éåææäœã§ãã initialize()
ã¡ãœãããéåæã§ãïŒpromiseãè¿ããŸãïŒã ãããã£ãŠã RestServerActor
ã¯ã initialize()
ã¡ãœããã«ãã£ãŠæå®ããããããã¹ã解決ããããšãïŒãŸããããããã¹ãæºããããããšæžããªãã§ãã ããïŒã«ã®ã¿åæåããããšèŠãªãããŸãã
ããŠãåPrimeFinderActor
ãäœæãããããåæåãããã®ãåŸ
ã£ãŠã primeFinder
ãã£ãŒã«ããžã®ã€ã³ã¹ã¿ã³ã¹ãªã³ã¯ãå²ãåœãŠãŸããã RESTãµãŒããŒãæ§æããããã«ãå°ãæ®ã£ãŠããŸãã Restify
ã©ã€ãã©ãªã䜿çšããŠã _initializeServer()
ã¡ãœããïŒéåæïŒã§ãããRestify
ãŸãã
GET /next-prime/:n
ã¡ãœããçšã«åäžã®ãªã¯ãšã¹ããã³ãã©ïŒããã³ãã«ãïŒãäœæããŸãããã®ã¡ãœããã¯ãæå®ãããæ°ã®åŸã®æ¬¡ã®æŽæ°ãèšç®ããåPrimeFinderActor
ã¢ã¯ã¿ãŒã«ã¡ãã»ãŒãžãéä¿¡ããŠå¿çãåãåããŸãã sendAndReceive()
ã¡ãœããã䜿çšããŠã¡ãã»ãŒãžãéä¿¡ããŸããæåã®ãã©ã¡ãŒã¿ãŒã¯ãããã¯åïŒã¡ãœããåã§nextPrime
ïŒã次ã®ãã©ã¡ãŒã¿ãŒã¯ã¡ãã»ãŒãžã§ãã ãã®å Žåãã¡ãã»ãŒãžã¯åãªãæ°åã§ãããæååãããŒã¿ãæã€ãªããžã§ã¯ããããã³é
åãååšããå ŽåããããŸãã sendAndReceive()
ã¡ãœããã¯éåæã§ãçµæãšãšãã«promiseãè¿ããŸãã
ã»ãŒå®äºã ããš1ã€ã ãæ®ããŠãããŸãããããã¹ãŠãèµ·åããããšã§ãã ãã®äŸã«ããã«æ°è¡è¿œå ããŸãã
const actors = require('comedy'); actors({ root: RestServerActor });
ããã§ãã¢ã¯ã¿ãŒã®ã·ã¹ãã ãäœæããŸãã ãã©ã¡ãŒã¿ãŒãšããŠãã«ãŒãïŒã»ãšãã©ã®èŠªïŒã¢ã¯ã¿ãŒã®å®çŸ©ã瀺ããŸãã RestServerActor
ãŸãã
次ã®éå±€ãå€æããŸãã

幞éã«ãããã®éå±€ã¯éåžžã«ç°¡åã§ãïŒ
ããŠãã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŠãã¹ãããŸããïŒ
$ nodejs prime-finder.js Mon Aug 07 2017 15:34:37 GMT+0300 (MSK) - info: Resulting actor configuration: {}
$ curl http://localhost:8080/next-prime/30; echo 31
ããŸãããïŒ å®éšããŠã¿ãŸãããïŒ
$ time curl http://localhost:8080/next-prime/30 31 real 0m0.015s user 0m0.004s sys 0m0.000s $ time curl http://localhost:8080/next-prime/3000000 3000017 real 0m0.045s user 0m0.008s sys 0m0.000s $ time curl http://localhost:8080/next-prime/300000000 300000007 real 0m2.395s user 0m0.004s sys 0m0.004s $ time curl http://localhost:8080/next-prime/3000000000 3000000019 real 5m11.817s user 0m0.016s sys 0m0.000s
éå§çªå·ãå¢ãããšããªã¯ãšã¹ãã®åŠçæéãé·ããªããŸãã ç¹ã«å°è±¡çãªã®ã¯ã3åãã30åãžã®ç§»è¡ã§ãã 䞊åã¯ãšãªãè©ŠããŠã¿ãŸãããã
$ curl http://localhost:8080/next-prime/3000000000 & [1] 32440 $ curl http://localhost:8080/next-prime/3000000000 & [2] 32442
äžéšã§ã¯ã1ã€ã®ã³ã¢ãå®å
šã«å æãããŠããŸãã
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 32401 weekens 20 0 955664 55588 20956 R 100,0 0,7 1:45.19 node
ãµãŒããŒãã°ã«ã¯æ¬¡ã®ããã«è¡šç€ºãããŸãïŒ
Mon Aug 07 2017 16:05:45 GMT+0300 (MSK) - info: InMemoryActor(5988659a897e307e91fbc2a5, RestServerActor): Handling next-prime request for number 3000000000
ã€ãŸããæåã®èŠæ±ãå®è¡ããã2çªç®ã®èŠæ±ã¯åŸ
æ©äžã§ãã
$ jobs [1]- curl http://localhost:8080/next-prime/3000000000 & [2]+ curl http://localhost:8080/next-prime/3000000000 &
ããã¯ãŸãã«èª¬æãããç¶æ³ã§ãã1ã€ã®ã³ã¢ãæ¬ èœããŠããŸãã ãã£ãšã³ã¢ãå¿
èŠã§ãïŒ
ã·ã§ãŒã¿ã€ã ïŒ
ã ãããèªæ
°è¡çºãããæéã§ãã 以éã®ãã¹ãŠã®ã¢ã¯ã·ã§ã³ã§ã¯ãã³ãŒãã®å€æŽã¯äžèŠã§ãã
ãŸãã PrimeFinderActor
ãåå¥ã®ãµãããã»ã¹ã«åé¢ããŸãããã ããèªäœã§ã¯ããã®ã¢ã¯ã·ã§ã³ã¯ã»ãšãã©åœ¹ã«ç«ããªãããç§ã¯åŸã
ã«çŽ¹ä»ãããã
ãããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã«æ¬¡ã®å
容ã®actors.json
ãã¡ã€ã«ãäœæããŸãã
{ "PrimeFinderActor": { "mode": "forked" } }
ãããŠäŸãåèµ·åããŸãã ã©ããã ããã»ã¹ã®ãªã¹ãã確èªããŸãã
$ ps ax | grep nodejs 12917 pts/19 Sl+ 0:00 nodejs prime-finder.js 12927 pts/19 Sl+ 0:00 /usr/bin/nodejs /home/weekens/workspace/comedy-examples/node_modules/comedy/lib/forked-actor-worker.js PrimeFinderActor $ pstree -a -p 12917 nodejs,12917 prime-finder.js âânodejs,12927 /home/weekens/workspace/comedy-examples/node_modules/comedy/lib/forked-actor-worker.js PrimeFinderActor â ââ{V8 WorkerThread},12928 â ââ{V8 WorkerThread},12929 â ââ{V8 WorkerThread},12930 â ââ{V8 WorkerThread},12931 â ââ{nodejs},12932 ââ{V8 WorkerThread},12918 ââ{V8 WorkerThread},12919 ââ{V8 WorkerThread},12920 ââ{V8 WorkerThread},12921 ââ{nodejs},12922 ââ{nodejs},12923 ââ{nodejs},12924 ââ{nodejs},12925 ââ{nodejs},12926
çŸåšã2ã€ã®ããã»ã¹ãããããšãããããŸãã 1ã€ã¯ãã¡ã€ã³ã®ãã¹ã¿ãŒãã¢ãããããã»ã¹ã§ãã 2çªç®ã¯ã "forked"
ã¢ãŒãã§åäœããããã PrimeFinderActor
ã¹ãã³ããåããã»ã¹ã§ãã ã³ãŒãã§äœãå€æŽããã«ã actors.json
ãã¡ã€ã«ã䜿çšããŠãããæ§æããŸããã
çµæã¯ãã®ãããªåçã§ãïŒ

ãã¹ããå床å®è¡ããŸãã
$ curl http://localhost:8080/next-prime/3000000000 & [1] 13240 $ curl http://localhost:8080/next-prime/3000000000 & [2] 13242
ãã°ã確èªããŸãã
Tue Aug 08 2017 08:54:41 GMT+0300 (MSK) - info: InMemoryActor(5989504694b4a23275ba5d29, RestServerActor): Handling next-prime request for number 3000000000 Tue Aug 08 2017 08:54:43 GMT+0300 (MSK) - info: InMemoryActor(5989504694b4a23275ba5d29, RestServerActor): Handling next-prime request for number 3000000000
è¯ããã¥ãŒã¹ïŒãã¹ãŠããŸã æ©èœããŸãã æªããã¥ãŒã¹ïŒã»ãšãã©ãã¹ãŠä»¥åãšåãããã«æ©èœããŸãã ã«ãŒãã«ã¯ãŸã 察åŠã§ããããªã¯ãšã¹ãã¯ãã¥ãŒã«å
¥ããããŸãã ã«ãŒãã«ã«åããã»ã¹ãããŒããããããã«ãªããŸããïŒPIDã«æ³šæããŠãã ããïŒïŒ
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 12927 weekens 20 0 907160 40892 20816 R 100,0 0,5 0:20.05 nodejs
ããã«ããã»ã¹ãå®è¡ããŸãããPrimeFinderActor
æ倧4ã€ã®ã€ã³ã¹ã¿ã³ã¹ã«ã¯ã©ã¹ã¿ãŒPrimeFinderActor
ããŸãã actors.json
å€æŽãactors.json
ã
{ "PrimeFinderActor": { "mode": "forked", "clusterSize": 4 } }
ãµãŒãã¹ãåèµ·åããŸãã äœãèŠããŸããïŒ
$ ps ax | grep nodejs 15943 pts/19 Sl+ 0:01 nodejs prime-finder.js 15953 pts/19 Sl+ 0:00 /usr/bin/nodejs /home/weekens/workspace/comedy-examples/node_modules/comedy/lib/forked-actor-worker.js PrimeFinderActor 15958 pts/19 Sl+ 0:00 /usr/bin/nodejs /home/weekens/workspace/comedy-examples/node_modules/comedy/lib/forked-actor-worker.js PrimeFinderActor 15963 pts/19 Sl+ 0:00 /usr/bin/nodejs /home/weekens/workspace/comedy-examples/node_modules/comedy/lib/forked-actor-worker.js PrimeFinderActor 15968 pts/19 Sl+ 0:00 /usr/bin/nodejs /home/weekens/workspace/comedy-examples/node_modules/comedy/lib/forked-actor-worker.js PrimeFinderActor
4ã€ã®é¢é£ããã»ã¹ããããŸããã ç°¡åãªèšå®å€æŽã§ãéå±€ãå€æŽããŸãããããã¯æ¬¡ã®ããã«ãªããŸãã

ã€ãŸããã³ã¡ãã£ã¯PrimeFinderActor
ã4ã€ã®ããŒã¹ã«ä¹ç®ãããããããåå¥ã®ããã»ã¹ã§èµ·åããããããã®ã¢ã¯ã¿ãŒãšèŠªRestServerActor
éã«ãã©ãŠã³ãããã³ã§åã¢ã¯ã¿ãŒãžã®ãªã¯ãšã¹ããåæ£ãããäžéã¢ã¯ã¿ãŒãRestServerActor
ãŸãã
ãã¹ããå®è¡ããŸãã
$ curl http://localhost:8080/next-prime/3000000000 & [1] 20076 $ curl http://localhost:8080/next-prime/3000000000 & [2] 20078
ãããŠã2ã€ã®ã«ãŒãã«ãå æãããŠããããšãããããŸãã
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 15953 weekens 20 0 909096 38336 20980 R 100,0 0,5 0:13.52 nodejs 15958 weekens 20 0 909004 38200 21044 R 100,0 0,5 0:12.75 nodejs
ã¢ããªã±ãŒã·ã§ã³ãã°ã«ã¯ãåæã«åŠçããã2ã€ã®ãªã¯ãšã¹ãããããŸãã
Tue Aug 08 2017 11:51:51 GMT+0300 (MSK) - info: InMemoryActor(5989590ef554453e4798e965, RestServerActor): Handling next-prime request for number 3000000000 Tue Aug 08 2017 11:51:52 GMT+0300 (MSK) - info: InMemoryActor(5989590ef554453e4798e965, RestServerActor): Handling next-prime request for number 3000000000 Tue Aug 08 2017 11:57:24 GMT+0300 (MSK) - info: InMemoryActor(5989590ef554453e4798e965, RestServerActor): Handled next-prime request for number 3000000000, result: 3000000019 Tue Aug 08 2017 11:57:24 GMT+0300 (MSK) - info: InMemoryActor(5989590ef554453e4798e965, RestServerActor): Handled next-prime request for number 3000000000, result: 3000000019
ã¹ã±ãŒãªã³ã°ã¯æ©èœããŸãïŒ
ããå€ãã®ã³ã¢ïŒ
ãµãŒãã¹ã¯ãçŽ æ°ãèŠã€ããããã®4ã€ã®ãªã¯ãšã¹ãã䞊è¡ããŠåŠçã§ããããã«ãªããŸããã æ®ãã®èŠæ±ã¯ãã¥ãŒã«å
¥ããããŸãã ç§ã®ãã·ã³ã«ã¯4ã€ã®ã³ã¢ãããããŸããã ããå€ãã®åæèŠæ±ãåŠçããå Žåã¯ãè¿é£ã®ãã·ã³ã«ã¹ã±ãŒã«ããå¿
èŠããããŸãã ãããŸãããïŒ
ãŸããå°ãã®çè«ã åã®äŸã§ã¯ã PrimeFinderActor
ãPrimeFinderActor
ã¢ãŒãã«èšå®ããŸããã åã¢ã¯ã¿ãŒã¯ã次ã®3ã€ã®ã¢ãŒãã®ããããã«ãªããŸãã
"in-memory"
ïŒããã©ã«ãïŒïŒã¢ã¯ã¿ãŒã¯ããããäœæããã³ãŒããšåãããã»ã¹ã§åäœããŸãã ãã®ãããªã¢ã¯ã¿ãŒã«ã¡ãã»ãŒãžãéä¿¡ãããšãã¡ãœãããåŒã³åºãããšã«ãªããŸãã "in-memory"
ãªã¢ã¯ã¿ãŒãšã®éä¿¡ã®ãªãŒããŒãããã¯ãŒãïŒãŸãã¯ãŒãã«è¿ãïŒã§ãã"forked"
ïŒã¢ã¯ã¿ãŒã¯ããããäœæããã³ãŒããšåããã·ã³äžã®å¥ã®ããã»ã¹ã§å®è¡ãããŸãã ã¢ã¯ã¿ãŒãšã®éä¿¡ã¯IPCïŒUnixã§ã¯Unixãã€ããWindowsã§ã¯ååä»ããã€ãïŒãä»ããŠè¡ãããŸãã"remote"
ïŒã¢ã¯ã¿ãŒã¯ããªã¢ãŒããã·ã³äžã®å¥ã®ããã»ã¹ã§èµ·åãããŸãã ã¢ã¯ã¿ãŒãšã®éä¿¡ã¯TCP / IPãä»ããŠè¡ãããŸãã
ãç解ã®ãšãããä»åºŠã¯PrimeFinderActor
ã"forked"
ã¢ãŒããã"remote"
ã«è»¢éããå¿
èŠããããŸãã ãã®ã¹ããŒã ãååŸãããïŒ

actors.json
ãã¡ã€ã«ãç·šéããŸãããã ãã®å Žåã "remote"
ã¢ãŒããæå®ããã ãã§ã¯ååã§ã¯ãããŸãããã¢ã¯ã¿ãŒãå®è¡ãããã¹ããæå®ããå¿
èŠããããŸãã ã¢ãã¬ã¹192.168.1.101
é£ã®ãã·ã³ããããŸãã ç§ã¯ããã䜿çšããŸãïŒ
{ "PrimeFinderActor": { "mode": "remote", "host": "192.168.1.101", "clusterSize": 4 } }
ãã©ãã«ã®ã¿ïŒãã®éåžžã«é£æ¥ãããã·ã³ã¯ãã³ã¡ãã£ã«ã€ããŠäœãç¥ããŸããã æ¢ç¥ã®ããŒãã§ç¹å¥ãªãªã¹ããŒããã»ã¹ãå®è¡ããå¿
èŠããããŸãã ããã¯æ¬¡ã®ããã«è¡ãããŸãã
$ ssh weekens@192.168.1.101 ... weekens@192.168.1.101 $ mkdir comedy weekens@192.168.1.101 $ cd comedy weekens@192.168.1.101 $ npm install comedy ... weekens@192.168.1.101 $ node_modules/.bin/comedy-node Thu Aug 10 2017 19:29:51 GMT+0300 (MSK) - info: Listening on :::6161
ããã§ããªã¹ããŒããã»ã¹ã¯ãæ¢ç¥ã®ããŒã6161
ã¢ã¯ã¿ãŒäœæèŠæ±ãåãå
¥ããæºåãã§ããŸããã ç§éã¯è©Šã¿ãŸãïŒ
$ nodejs prime-finder.js
$ curl http://localhost:8080/next-prime/3000000000 & $ curl http://localhost:8080/next-prime/3000000000 &
ç§ãã¡ã¯ããŒã«ã«ãã·ã³ã§ãããã«èŠããŸãã ã¢ã¯ãã£ããã£ãªãïŒChromiumãé€ãïŒïŒ
$ top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 25247 weekens 20 0 1978768 167464 51652 S 13,6 2,2 32:34.70 chromium-browse
ãªã¢ãŒããã·ã³ãèŠãŠã¿ãŸãããã
weekens@192.168.1.101 $ top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 27956 weekens 20 0 908612 40764 21072 R 100,1 0,1 0:14.97 nodejs 27961 weekens 20 0 908612 40724 21020 R 100,1 0,1 0:11.59 nodejs
å¿
èŠã«å¿ããŠæŽæ°ãèšç®ããŠããŸãã
å°ããªã¿ããã1ã€ã ããããŸããããŒã«ã«ãã·ã³ãšãªã¢ãŒããã·ã³ã®äž¡æ¹ã§ã«ãŒãã«ã䜿çšããŸãã ããã¯éåžžã«åçŽã§ãïŒ actors.json
1ã€ã®ãã¹ãã§ã¯ãªããããã€ãã®ãã¹ããæå®ããŸãã
{ "PrimeFinderActor": { "mode": "remote", "host": ["127.0.0.1", "192.168.1.101"], "clusterSize": 4 } }
ã³ã¡ãã£ã¯ãæå®ããããã¹ãéã§ã¢ã¯ã¿ãŒãåçã«é
åžããã©ãŠã³ãããã³ã¡ãã»ãŒãžãæäŸããŸãã èŠãŠã¿ãŸãããã
ãŸããããŒã«ã«ãã·ã³ã§ãªã¹ããŒããã»ã¹ãè¿œå ã§å®è¡ããŸãã
$ node_modules/.bin/comedy-node Fri Aug 11 2017 15:37:26 GMT+0300 (MSK) - info: Listening on :::6161
次ã«äŸãå®è¡ããŸãã
$ nodejs prime-finder.js
ããŒã«ã«ãã·ã³äžã®ããã»ã¹ã®ãªã¹ããèŠãŠã¿ãŸãããã
$ ps ax | grep nodejs 22869 pts/19 Sl+ 0:00 /usr/bin/nodejs /home/weekens/workspace/comedy-examples/node_modules/comedy/lib/forked-actor-worker.js PrimeFinderActor 22874 pts/19 Sl+ 0:00 /usr/bin/nodejs /home/weekens/workspace/comedy-examples/node_modules/comedy/lib/forked-actor-worker.js PrimeFinderActor
ãããŠããªã¢ãŒããã·ã³äžã§ïŒ
192.168.1.101 $ ps ax | grep node 5925 pts/4 Sl+ 0:00 /usr/bin/nodejs /home/weekens/comedy/node_modules/comedy/lib/forked-actor-worker.js PrimeFinderActor 5930 pts/4 Sl+ 0:00 /usr/bin/nodejs /home/weekens/comedy/node_modules/comedy/lib/forked-actor-worker.js PrimeFinderActor
å¿
èŠã«å¿ããŠããããã2ã€ïŒããã«å¿
èŠclusterSize
å¢ããclusterSize
ïŒã ãªã¯ãšã¹ããéä¿¡ããŸãïŒ
$ curl http://localhost:8080/next-prime/3000000000 & [1] 23000 $ curl http://localhost:8080/next-prime/3000000000 & [2] 23002
ããŒã«ã«ãã·ã³ã§ã®èªã¿èŸŒã¿ã確èªããŸãã
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 22869 weekens 20 0 908080 40344 21724 R 106,7 0,5 0:07.40 nodejs
ãªã¢ãŒããã·ã³ã§ã®èªã¿èŸŒã¿ã確èªããŸãã
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 5925 weekens 20 0 909000 40912 21044 R 100,2 0,1 0:14.17 nodejs
åãã·ã³ã«1ã€ã®ã³ã¢ãããŒããããŸãã ã€ãŸããè² è·ãäž¡æ¹ã®ãã·ã³ã«åçã«åæ£ããããã«ãªããŸããã 1è¡ã®ã³ãŒããå€æŽããã«ãããéæããããšã«æ³šæããŠãã ããã ã³ã¡ãã£ãšä¿³åªã®ã¢ãã«ããããå©ããŠãããŸããã
ãããã«
Node.JS- Comedyã§ã®ã¢ã¯ã¿ãŒã¢ãã«ãšãã®å®è£
ã䜿çšãããã¢ããªã±ãŒã·ã§ã³ã®æè»ãªã¹ã±ãŒãªã³ã°ã®äŸãèŠãŠã¿ãŸããã ã¢ã¯ã·ã§ã³ã®ã¢ã«ãŽãªãºã ã¯æ¬¡ã®ãšããã§ãã
- ã¢ã¯ã¿ãŒã®èŠ³ç¹ããã¢ããªã±ãŒã·ã§ã³ã説æããŠãã ããã
- å€ãã®å©çšå¯èœãªCPUã³ã¢ã«è² è·ãåçã«åæ£ããããã«ã¢ã¯ã¿ãŒãæ§æããŸãã
ã¢ã¯ã¿ãŒã®èŠ³ç¹ããã¢ããªã±ãŒã·ã§ã³ã説æããæ¹æ³ã¯ïŒ ããã¯ãããªããžã§ã¯ããšã¯ã©ã¹ã®èŠ³ç¹ããã¢ããªã±ãŒã·ã§ã³ãèšè¿°ããæ¹æ³ããšãã質åã«é¡äŒŒããŠããŸãã æŒæããã°ã©ãã³ã°ã¯OOPã«éåžžã«äŒŒãŠããŸãã ããã¯OOP ++ã§ãããšèšããŸãã OOPã«ã¯ãå®è©ã®ããããŸããŸãªæåãããã¶ã€ã³ãã¿ãŒã³ããããŸãã åæ§ã«ãã¢ã¯ã¿ãŒã¢ãã«ã«ã¯ç¬èªã®ãã¿ãŒã³ããããŸãã ããã«ãããã®æ¬ããããŸãã ãããã®ãã¿ãŒã³ã¯äœ¿çšã§ãã確ãã«åœ¹ç«ã¡ãŸããããã§ã«OOPãææããŠããå Žåã¯ãã¢ã¯ã¿ãŒã«åé¡ã¯ãããŸããã
ã¢ããªã±ãŒã·ã§ã³ããã§ã«äœæãããŠããå Žåã¯ã©ããªããŸããïŒ ãã¢ã¯ã¿ãŒã«æžãæãããå¿
èŠããããŸããïŒ ãã¡ããããã®å Žåã¯ã³ãŒãã®å€æŽãå¿
èŠã§ãã ãããã倧èŠæš¡ãªãªãã¡ã¯ã¿ãªã³ã°ãè¡ãå¿
èŠã¯ãããŸããã ããã€ãã®äž»èŠãªã倧ãã¢ã¯ã¿ãŒãããããã®åŸããã§ã«ã¹ã±ãŒãªã³ã°ã§ããŸãã ã倧ããªãã¢ã¯ã¿ãŒã¯ãæçµçã«å°ããªã¢ã¯ã¿ãŒã«åå²ã§ããŸãã ç¹°ãè¿ããŸãããã¢ããªã±ãŒã·ã§ã³ãæ¢ã«OOPã®çšèªã§èšè¿°ãããŠããå Žåãã¢ã¯ã¿ãŒãžã®åãæ¿ãã¯ã»ãšãã©ã®å Žåç°¡åã§ãã äœæ¥ããªããã°ãªããªãå¯äžã®ããšã¯ãåçŽãªãªããžã§ã¯ããšã¯ç°ãªããã¢ã¯ã¿ãŒãäºãã«å®å
šã«éé¢ãããŠããããšã§ãã
ãã¬ãŒã ã¯ãŒã¯ã®æç床ã«ã€ããŠã ã³ã¡ãã£ã®æåã®äœæ¥ããŒãžã§ã³ã¯ã2016幎6æã«SAYMONãããžã§ã¯ãå
ã§éçºãããŸããã æåã®ããŒãžã§ã³ããããã¬ãŒã ã¯ãŒã¯ã¯æŠéæ¡ä»¶äžã§æ¬çªç°å¢ã§æ©èœããŸããã 2017幎4æãã©ã€ãã©ãªã¯Eclipse Public Licenseã®äžã§ãªãŒãã³ãœãŒã¹ã§ãªãªãŒã¹ãããŸããã åæã«ãã³ã¡ãã£ã¯åŒãç¶ãSAYMONã®äžéšã§ãããã·ã¹ãã ã®ã¹ã±ãŒãªã³ã°ãšãã©ãŒã«ããã¬ã©ã³ã¹ã®ç¢ºä¿ã«äœ¿çšãããŸãã
èšç»ãããŠããæ©èœã®ãªã¹ãã¯ãã¡ãã§ãã
ãã®èšäºã§ã¯ãäžé£ã®ã³ã¡ãã£æ©èœã«ã€ããŠã¯èšåããŸããã§ããããã©ãŒã«ããã¬ã©ã³ã¹ïŒã¢ã¯ã¿ãŒã®ããªã¹ããŒã³ãïŒãã¢ã¯ã¿ãŒãžã®ãªãœãŒã¹ã®æ³šå
¥ãååä»ãã¯ã©ã¹ã¿ãŒãã«ã¹ã¿ã ã¯ã©ã¹ã®ããŒã·ã£ãªã³ã°ãTypeScriptãµããŒãã«ã€ããŠã§ãã ããããäžèšã®ã»ãšãã©ã¯ããã¥ã¡ã³ãã«ããããŸã 説æãããŠããªãã®ã¯ãã¹ããšäŸã§ãã ããã«ããããã¯ã倧è¡åãã§ããã°ãNode.JSã§ã³ã¡ãã£ãšä¿³åªã«ã€ããŠã®èšäºããã£ãšæžããããããŸããã
ã³ã¡ãã£ã䜿çšããŠãã ããïŒ èª²é¡ãäœæããŠãã ããïŒ ããªãã®ã³ã¡ã³ããåŸ
ã£ãŠããŸãïŒ