mage-module-shard
Version:
Server-side sharding and broadcasting module for MAGE apps.
82 lines (58 loc) • 2.03 kB
Markdown
mage-module-shard
=================
Module to help you create distributed MAGE modules.
Installation
-------------
```shell
npm install --save mage-module-shard
```
Usage
-----
Please take note the following requirments:
1. Methods on objects will **not** be set on the remote node; you
should stick to sending only data objects
> lib/modules/sharded/index.ts
```typescript
import AbstractShardedModule, {
IShard
} from 'mage-module-shard'
class ShardedModule extends AbstractShardedModule {
public async willForwardSomeCalls(state: mage.core.IState) {
const shard = this.createShard(state.actorId)
const val = await shard.willRunRemotely(state)
return { shard, val }
}
public async forwardUsingShard(state: mage.core.IState, shardData: IShard) {
const shard = this.getShard(shardData)
const val = await shard.willRunRemotely(state)
return { shard, val }
}
public async sendToAll(state: mage.core.IState) {
const broadcast = this.createBroadcast()
const [errors, values] = await broadcast.willRunRemotely(state)
if (errors) {
throw new Error('failed')
}
// A map of hash id to values is returned
return Object.values(values)
}
public willRunRemotely(state: mage.core.IState) {
return 1
}
}
export default new ShardedModule()
```
This module works as follow:
1. Call `this.createShard(string)` to receive a proxy instance; all API calls
made on this proxy will always be forwarded to the same server
2. **Keep this proxy around**: Normally, you will pass this to your game client(s)
3. **Reuse the proxy data in future calls**: Game clients will send you back this data,
and you will use it to route other related calls to the same MAGE node
Todo
----
- [x] broadcast: send a call to all nodes in the cluster and receive an array of responses
- [ ] set attributes over shard/broadcasts
- [ ] limit: only let a limited number of nodes run this module
License
-------
MIT