batch-cluster
Version:
Manage a cluster of child processes
159 lines (158 loc) • 6.06 kB
TypeScript
import { BatchClusterEmitter } from "./BatchClusterEmitter";
import { Logger } from "./Logger";
export declare const secondMs = 1000;
export declare const minuteMs: number;
/**
* These parameter values have somewhat sensible defaults, but can be
* overridden for a given BatchCluster.
*/
export declare class BatchClusterOptions {
/**
* No more than `maxProcs` child processes will be run at a given time
* to serve pending tasks.
*
* Defaults to 1.
*/
maxProcs: number;
/**
* Child processes will be recycled when they reach this age.
*
* This value must not be less than `spawnTimeoutMillis` or
* `taskTimeoutMillis`.
*
* Defaults to 5 minutes. Set to 0 to disable.
*/
maxProcAgeMillis: number;
/**
* This is the minimum interval between calls to BatchCluster's #onIdle
* method, which runs general janitorial processes like child process
* management and task queue validation.
*
* Must be > 0. Defaults to 10 seconds.
*/
onIdleIntervalMillis: number;
/**
* If the initial `versionCommand` fails for new spawned processes more
* than this rate, end this BatchCluster and throw an error, because
* something is terribly wrong.
*
* If this backstop didn't exist, new (failing) child processes would be
* created indefinitely.
*
* Defaults to 10. Set to 0 to disable.
*/
maxReasonableProcessFailuresPerMinute: number;
/**
* Spawning new child processes and servicing a "version" task must not take
* longer than `spawnTimeoutMillis` before the process is considered failed,
* and need to be restarted. Be pessimistic here--windows can regularly take
* several seconds to spin up a process, thanks to antivirus shenanigans.
*
* Defaults to 15 seconds. Set to 0 to disable.
*/
spawnTimeoutMillis: number;
/**
* If maxProcs > 1, spawning new child processes to process tasks can slow
* down initial processing, and create unnecessary processes.
*
* Must be >= 0ms. Defaults to 1.5 seconds.
*/
minDelayBetweenSpawnMillis: number;
/**
* If commands take longer than this, presume the underlying process is dead
* and we should fail the task.
*
* This should be set to something on the order of seconds.
*
* Defaults to 10 seconds. Set to 0 to disable.
*/
taskTimeoutMillis: number;
/**
* Processes will be recycled after processing `maxTasksPerProcess` tasks.
* Depending on the commands and platform, batch mode commands shouldn't
* exhibit unduly memory leaks for at least tens if not hundreds of tasks.
* Setting this to a low number (like less than 10) will impact performance
* markedly, due to OS process start/stop maintenance. Setting this to a very
* high number (> 1000) may result in more memory being consumed than
* necessary.
*
* Must be >= 0. Defaults to 500
*/
maxTasksPerProcess: number;
/**
* When `this.end()` is called, or Node broadcasts the `beforeExit` event,
* this is the milliseconds spent waiting for currently running tasks to
* finish before sending kill signals to child processes.
*
* Setting this value to 0 means child processes will immediately receive a
* kill signal to shut down. Any pending requests may be interrupted. Must be
* >= 0. Defaults to 500ms.
*/
endGracefulWaitTimeMillis: number;
/**
* When a task sees a "pass" or "fail" from either stdout or stderr, it needs
* to wait for the other stream to finish flushing to ensure the task's Parser
* sees the entire relevant stream contents. A larger number may be required
* for slower computers to prevent internal errors due to lack of stream
* coercion.
*
* Note that this puts a hard lower limit on task latency, so don't set this
* to a large number: no task will resolve faster than this value (in millis).
*
* If you set this value too low, tasks may be erroneously resolved or
* rejected (depending on which stream is handled first).
*
* Your system may support a smaller value: this is a pessimistic default. If
* this is set too low, you'll see `noTaskData` events.
*
* Setting this to 0 makes whatever flushes first--stdout and stderr--and will
* most likely result in internal errors (due to stream buffers not being able
* to be associated to tasks that were just settled)
*/
streamFlushMillis: number;
/**
* Should batch-cluster try to clean up after spawned processes that don't
* shut down?
*
* Only disable this if you have another means of PID cleanup.
*
* Defaults to `true`.
*/
cleanupChildProcs: boolean;
/**
* If a child process is idle for more than this value (in milliseconds), shut
* it down to reduce system resource consumption.
*
* A value of ~10 seconds to a couple minutes would be reasonable. Set this to
* 0 to disable this feature.
*/
maxIdleMsPerProcess: number;
/**
* How many failed tasks should a process be allowed to process before it is
* recycled?
*
* Set this to 0 to disable this feature.
*/
maxFailedTasksPerProcess: number;
/**
* If `healthCheckCommand` is set, how frequently should we check for
* unhealthy child processes?
*
* Set this to 0 to disable this feature.
*/
healthCheckIntervalMillis: number;
/**
* Verify child processes are still running by checking the OS process table.
*
* Set this to 0 to disable this feature.
*/
pidCheckIntervalMillis: number;
/**
* A BatchCluster instance and associated BatchProcess instances will share
* this `Logger`. Defaults to the `Logger` instance provided to `setLogger()`.
*/
logger: () => Logger;
}
export interface WithObserver {
observer: BatchClusterEmitter;
}