-
Notifications
You must be signed in to change notification settings - Fork 9
PgIpLock
Globals / 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.
- PgIpLock
+ new PgIpLock(channel
: string, options
: PgIpLockOptions): PgIpLock
Name | Type | Description |
---|---|---|
channel |
string | source channel name to manage locking on |
options |
PgIpLockOptions | lock instantiate options |
Returns: PgIpLock
• Readonly
channel: string
source channel name to manage locking on
• Readonly
options: PgIpLockOptions
lock instantiate options
• Static
get schemaName(): string
DB lock schema name getter
Returns: string
▸ acquire(): Promise<boolean>
Implementation of AnyLock
Acquires a lock on the current channel. Returns true on success, false - otherwise
Returns: Promise<boolean>
▸ destroy(): Promise<void>
Implementation of AnyLock
Destroys this lock properly.
Returns: Promise<void>
▸ 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(): boolean
Implementation of AnyLock
Returns current lock state, true if acquired, false - otherwise.
Returns: boolean
▸ onRelease(handler
: (channel: string) => void): 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
Name | Type | Description |
---|---|---|
handler |
(channel: string) => void |
Returns: void
▸ 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(): Promise<void>
Calls destroy() on all created instances at a time
Returns: Promise<void>
▸ Static
hasInstances(): boolean
Returns true if at least one instance was created, false - otherwise
Returns: boolean