Skip to content

PgIpLock

Mykhailo Stadnyk edited this page Apr 27, 2020 · 4 revisions

Class: PgIpLock

Implements manageable inter-process locking mechanism over existing PostgreSQL connection for a given LISTEN channel.

It uses periodic locks acquire retries and implements graceful shutdown using SIGINT, SIGTERM and SIGABRT OS signals, by which safely releases an acquired lock, which causes an event to other similar running instances on another processes (or on another hosts) to capture free lock.

By running inside Docker containers this would work flawlessly on implementation auto-scaling services, as docker destroys containers gracefully.

Currently, the only known issue could happen only if, for example, database or software (or hardware) in the middle will cause a silent disconnect. For some period of time, despite the fact that there are other live potential listeners some messages can go into void. This time period can be tuned by bypassing wanted acquireInterval argument. By the way, take into account that too short period and number of running services may cause huge flood of lock acquire requests to a database, so selecting the proper number should be a thoughtful trade-off between overall system load and reliability level.

Usually you do not need instantiate this class directly - it will be done by a PgPubSub instances on their needs. Therefore, you may re-use this piece of code in some other implementations, so it is exported as is.

Hierarchy

  • PgIpLock

Implements

Index

Constructors

Properties

Accessors

Methods

Constructors

constructor

+ new PgIpLock(channel: string, options: PgIpLockOptions): PgIpLock

Parameters:

Name Type Description
channel string source channel name to manage locking on
options PgIpLockOptions lock instantiate options

Returns: PgIpLock

Properties

Readonly channel

channel: string

source channel name to manage locking on


Readonly options

options: PgIpLockOptions

lock instantiate options

Accessors

Static schemaName

get schemaName(): string

DB lock schema name getter

Returns: string

Methods

acquire

acquire(): Promise‹boolean›

Implementation of AnyLock

Acquires a lock on the current channel. Returns true on success, false - otherwise

Returns: Promise‹boolean›


destroy

destroy(): Promise‹void›

Implementation of AnyLock

Destroys this lock properly.

Returns: Promise‹void›


init

init(): Promise‹void›

Implementation of AnyLock

Initializes inter-process locks storage in database and starts listening of lock release events, as well as initializes lock acquire retry timer.

Returns: Promise‹void›


isAcquired

isAcquired(): boolean

Implementation of AnyLock

Returns current lock state, true if acquired, false - otherwise.

Returns: boolean


onRelease

onRelease(handler: function): void

This would provide release handler which will be called once the lock is released and the channel name would be bypassed to a given handler

Parameters:

handler: function

▸ (channel: string): void

Parameters:

Name Type
channel string

Returns: void


release

release(): Promise‹void›

Implementation of AnyLock

Releases acquired lock on this channel. After lock is released, another running process or host would be able to acquire the lock.

Returns: Promise‹void›


Static destroy

destroy(): Promise‹void›

Calls destroy() on all created instances at a time

Returns: Promise‹void›


Static hasInstances

hasInstances(): boolean

Returns true if at least one instance was created, false - otherwise

Returns: boolean

Clone this wiki locally