| 
									
										
										
										
											2016-09-08 16:23:40 -06:00
										 |  |  | cluster-rpc | 
					
						
							|  |  |  | =========== | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | A simple way to wrap node.js modules for use with cluster even though they | 
					
						
							|  |  |  | were designed to be used in a single non-cluster instance. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Install | 
					
						
							|  |  |  | ======= | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | npm install --save cluster-rpc | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Usage | 
					
						
							|  |  |  | ===== | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In the **master** process you will create the real instance of whatever module | 
					
						
							|  |  |  | you're trying to use (for example express-session/session/memory, sqlite3, level) | 
					
						
							|  |  |  | and then you will supply the names of the methods you wish to export to **worker** | 
					
						
							|  |  |  | processes. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 18:25:08 -06:00
										 |  |  | By default each worker will be added when `cluster` emits a `fork` event. | 
					
						
							|  |  |  | If needed you can set `addOnFork` to `false` and call `addWorker(worker)` manually. | 
					
						
							| 
									
										
										
										
											2016-09-08 16:23:40 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | ### master
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```javascript | 
					
						
							|  |  |  | // You can pick any module with thunk-style callbacks | 
					
						
							|  |  |  | // For example: | 
					
						
							|  |  |  | var db = require('level')('./mydb') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Wrap the instance | 
					
						
							|  |  |  | var crpc = require('cluster-rpc/master').create({ | 
					
						
							| 
									
										
										
										
											2016-09-08 18:25:08 -06:00
										 |  |  |   addOnFork: true                 // default | 
					
						
							|  |  |  | , instance: db | 
					
						
							| 
									
										
										
										
											2016-09-08 16:23:40 -06:00
										 |  |  | , methods: [ 'get', 'put' ] | 
					
						
							|  |  |  | , name: 'foo-level' | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 18:25:08 -06:00
										 |  |  | // If you set addOnFork to false, You must manually add each worker | 
					
						
							|  |  |  | // crpc.addWorker(cluster.fork()); | 
					
						
							| 
									
										
										
										
											2016-09-08 16:23:40 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | crpc.then(function (db) { | 
					
						
							|  |  |  |   // processes are connected and ready | 
					
						
							|  |  |  |   // 'db' is the original instance | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### worker
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```javascript | 
					
						
							|  |  |  | // retrieve the instance | 
					
						
							|  |  |  | var crpc = require('cluster-rpc/worker').create({ | 
					
						
							|  |  |  |   name: 'foo-level' | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // all listed methods will be rpc'd | 
					
						
							|  |  |  | crpc.then(function (db) { | 
					
						
							|  |  |  |   // db.put, db.get | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Example | 
					
						
							|  |  |  | ======= | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```javascript | 
					
						
							|  |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var cluster = require('cluster'); | 
					
						
							|  |  |  | var crpc; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (cluster.isMaster) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   crpc = require('cluster-rpc/master').create({ | 
					
						
							| 
									
										
										
										
											2016-09-08 18:25:08 -06:00
										 |  |  |     addOnFork: false | 
					
						
							|  |  |  |   , instance: require('level')('./mydb') | 
					
						
							| 
									
										
										
										
											2016-09-08 16:23:40 -06:00
										 |  |  |   , methods: [ 'get', 'put' ] | 
					
						
							|  |  |  |   , name: 'foo-level' | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   crpc.addWorker(cluster.fork()); | 
					
						
							|  |  |  |   crpc.then(function () { | 
					
						
							|  |  |  |     db.put('foo', 'bar'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | else { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   crpc = require('cluster-rpc/worker').create({ | 
					
						
							|  |  |  |     name: 'foo-level' | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | crpc.then(function (db) { | 
					
						
							|  |  |  |   setTimeout(function () { | 
					
						
							|  |  |  |     db.get('foo', function (err, result) { | 
					
						
							|  |  |  |       console.log("db.get('foo')", result); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }, 250); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | ``` |