Micro Workers This repository contains a framework that helps create `scalable` and `inter-connected` nodejs `microservices`.
Installation
npm install micro-workers --save
Diagram
Usage
Most of the classes require a configuration object containing the server information, as well as the endpoints. This can be created on the fly inside of your programs or passed in as a module.
This might be a good place to store other application settings as well
Anatomy of a config file
config = serverUrl: "http://localhost" serverPort: 3000 staticPath: "www" endpoint: sampleEndpoint: "sampleendpoint" # if the config is inside its own file then we need to export it as a module module.exports = config
Create a server
A Server is required for the framework to work. The Server class does not need to be extended to be customized and should be used directly. only One instance of the server should be used per application. Prior to creating a server all the endpoints needed should be identified and added to the config.endpoint object as key/value properties
Server = require"micro-worker"Server # Create Custome hooks if necessary # A Hook will automatically be applied to the Endpoint with the same name # example sampleEndpoint endpoint will apply to config.endpoint.sampleEndpoint sampleHooks = sampleEndpoint before: : # Add the created_at date hook.data.created_at = # Go to the next step (save to database) next : # Sort the result list by created_at date hook.params.query.$sort = last_sync_at: 1 created_at: -1 next after: : size = hookresultlength # Only the last 10 if size >= 10 hook.result = hookresultslicesize - 10size next # Start a new Instance of your class to run the worker config = require "./config" configsampleHooks
Create a Listener
A Listener is just a class that will listen to a particular endpoint for events (created, updated, patched, and removed) and take some action. On a "user" endpoint for example this would be used to send an email to the user every time the user is created (in the created function)
Listener = require"micro-worker"Listener # Call the super class with config and endpoint : super @config@endpoint : consolelog "created: "data : consolelog "updated: "data : consolelog "patched: "data : consolelog "removed: "data # Start a new Instance of your class to run the Listener config = require "./config"endpoint = "sampleendpoint" configendpoint
Create a worker
A worker class makes it easy to execute a sequence of task in a distributed maner. It helps the developer only focus on the application logic by supplying only the items below.
- a config: a configuration object
- the workerType: the name for the current worker so it can be referenced by other workers
- a nextWorkerType: the name for the next worker in the flow that will exicute the next task. This can be set to null and can be dynamically set from whitin the doWork function; the data returned by that function would just need to have a property named "nextWorkerType"
- the doWork function: this is where your app logic and focus will be
Worker = require"micro-worker"Worker : @workerType = "sampleworker" @nextWorkerType = "nextworker" syncEndpoint = "sync" # Call the super class with workerType, nextWorkerType, syncEndpoint arguents super @config@workerType@nextWorkerTypesyncEndpoint : resultDataForNextWorker = Mathsin number if isNaN resultDataForNextWorker error = "The result is not a number" else error = null callback errresultDataForNextWorker # Start a new Instance of your class to run the worker config = require "./config" config
Create a sync
Knowing how unstable applications might become some times due to external dependancies (rest, databses ...), a Sync class would be used to periodically check for discrepancies between an application and the external system it works with and automatically fix them. For example a Sync would automatically retry an api call once the API server comes back online.
Sync = require"micro-worker"Sync # Just an example check function that checks if the number passed in is equal to 50 = if number is 50 error = null else error = "The number value isn't 50" consolelog error callback errornumber : # syncChecks is an array of all the check functions syncChecks = checkIfNumberIs50 syncEndpoint = "sync" entityEndpoint = "sampleentity" # call the super class with syncChecks, entityEndpoint, fixErrors, syncEndpoint, syncEntityName (optional), syncInterval(optional) arguments super @configsyncChecksentityEndpointtruesyncEndpoint"data"30000 # Finding all the entities to work with : # Syncing some numbers callback null10203040 : # For example our fix is to increment the number entity++ callback nullentity # Start a new Instance of your to run the sync config = require "./config" config
Tests
npm test
Release History
- 0.1.24 If a worker does not explicitly specify the ENTITY_ENDPOINT we will construct it from the nested object key name and will update the entity on the server
- 0.1.23 Fixed Bug in 0.1.22
- 0.1.22 update the
last_worked_on
for the nested entity as well (Deprecated Bug) - 0.1.21 Compiled js for latest Changes in 0.1.20
- 0.1.20 Update the
last_worked_on
when a worker gets an entity - 0.1.19 Now only sync entities where the last_sync is overdue per the sync interval Added async as an explicit dependency Display the sync entity name in the logs
- 0.1.18 Added async as an explicit dependency
- 0.1.17 Added fethers-hooks as an explicit dependency
- 0.1.14 - 0.1.16 Documentation Updates
- 0.1.13 Sync Module fixes (Cleanup)
- 0.1.12 Made the Sync Module stable
- 0.1.11 Performance Improvements : The workers get registered and unregistered in realtime using sockets connect and disconnect events as opposed to the timed heartbeat mechanism used before
- 0.1.7 Bug fixes for Cannot read property 'updateLastUsed' of undefined
- 0.1.6 Listerner class improvements
- 0.1.5 Added the endpoint listerner class
- 0.1.4 Need to use v4 UUID instead of v1 so improve uniqueness
- 0.1.3 heattbeat fixes
- 0.1.2 Fixed the bugs about endpoints not starting and also the base path
- 0.1.1 Fixed the heartbeat and worker log(working with Server at) to avoid confusion
- 0.1.0 Initial release