Archimedes
Archimedes is an abstract distributed job engine on AWS.
SDK use
Import SDK
const Archimedes = require("archimedes-jobs")("<NAME_OF_LAMBDA_FUNCTION>");
import archimedes from "archimedes-jobs";
const Archimedes = archimedes("<NAME_OF_LAMBDA_FUNCTION>");
Create job
Archimedes.create({
jobType: "<JOB_TYPE>",
inputData: {
},
inputFiles: {
},
estimations: {
}
}).then(job => {
console.log(job);
}).catch(err => {
console.log(err);
});
Run job
Archimedes.signal({
jobId: job.id,
state: "DISPATCH"
}).then().catch();
Handle job
Payload for job execution will be:
{
"id": "<JOB_ID>"
}
Then use Archimedes to get all job data including inputData
and inputFiles
:
let job = await Archimedes.get({
jobId: "<JOB_ID>"
});
Then signal that we are executing this:
job = Archimedes.signal({
jobId: job.id,
state: "EXECUTE"
})
This will in particular now add a currentExecution
object to the job object:
let jobExecution = job.currentExecution;
While you're executing you might want to periodically upgrade metrics (e.g. max cpu load, max memory usage etc.) as well
as progress. This can be of use two-fold:
- your own application might query this data to show job progress to the user
- Archimedes is scanning jobs in the background for non-progression to make sure to kill and reschedule stuck jobs
To update progress and/or metrics:
Archimedes.updateExecution({
jobId: "XXX",
executionId: jobExecution.executionId,
progress: 0.5,
metrics: {
cpu: 1234,
memory: 5678
}
})
Once you're done with the job, you can store your outputData
and outputFiles
like so:
Archimedes.update({
jobId: "XXX",
outputData: {
...
},
outputFiles: {
...
}
})
And you transition the job to success or failure like so:
Archimedes.signalExecution({
jobId: "XXX",
executionId: jobExecution.executionId,
state: "SUCCESS"
})