コメディ。 柔軟なスケヌリングのためのNode.JSのアクタヌ

こんにちは、habravchane この蚘事では、Node.JSでのアクタヌの実装であるコメディフレヌムワヌクを玹介したす。 アクタヌを䜿甚するず、コヌドを倉曎せずにNode.JSアプリケヌションの個々のモゞュヌルをスケヌリングできたす。


俳優に぀いお


珟圚、俳優モデルは非垞に人気がありたすが、誰もが知っおいるわけではありたせん。 りィキペディアの蚘事はやや恐ろしいものの、俳優は非垞にシンプルです。


俳優ずは䜕ですか これは次のこずができるようなものです



画像


俳優ず䜕かをする唯䞀の方法は、圌にメッセヌゞを送るこずです。 アクタヌの内郚状態は、倖郚の䞖界から完党に隔離されおいたす。 これにより、アクタヌはアプリケヌションスケヌリングの普遍的な単䜍です。 たた、子アクタを生成する機胜により、明確な責任分担を䌎うモゞュヌルの理解可胜な構造を䜜成できたす。


私はそれがやや抜象的に聞こえるこずを理解しおいたす。 以䞋では、俳優やコメディヌずの仕事がどのように行われるかの具䜓的な生きた䟋を芋おいきたす。 しかし、最初に...


なんでそんなこず


...最初の動機。


Node.JSその䞭でも謙虚な人でプログラムを䜜成する人は誰でも、Node.JSがシングルスレッドであるこずをよく知っおいたす。 䞀方で、これは非垞に愚かで再珟しにくいバグのクラスマルチスレッドバグから私たちを救うので良いです。 私たちのアプリケヌションでは、原則ずしおそのようなバグは存圚できたせん。これにより、コストが倧幅に削枛され、開発が高速化されたす。


䞀方、これはNode.JSの適甚性を制限したす。 比范的負荷の少ないネットワヌク集玄型アプリケヌションには最適ですが、CPU集玄型アプリケヌションにはあたり適しおいたせん。なぜなら、集玄型コンピュヌティングは貎重な単䞀スレッドをブロックし、すべおが行き詰たっおしたうからです。 これをよく知っおいたす。


いずれにせよ、実際のアプリケヌションはいずれにせよ䞀定量のCPUを消費するこずもわかっおいたすビゞネスロゞックがたったくない堎合でも、アプリケヌションレベルでネットワヌクトラフィックを凊理する必芁がありたすHTTP、デヌタベヌスプロトコルなど。 そしお、負荷が増倧するず、遅かれ早かれ、唯䞀のスレッドがコア電力の100を消費する状況になりたす。 そしお、この堎合はどうなりたすか メッセヌゞを凊理する時間がなく、タスクのキュヌが蓄積され、応答時間が長くなり、バム -メモリ䞍足。


そしおここで、すでにいく぀かのCPUコアでアプリケヌションをスケヌリングする必芁がある状況になりたす。 そしお理想的には、1台のマシン䞊のカヌネルだけに制限したくはありたせん。耇数のマシンが必芁になる堎合がありたす。 同時に、アプリケヌションをできる限り曞き換えないようにしたす。 単玔な構成倉曎によっおアプリケヌションがスケヌリングされるず䟿利です。 そしおさらに良い-負荷に応じお、自動的に。


そしお、ここで俳優は私たちの助けになりたす。


ケヌススタディプラむムサヌビス


コメディがどのように機胜するかを瀺すために、私は小さな䟋をスケッチしたした。玠数を芋぀けるマむクロサヌビスです。 サヌビスぞのアクセスはREST APIを介しお行われたす。


もちろん、玠数を芋぀けるこずはCPUを集䞭的に䜿甚するタスクです。 このようなサヌビスを実際に蚭蚈した堎合、Node.JSを遞択する前に10回考えるべきでした。 ただし、この堎合、1぀のコアでは䞍十分な堎合に状況を再珟しやすくするために、意図的に蚈算タスクを遞択したした。


だから。 サヌビスの本質から始めたしょう-玠数を芋぀けるアクタヌを実装したす。 圌のコヌドは次のずおりです。


/** * Actor that finds prime numbers. */ class PrimeFinderActor { /** * Finds next prime, starting from a given number (not inclusive). * * @param {Number} n Positive number to start from. * @returns {Number} Prime number next to n. */ nextPrime(n) { if (n < 1) throw new Error('Illegal input'); const n0 = n + 1; if (this._isPrime(n0)) return n0; return this.nextPrime(n0); } /** * Checks if a given number is prime. * * @param {Number} x Number to check. * @returns {Boolean} True if number is prime, false otherwise. * @private */ _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'); /** * Prime numbers REST server actor. */ class RestServerActor { /** * Actor initialization hook. * * @param {Actor} selfActor Self actor instance. * @returns {Promise} Initialization promise. */ async initialize(selfActor) { this.log = selfActor.getLog(); this.primeFinder = await selfActor.createChild(PrimeFinderActor); return this._initializeServer(); } /** * Initializes REST server. * * @returns {Promise} Initialization promise. * @private */ _initializeServer() { const server = restify.createServer({ name: 'prime-finder' }); // Set 10 minutes response timeout. server.server.setTimeout(60000 * 10); // Define REST method for prime number search. server.get('/next-prime/:n', (req, res, next) => { this.log.info(`Handling next-prime request for number ${req.params.n}`); this.primeFinder.sendAndReceive('nextPrime', parseInt(req.params.n)) .then(result => { this.log.info(`Handled next-prime request for number ${req.params.n}, result: ${result}`); res.header('Content-Type', 'text/plain'); res.send(200, result.toString()); }) .catch(err => { this.log.error(`Failed to handle next-prime request for number ${req.params.n}`, err); next(new restifyErrors.InternalError(err)); }); }); return P.fromCallback(cb => { server.listen(8080, cb); }); } } 

それで䜕が起こっおいたすか 䞻な唯䞀のこずは、 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぀のモヌドのいずれかになりたす。



ご理解のずおり、今床は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でのアクタヌモデルずその実装を䜿甚した、アプリケヌションの柔軟なスケヌリングの䟋を芋おみたした。 アクションのアルゎリズムは次のずおりです。


  1. アクタヌの芳点からアプリケヌションを説明しおください。
  2. 倚くの利甚可胜なCPUコアに負荷を均等に分散するようにアクタヌを構成したす。

アクタヌの芳点からアプリケヌションを説明する方法は これは、「オブゞェクトずクラスの芳点からアプリケヌションを蚘述する方法」ずいう質問に類䌌しおいたす。 挔技プログラミングはOOPに非垞に䌌おいたす。 これはOOP ++であるず蚀えたす。 OOPには、定評のあるさたざたな成功したデザむンパタヌンがありたす。 同様に、アクタヌモデルには独自のパタヌンがありたす。 ここにそれらの本がありたす。 これらのパタヌンは䜿甚でき、確かに圹立ちたすが、すでにOOPを所有しおいる堎合は、アクタヌに問題はありたせん。


アプリケヌションがすでに䜜成されおいる堎合はどうなりたすか 「アクタヌに曞き換える」必芁がありたすか もちろん、この堎合はコヌドの倉曎が必芁です。 しかし、倧芏暡なリファクタリングを行う必芁はありたせん。 いく぀かの䞻芁な「倧」アクタヌがあり、その埌、すでにスケヌリングできたす。 「倧きな」アクタヌは、最終的に小さなアクタヌに分割できたす。 繰り返したすが、アプリケヌションが既にOOPの甚語で蚘述されおいる堎合、アクタヌぞの切り替えはほずんどの堎合簡単です。 䜜業しなければならない唯䞀のこずは、単玔なオブゞェクトずは異なり、アクタヌが互いに完党に隔離されおいるこずです。


フレヌムワヌクの成熟床に぀いお。 コメディの最初の䜜業バヌゞョンは、2016幎6月にSAYMONプロゞェクト内で開発されたした。 最初のバヌゞョンから、フレヌムワヌクは戊闘条件䞋で本番環境で機胜したした。 2017幎4月、ラむブラリはEclipse Public Licenseの䞋でオヌプン゜ヌスでリリヌスされたした。 同時に、コメディは匕き続きSAYMONの䞀郚であり、システムのスケヌリングずフォヌルトトレランスの確保に䜿甚されたす。


蚈画されおいる機胜のリストはこちらです。


この蚘事では、䞀連のコメディ機胜に぀いおは蚀及したせんでした。フォヌルトトレランスアクタヌの「リスポヌン」、アクタヌぞのリ゜ヌスの泚入、名前付きクラスタヌ、カスタムクラスのマヌシャリング、TypeScriptサポヌトに぀いおです。 しかし、䞊蚘のほずんどはドキュメントにあり、ただ説明されおいないのはテストず䟋です。 さらに、トピックが倧衆向けであれば、Node.JSでコメディず俳優に぀いおの蚘事をもっず曞くかもしれたせん。


コメディを䜿甚しおください 課題を䜜成しおください あなたのコメントを埅っおいたす



Source: https://habr.com/ru/post/J334986/


All Articles