From cbfed3e3544158acf3a25a5c96fab5f44bf65ea9 Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Sat, 6 Jun 2020 21:35:01 -0700 Subject: [PATCH] feat(pooling): add an extension to provide pooling service --- CODEOWNERS | 1 + docs/site/MONOREPO.md | 1 + extensions/pooling/.npmrc | 2 + extensions/pooling/LICENSE | 25 ++ extensions/pooling/README.md | 281 +++++++++++++ extensions/pooling/package-lock.json | 45 +++ extensions/pooling/package.json | 50 +++ extensions/pooling/pooling.png | Bin 0 -> 161665 bytes .../src/__tests__/acceptance/README.md | 1 + .../acceptance/pooling.acceptance.ts | 382 ++++++++++++++++++ .../src/__tests__/integration/README.md | 1 + .../pooling/src/__tests__/unit/README.md | 1 + extensions/pooling/src/index.ts | 6 + extensions/pooling/src/pooling.ts | 322 +++++++++++++++ extensions/pooling/tsconfig.json | 20 + tsconfig.json | 3 + 16 files changed, 1141 insertions(+) create mode 100644 extensions/pooling/.npmrc create mode 100644 extensions/pooling/LICENSE create mode 100644 extensions/pooling/README.md create mode 100644 extensions/pooling/package-lock.json create mode 100644 extensions/pooling/package.json create mode 100644 extensions/pooling/pooling.png create mode 100644 extensions/pooling/src/__tests__/acceptance/README.md create mode 100644 extensions/pooling/src/__tests__/acceptance/pooling.acceptance.ts create mode 100644 extensions/pooling/src/__tests__/integration/README.md create mode 100644 extensions/pooling/src/__tests__/unit/README.md create mode 100644 extensions/pooling/src/index.ts create mode 100644 extensions/pooling/src/pooling.ts create mode 100644 extensions/pooling/tsconfig.json diff --git a/CODEOWNERS b/CODEOWNERS index 9dbc3c22874d..af20155f8cd7 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -132,6 +132,7 @@ # - Standby owner(s): @emonddr /packages/core/src/component.ts @emonddr @jannyHou @raymondfeng /extensions/cron @raymondfeng +/extensions/pooling @raymondfeng /examples/greeting-app @emonddr @jannyHou @raymondfeng /examples/log-extension @emonddr @jannyHou @raymondfeng /examples/greeter-extension @emonddr @jannyHou @raymondfeng diff --git a/docs/site/MONOREPO.md b/docs/site/MONOREPO.md index be982551694b..03fe3ffcda3b 100644 --- a/docs/site/MONOREPO.md +++ b/docs/site/MONOREPO.md @@ -44,6 +44,7 @@ one in the monorepo: `npm run update-monorepo-file` | [extensions/health](https://github.com/strongloop/loopback-next/tree/master/extensions/health) | @loopback/extension-health | An extension exposes health check related endpoints with LoopBack 4 | | [extensions/logging](https://github.com/strongloop/loopback-next/tree/master/extensions/logging) | @loopback/extension-logging | An extension exposes logging for Winston and Fluentd with LoopBack 4 | | [extensions/metrics](https://github.com/strongloop/loopback-next/tree/master/extensions/metrics) | @loopback/extension-metrics | An extension exposes metrics for Prometheus with LoopBack 4 | +| [extensions/pooling](https://github.com/strongloop/loopback-next/tree/master/extensions/pooling) | @loopback/pooling | Resource pooling service for LoopBack 4 | | [extensions/typeorm](https://github.com/strongloop/loopback-next/tree/master/extensions/typeorm) | @loopback/typeorm | Adds support for TypeORM in LoopBack | | [fixtures/mock-oauth2-provider](https://github.com/strongloop/loopback-next/tree/master/fixtures/mock-oauth2-provider) | @loopback/mock-oauth2-provider | An internal application to mock the OAuth2 authorization flow login with a social app like facebook, google etc | | [fixtures/tsdocs-monorepo](https://github.com/strongloop/loopback-next/tree/master/fixtures/tsdocs-monorepo) | _(private)_ | A monorepo for tsdocs testing | diff --git a/extensions/pooling/.npmrc b/extensions/pooling/.npmrc new file mode 100644 index 000000000000..34fbbbb3f3e4 --- /dev/null +++ b/extensions/pooling/.npmrc @@ -0,0 +1,2 @@ +package-lock=true +scripts-prepend-node-path=true diff --git a/extensions/pooling/LICENSE b/extensions/pooling/LICENSE new file mode 100644 index 000000000000..41ddc6ecf731 --- /dev/null +++ b/extensions/pooling/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) IBM Corp. 2020. +Node module: @loopback/pooling +This project is licensed under the MIT License, full text below. + +-------- + +MIT license + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/extensions/pooling/README.md b/extensions/pooling/README.md new file mode 100644 index 000000000000..f7a2cb4b8850 --- /dev/null +++ b/extensions/pooling/README.md @@ -0,0 +1,281 @@ +# @loopback/pooling + +This module contains a resource pooling service for LoopBack 4. + +## Overview + +Some resources can be expensive to create/start. For example, a datasource has +overhead to connect to the database. There will be performance penalty to use +`TRANSIENT` binding scope and creates a new instance per request. But it is not +feasible to be a singleton for some use cases, for example, each request may +have different security contexts. + +The `PoolingService` is a singleton service to maintain a pool of resources. +This pool service can be bound to different keys to represent multiple pools. +Each binding is a singleton so that the state stays the same for injections into +multiple instances for other artifacts. + +The pooling service observes life cycle events to start and stop. + +The extension is built with +[generic-pool](https://github.com/coopernurse/node-pool). + +![pooling.png](pooling.png) + +## Stability: ⚠️Experimental⚠️ + +> Experimental packages provide early access to advanced or experimental +> functionality to get community feedback. Such modules are published to npm +> using `0.x.y` versions. Their APIs and functionality may be subject to +> breaking changes in future releases. + +## Installation + +```sh +npm install --save @loopback/pooling +``` + +## Basic use + +Let's use the following class as an expensive resource that requires pooling for +performance. + +```ts +class ExpensiveResource { + static id = 1; + id: number; + status: string; + + constructor() { + this.status = 'created'; + this.id = ExpensiveResource.id++; + } +} +``` + +### Register a pooling service + +```ts +import {Application, ContextTags} from '@loopback/core'; +import {PoolingService, PoolServiceOptions} from '@loopback/pooling'; + +const app = new Application(); +const poolingServiceBinding = app.service(PoolingService, { + [ContextTags.KEY]: 'services.MyPoolingService', +}); +``` + +### Configure the pooling service + +A pooling service has to be configured first. We must provide a factory that +handles `create/destroy` of resource instances to be pooled. There are also +options to control the pooling behavior. + +```ts +app + .configure>(poolingServiceBinding.key) + .to({ + factory: { + async create() { + const res = new ExpensiveResource(); + return res; + }, + + async destroy(resource: ExpensiveResource) { + resource.status = 'destroyed'; + }, + }, + {max: 16}, // Pooling options + }); +``` + +See more details at +https://github.com/coopernurse/node-pool/blob/master/README.md#creating-a-pool. + +### Locate the pooling service + +```ts +const myPoolingService = await app.get( + 'services.MyPoolingService', +); +``` + +### Acquire a resource instance from the pool + +```ts +const res1 = await myPoolingService.acquire(); +// Do some work with res1 +``` + +### Release the resource instance back to the pool + +After the resource is used, it **MUST** be released back to the pool. + +```ts +myPoolingService.release(res1); +``` + +## Advanced use + +### Pooling life cycle methods + +We can optionally implement life cycle methods for the factory and the resource +to provide additional logic for pooling life cycle events: + +- create +- destroy +- acquire +- release + +#### Factory level methods + +```ts +const options: PoolingServiceOptions = { + factory: { + async create() { + const res = new ctor(); + res.status = status; + if (status === 'invalid') { + // Reset status so that the next try will be good + status = 'created'; + } + return res; + }, + + async destroy(resource: ExpensiveResource) { + resource.status = 'destroyed'; + }, + + async validate(resource) { + const result = resource.status === 'created'; + resource.status = 'validated'; + return result; + }, + + acquire(resource) { + resource.status = 'in-use-set-by-factory'; + }, + + release(resource) { + resource.status = 'idle-set-by-factory'; + }; + }, + poolOptions, +}; +``` + +#### Resource level methods + +The resource can also implement similar methods: + +```ts +class ExpensiveResourceWithHooks extends ExpensiveResource implements Poolable { + /** + * Life cycle method to be called by `create` + */ + start() { + // In real world, this may take a few seconds to start + this.status = 'started'; + } + + /** + * Life cycle method to be called by `destroy` + */ + stop() { + this.status = 'stopped'; + } + + acquire() { + this.status = 'in-use'; + } + + release() { + this.status = 'idle'; + } +} +``` + +If the resource implements life cycle methods, they will be invoked for the +pooled resource. + +- `start`: It will be called right after the resource is newly created by the + pool. This method should be used to initialize/start the resource. + +- `stop`: It will be called when the pool is stopping/draining. This method + should be used to stop the resource. + +- `acquire`: It will be called right after the resource is acquired from the + pool. If it fails, the resource will be destroyed from the pool. The method + should be used to set up the acquired resource. + +- `release`: It will be called right before the resource is released back to the + pool. If it fails, the resource will be destroyed from the pool. The method + should be used to clean up the resource to be released. + +### Pooled resource provider + +The pooled resource can be wrapped into a provider class to provide pooled +instances. + +```ts +import {PooledValue, PoolingService} from '@loopback/pooling'; + +class ExpensiveResourceProvider + implements Provider> { + constructor( + @inject(POOL_SERVICE) + private poolingService: PoolingService, + ) {} + + async value() { + return getPooledValue(this.poolingService); + } +} +``` + +Now we can bind the pooled resource provider: + +```ts +ctx.bind('resources.ExpensiveResource').toProvider(ExpensiveResourceProvider); +const res: PooledValue = await ctx.get( + 'resources.ExpensiveResource', +); +// Do some work with the acquired resource +// The resource must be released back to the pool +await res.release(); +``` + +### Use a binding as the pooled resource + +We can leverage a binding as the factory to create resources for a pool. + +```ts +const MY_RESOURCE = BindingKey.create('my-resource'); +ctx.bind(MY_RESOURCE).toClass(ExpensiveResource); +const factory = createPooledBindingFactory(MY_RESOURCE); +const poolBinding = createBindingFromClass(PoolingService, { + [ContextTags.KEY]: POOL_SERVICE, +}); +ctx.add(poolBinding); +ctx.configure>(poolBinding.key).to({ + factory, +}); +``` + +## Contributions + +- [Guidelines](https://github.com/strongloop/loopback-next/blob/master/docs/CONTRIBUTING.md) +- [Join the team](https://github.com/strongloop/loopback-next/issues/110) + +## Tests + +Run `npm test` from the root folder. + +## Contributors + +See +[all contributors](https://github.com/strongloop/loopback-next/graphs/contributors). + +## License + +MIT diff --git a/extensions/pooling/package-lock.json b/extensions/pooling/package-lock.json new file mode 100644 index 000000000000..895e4fc79aec --- /dev/null +++ b/extensions/pooling/package-lock.json @@ -0,0 +1,45 @@ +{ + "name": "@loopback/pooling", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/generic-pool": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@types/generic-pool/-/generic-pool-3.1.9.tgz", + "integrity": "sha512-IkXMs8fhV6+E4J8EWv8iL7mLvApcLLQUH4m1Rex3KCPRqT+Xya0DDHIeGAokk/6VXe9zg8oTWyr+FGyeuimEYQ==", + "requires": { + "@types/node": "*" + }, + "dependencies": { + "@types/node": { + "version": "14.0.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.18.tgz", + "integrity": "sha512-0Z3nS5acM0cIV4JPzrj9g/GH0Et5vmADWtip3YOXOp1NpOLU8V3KoZDc8ny9c1pe/YSYYzQkAWob6dyV/EWg4g==" + } + } + }, + "@types/node": { + "version": "10.17.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.26.tgz", + "integrity": "sha512-myMwkO2Cr82kirHY8uknNRHEVtn0wV3DTQfkrjx17jmkstDRZ24gNUdl8AHXVyVclTYI/bNjgTPTAWvWLqXqkw==", + "dev": true + }, + "generic-pool": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.7.1.tgz", + "integrity": "sha512-ug6DAZoNgWm6q5KhPFA+hzXfBLFQu5sTXxPpv44DmE0A2g+CiHoq9LTVdkXpZMkYVMoGw83F6W+WT0h0MFMK/w==" + }, + "tslib": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", + "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" + }, + "typescript": { + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.6.tgz", + "integrity": "sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw==", + "dev": true + } + } +} diff --git a/extensions/pooling/package.json b/extensions/pooling/package.json new file mode 100644 index 000000000000..a9f67db6f4da --- /dev/null +++ b/extensions/pooling/package.json @@ -0,0 +1,50 @@ +{ + "name": "@loopback/pooling", + "version": "0.0.1", + "description": "Resource pooling service for LoopBack 4", + "keywords": [ + "loopback-extension", + "loopback" + ], + "main": "dist/index.js", + "types": "dist/index.d.ts", + "engines": { + "node": ">=10" + }, + "scripts": { + "build": "lb-tsc", + "build:watch": "lb-tsc --watch", + "pretest": "npm run clean && npm run build", + "test": "lb-mocha \"dist/__tests__/**/*.js\"", + "clean": "lb-clean dist *.tsbuildinfo .eslintcache" + }, + "repository": { + "type": "git", + "url": "https://github.com/strongloop/loopback-next.git", + "directory": "extensions/pooling" + }, + "author": "IBM Corp.", + "license": "MIT", + "files": [ + "README.md", + "dist", + "src", + "!*/__tests__" + ], + "dependencies": { + "@loopback/core": "^2.9.1", + "@types/generic-pool": "^3.1.9", + "generic-pool": "^3.7.1", + "tslib": "^2.0.0" + }, + "devDependencies": { + "@loopback/build": "^6.1.0", + "@loopback/testlab": "^3.2.0", + "@types/node": "^10.17.26", + "typescript": "~3.9.5" + }, + "copyright.owner": "IBM Corp.", + "publishConfig": { + "access": "public" + } +} diff --git a/extensions/pooling/pooling.png b/extensions/pooling/pooling.png new file mode 100644 index 0000000000000000000000000000000000000000..961bf6882072e58cb00fc962386ac1600d167f0e GIT binary patch literal 161665 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 z∨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 literal 0 HcmV?d00001 diff --git a/extensions/pooling/src/__tests__/acceptance/README.md b/extensions/pooling/src/__tests__/acceptance/README.md new file mode 100644 index 000000000000..5bb177829768 --- /dev/null +++ b/extensions/pooling/src/__tests__/acceptance/README.md @@ -0,0 +1 @@ +# Acceptance tests diff --git a/extensions/pooling/src/__tests__/acceptance/pooling.acceptance.ts b/extensions/pooling/src/__tests__/acceptance/pooling.acceptance.ts new file mode 100644 index 000000000000..6382aee516a3 --- /dev/null +++ b/extensions/pooling/src/__tests__/acceptance/pooling.acceptance.ts @@ -0,0 +1,382 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/pooling +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import { + BindingKey, + Constructor, + Context, + ContextTags, + createBindingFromClass, + inject, + Provider, +} from '@loopback/core'; +import {expect} from '@loopback/testlab'; +import {once} from 'events'; +import {Options} from 'generic-pool'; +import { + createPooledBindingFactory, + PoolingService, + PoolingServiceOptions, +} from '../../'; +import { + getPooledValue, + Poolable, + PooledValue, + PoolFactory, +} from '../../pooling'; + +describe('Resource pool', () => { + const POOLING_SERVICE = BindingKey.create>( + 'services.pooling', + ); + let ctx: Context; + + beforeEach(givenContext); + + beforeEach('Reset resource id', () => { + ExpensiveResource.id = 1; + }); + + it('creates a resource pool', async () => { + const poolService = await givenPoolService(); + expect(poolService.pool.size).to.eql(0); + }); + + it('creates a resource pool as singleton', async () => { + const poolService = await givenPoolService(); + const result = await ctx.get(POOLING_SERVICE); + expect(result).to.be.exactly(poolService); + }); + + it('acquires/releases a resource from the pool', async () => { + const poolService = await givenPoolService(); + poolService.start(); + const res = await poolService.acquire(); + expect(res.status).to.eql('created'); + expect(poolService.pool.borrowed).to.eql(1); + await poolService.release(res); + expect(poolService.pool.borrowed).to.eql(0); + }); + + it('runs a task', async () => { + const poolService = await givenPoolService(); + await poolService.run(resource => { + resource.status = 'running'; + }); + expect(poolService.pool.borrowed).to.eql(0); + }); + + it('runs a task that throws an error', async () => { + const poolService = await givenPoolService(); + let acquired: ExpensiveResource; + await expect( + poolService.run(resource => { + acquired = resource; + throw new Error('fail'); + }), + ).to.be.rejectedWith(/fail/); + expect(acquired!).to.be.instanceOf(ExpensiveResource); + expect(poolService.pool.borrowed).to.eql(0); + expect(acquired!.status).to.eql('destroyed'); + expect(poolService.pool.isBorrowedResource(acquired!)).to.be.false(); + }); + + it('honors poolOptions.min', async () => { + const poolService = await givenPoolService({min: 2, max: 5}); + expect(poolService.pool.size).to.eql(0); + poolService.start(); + const res = await poolService.acquire(); + expect(res.status).to.eql('created'); + expect(poolService.pool.available).to.eql(1); + expect(poolService.pool.borrowed).to.eql(1); + expect(poolService.pool.size).to.eql(2); + await poolService.release(res); + expect(poolService.pool.available).to.eql(2); + expect(poolService.pool.borrowed).to.eql(0); + expect(poolService.pool.size).to.eql(2); + }); + + it('honors poolOptions.max', async () => { + const poolService = await givenPoolService({ + min: 1, + max: 2, + acquireTimeoutMillis: 100, + }); + // 1st + const res1 = await poolService.acquire(); + expect(poolService.pool.borrowed).to.eql(1); + // 2nd + await poolService.acquire(); + expect(poolService.pool.available).to.eql(0); + expect(poolService.pool.borrowed).to.eql(2); + expect(poolService.pool.size).to.eql(2); + // 3rd has to wait + await expect(poolService.acquire()).to.be.rejectedWith( + /ResourceRequest timed out/, + ); + await poolService.release(res1); + expect(poolService.pool.available).to.eql(1); + await poolService.acquire(); + expect(poolService.pool.available).to.eql(0); + expect(poolService.pool.borrowed).to.eql(2); + expect(poolService.pool.size).to.eql(2); + }); + + it('destroys a resource from the pool', async () => { + const poolService = await givenPoolService(); + const res = await poolService.acquire(); + expect(res.status).to.eql('created'); + await poolService.release(res); + expect(res.status).to.eql('created'); + await poolService.stop(); + expect(res.status).to.eql('destroyed'); + }); + + it('validates a resource during acquire', async () => { + const poolService = await givenPoolService({ + testOnBorrow: true, + }); + const res = await poolService.acquire(); + expect(res.status).to.eql('validated'); + }); + + it('fails a resource during acquire', async () => { + const poolService = await givenPoolService( + { + testOnBorrow: true, + }, + ExpensiveResource, + 'invalid', + ); + const res = await poolService.acquire(); + expect(res.status).to.eql('validated'); + // The first creation fails and generic-pool calls `create` again + expect(res.id).to.eql(2); + }); + + it('validates a resource during release', async () => { + const poolService = await givenPoolService({ + testOnReturn: true, + }); + const res = await poolService.acquire(); + expect(res.status).to.eql('created'); + res.status = 'invalid'; + await poolService.release(res); + expect(poolService.pool.isBorrowedResource(res)).to.be.false(); + }); + + it('invokes resource-level acquire/release methods', async () => { + const poolService = await givenPoolService({}, ExpensiveResourceWithHooks); + poolService.start(); + const res = await poolService.acquire(); + expect(res.status).to.eql('in-use'); + await poolService.release(res); + expect(res.status).to.eql('idle'); + }); + + it('invokes factory-level acquire/release methods', async () => { + setupPoolingService({}, ExpensiveResourceWithHooks); + const factory = (await ctx.getConfig< + PoolingServiceOptions + >(POOLING_SERVICE))!.factory as PoolFactory; + factory.acquire = (resource: ExpensiveResource) => { + resource.status = 'in-use-set-by-factory'; + }; + factory.release = (resource: ExpensiveResource) => { + resource.status = 'idle-set-by-factory'; + }; + const poolService = await ctx.get(POOLING_SERVICE); + poolService.start(); + const res = await poolService.acquire(); + expect(res.status).to.eql('in-use-set-by-factory'); + await poolService.release(res); + expect(res.status).to.eql('idle-set-by-factory'); + }); + + it('supports pooled binding factory', async () => { + const poolService = await givenPoolServiceForBinding(); + const res = await poolService.acquire(); + expect(res.toJSON()).to.eql({status: 'started', id: 1}); + await poolService.release(res); + expect(res.toJSON()).to.eql({status: 'started', id: 1}); + await poolService.stop(); + expect(res.toJSON()).to.eql({status: 'stopped', id: 1}); + }); + + it('releases pooled binding on context.close', async () => { + const poolService = await givenPoolServiceForBinding(); + const reqCtx = new Context(ctx, 'req'); + const res = await poolService.acquire(); + reqCtx.once('close', () => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + poolService.release(res); + }); + const requestClosed = once(reqCtx, 'close'); + reqCtx.close(); + reqCtx.emit('close'); + await requestClosed; + expect(poolService.pool.isBorrowedResource(res)).to.be.false(); + }); + + it('allows injection of pooling service', async () => { + await givenPoolService(); + ctx + .bind('resources.ExpensiveResource') + .toProvider(ExpensiveResourceProvider); + const res1: PooledValue = await ctx.get( + 'resources.ExpensiveResource', + ); + expect(res1.value.toJSON()).to.eql({status: 'created', id: 1}); + const res2: PooledValue = await ctx.get( + 'resources.ExpensiveResource', + ); + expect(res2.value.toJSON()).to.eql({status: 'created', id: 2}); + await res1.release(); + const res3: PooledValue = await ctx.get( + 'resources.ExpensiveResource', + ); + expect(res3.value.toJSON()).to.eql({status: 'created', id: 1}); + }); + + function givenContext() { + ctx = new Context('test'); + } + + function givenPoolService( + poolOptions: Options = {}, + ctor: Constructor = ExpensiveResource, + initialStatus = 'created', + ) { + setupPoolingService(poolOptions, ctor, initialStatus); + return ctx.get(POOLING_SERVICE); + } + + function givenPoolServiceForBinding() { + const MY_RESOURCE = BindingKey.create('my-resource'); + ctx.bind(MY_RESOURCE).toClass(ExpensiveResource); + const factory = createPooledBindingFactory(MY_RESOURCE); + const poolBinding = createBindingFromClass(PoolingService, { + [ContextTags.KEY]: POOLING_SERVICE, + }); + ctx.add(poolBinding); + ctx + .configure>(poolBinding.key) + .to({ + factory, + }); + return ctx.get(POOLING_SERVICE); + } + + /** + * This simulates a resource that is expensive to create/start. For example, + * a datasource has overhead to connect to the database. There will be performance + * penalty to use `TRANSIENT` scope and creates a new instance per request. + * But it is not feasible to be a singleton for some use cases, for example, + * each request may have different security contexts. + */ + class ExpensiveResource implements Poolable { + static id = 1; + id: number; + status: string; + + constructor() { + this.status = 'created'; + this.id = ExpensiveResource.id++; + } + + toJSON() { + return {id: this.id, status: this.status}; + } + + /** + * Life cycle method to be called by `create` + */ + start() { + // In real world, this may take a few seconds to start + this.status = 'started'; + } + + /** + * Life cycle method to be called by `destroy` + */ + stop() { + this.status = 'stopped'; + } + } + + /** + * An expensive resource that implements `acquire` and `release` hooks + */ + class ExpensiveResourceWithHooks extends ExpensiveResource + implements Poolable { + acquire() { + this.status = 'in-use'; + } + + release() { + this.status = 'idle'; + } + } + + /** + * Wrap the expensive resource as a LoopBack binding provider + */ + class ExpensiveResourceProvider + implements Provider> { + constructor( + @inject(POOLING_SERVICE) + private poolingService: PoolingService, + ) {} + + async value() { + return getPooledValue(this.poolingService); + } + } + + /** + * Set up a pooling service + * @param poolOptions - Pool options + * @param ctor - Resource class + * @param status - Initial status + */ + function setupPoolingService( + poolOptions: Options = {}, + ctor: Constructor = ExpensiveResource, + status = 'created', + ) { + ExpensiveResource.id = 1; + const poolBinding = createBindingFromClass(PoolingService, { + [ContextTags.KEY]: POOLING_SERVICE, + }); + ctx.add(poolBinding); + const options: PoolingServiceOptions = { + factory: { + async create() { + const res = new ctor(); + res.status = status; + if (status === 'invalid') { + // Reset status so that the next try will be good + status = 'created'; + } + return res; + }, + + async destroy(resource: ExpensiveResource) { + resource.status = 'destroyed'; + }, + + async validate(resource) { + const result = resource.status === 'created'; + resource.status = 'validated'; + return result; + }, + }, + poolOptions, + }; + ctx + .configure>(poolBinding.key) + .to(options); + } +}); diff --git a/extensions/pooling/src/__tests__/integration/README.md b/extensions/pooling/src/__tests__/integration/README.md new file mode 100644 index 000000000000..0ca287e97688 --- /dev/null +++ b/extensions/pooling/src/__tests__/integration/README.md @@ -0,0 +1 @@ +# Integration tests diff --git a/extensions/pooling/src/__tests__/unit/README.md b/extensions/pooling/src/__tests__/unit/README.md new file mode 100644 index 000000000000..a0291f0699f9 --- /dev/null +++ b/extensions/pooling/src/__tests__/unit/README.md @@ -0,0 +1 @@ +# Unit tests diff --git a/extensions/pooling/src/index.ts b/extensions/pooling/src/index.ts new file mode 100644 index 000000000000..92af3c4593ee --- /dev/null +++ b/extensions/pooling/src/index.ts @@ -0,0 +1,6 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/pooling +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +export * from './pooling'; diff --git a/extensions/pooling/src/pooling.ts b/extensions/pooling/src/pooling.ts new file mode 100644 index 000000000000..0047bee02dcc --- /dev/null +++ b/extensions/pooling/src/pooling.ts @@ -0,0 +1,322 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/pooling +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import { + bind, + BindingAddress, + BindingScope, + config, + Context, + inject, + LifeCycleObserver, + ValueOrPromise, +} from '@loopback/core'; +import debugFactory from 'debug'; +import {createPool, Factory, Options, Pool} from 'generic-pool'; + +const debug = debugFactory('loopback:pooling'); + +/** + * Factory for the pooling service + */ +export interface PoolFactory extends Factory { + /** + * To be called right after the resource is acquired from the pool. If it + * fails, the resource will be destroyed from the pool. The method should be + * used to set up the acquired resource. + */ + acquire?(resource: T): ValueOrPromise; + /** + * To be called right before the resource is released to the pool. If it + * fails, the resource will be destroyed from the pool. This method should be + * used to clean up the resource to be returned. + */ + release?(resource: T): ValueOrPromise; +} + +/** + * Options to configure a resource pool + */ +export interface PoolingServiceOptions { + /** + * A factory to create/destroy/validate resources for the pool or a function + * to create a factory for the given context + */ + factory: PoolFactory | ((ctx: Context) => PoolFactory); + /** + * Options for the generic pool + */ + poolOptions?: Options; +} + +/** + * Life cycle methods that a poolable resource can optionally implement so that + * they can be triggered by the pooling service + */ +export interface Poolable extends LifeCycleObserver { + /** + * To be called right after the resource is acquired from the pool. If it + * fails, the resource will be destroyed from the pool. The method should be + * used to set up the acquired resource. + */ + acquire?(): ValueOrPromise; + /** + * To be called right before the resource is released to the pool. If it + * fails, the resource will be destroyed from the pool. This method should be + * used to clean up the resource to be returned. + */ + release?(): ValueOrPromise; +} + +/** + * Pooled resource instance + */ +export interface PooledValue { + /** + * The resource pool + */ + pool: Pool; + /** + * Acquired value from the pool + */ + value: T; + /** + * The function to release the acquired value back to the pool + */ + release(): Promise; +} + +/** + * Acquire a resource from the pooling service or pool + * @param poolingService - Pooling service or pool + */ +export async function getPooledValue( + poolingService: PoolingService | Pool, +): Promise> { + const value = await poolingService.acquire(); + const pool = + poolingService instanceof PoolingService + ? poolingService.pool + : poolingService; + return { + pool, + value, + async release() { + return poolingService.release(value); + }, + }; +} + +/** + * A singleton service to maintain a pool of resources. This pool service can + * be bound to different keys to represent multiple pools. Each binding is a + * singleton so that the state stays the same for injections into multiple + * instances for other artifacts. + * + * @remarks + * + * Some resources can be expensive to create/start. For example, a datasource + * has overhead to connect to the database. There will be performance penalty + * to use `TRANSIENT` scope and creates a new instance per request. But it is + * not feasible to be a singleton for some use cases, for example, each request + * may have different security contexts. + * + * The pool service observes life cycle events to start and stop. + */ +@bind({scope: BindingScope.SINGLETON}) +export class PoolingService implements LifeCycleObserver { + private readonly factory: PoolFactory; + /** + * The resource pool + */ + readonly pool: Pool; + + constructor( + @inject.context() readonly context: Context, + @config() private options: PoolingServiceOptions, + ) { + let factory = this.options.factory; + if (typeof factory === 'function') { + factory = factory(this.context); + } + this.factory = factory; + this.options = {...options, factory}; + this.pool = createPool(factory, { + max: 8, // Default to 8 instances + ...this.options.poolOptions, + // Disable `autostart` so that it follows LoopBack application life cycles + autostart: false, + }); + } + + /** + * Start the pool + */ + start() { + if (this.options.poolOptions?.autostart !== false) { + debug('Starting pool for context %s', this.context.name); + this.pool.start(); + } + } + + /** + * Stop the pool + */ + async stop() { + debug('Stopping pool for context %s', this.context.name); + if (this.pool == null) return; + await this.pool.drain(); + await this.pool.clear(); + } + + /** + * Acquire a new instance + */ + async acquire() { + debug( + 'Acquiring a resource from the pool in context %s', + this.context.name, + ); + const resource = await this.pool.acquire(); + + try { + // Try factory-level acquire hook first + if (this.factory.acquire) { + await this.factory.acquire(resource); + } else { + // Fall back to resource-level acquire hook + await invokePoolableMethod(resource, 'acquire'); + } + } catch (err) { + await this.pool.destroy(resource); + throw err; + } + debug( + 'Resource acquired from the pool in context %s', + this.context.name, + resource, + ); + return resource; + } + + /** + * Release the resource back to the pool. + * @param resource - Resource instance to be returned back to the pool + */ + async release(resource: T) { + debug( + 'Releasing a resource from the pool in context %s', + this.context.name, + resource, + ); + try { + // Try factory-level acquire hook first + if (this.factory.release) { + await this.factory.release(resource); + } else { + await invokePoolableMethod(resource, 'release'); + } + await this.pool.release(resource); + } catch (err) { + await this.pool.destroy(resource); + throw err; + } + debug( + 'Resource released to the pool in context %s', + this.context.name, + resource, + ); + } + + /** + * Destroy a resource from the pool + * @param resource - Resource instance to be destroyed + */ + async destroy(resource: T) { + debug( + 'Destroying a resource from the pool in context %s', + this.context.name, + resource, + ); + await this.pool.destroy(resource); + debug('Resource destroyed in context %s', this.context.name, resource); + } + + /** + * Run the task with an acquired resource from the pool. If task is completed + * successfully, the resource is returned to the pool. Otherwise, the + * resource is destroyed. + * + * @param task - A function that accepts a resource and returns a Promise. + */ + async run(task: (resource: T) => ValueOrPromise) { + const resource = await this.acquire(); + try { + await task(resource); + } catch (err) { + await this.destroy(resource); + throw err; + } + await this.release(resource); + } +} + +/** + * Create a function to return a pooled binding factory + * @param bindingAddress - Binding address + */ +export function createPooledBindingFactory( + bindingAddress: BindingAddress, +): (context: Context) => PoolFactory { + const bindingPoolFactory = (context: Context): PoolFactory => + new PooledBindingFactory(context, bindingAddress); + return bindingPoolFactory; +} + +/** + * Factory for pooled binding values. This is specialized factory to create + * new resources from the binding. If the bound value observes life cycle events, + * the `start` method is called by `create` and the `stop` method is called + * by `destroy`. + */ +class PooledBindingFactory implements PoolFactory { + constructor( + private readonly context: Context, + private readonly bindingAddress: BindingAddress, + ) {} + + async create() { + debug( + 'Creating a resource for %s#%s', + this.context.name, + this.bindingAddress, + ); + const value = await this.context.get(this.bindingAddress); + await invokePoolableMethod(value, 'start'); + return value; + } + async destroy(value: T) { + debug( + 'Destroying a resource for %s#%s', + this.context.name, + this.bindingAddress, + value, + ); + await invokePoolableMethod(value, 'stop'); + } +} + +/** + * Invoke a hook method on the given resource + * @param resource - Resource instance + * @param method - Hook method name + */ +function invokePoolableMethod(resource: Poolable, method: keyof Poolable) { + if (typeof resource[method] === 'function') { + debug('Invoking hook method %s on resource', method, resource); + return resource[method]!(); + } + debug('Hook method: %s does not exist on resource', method, resource); +} diff --git a/extensions/pooling/tsconfig.json b/extensions/pooling/tsconfig.json new file mode 100644 index 000000000000..9414a59a5470 --- /dev/null +++ b/extensions/pooling/tsconfig.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json.schemastore.org/tsconfig", + "extends": "@loopback/build/config/tsconfig.common.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "composite": true + }, + "include": [ + "src" + ], + "references": [ + { + "path": "../../packages/core/tsconfig.json" + }, + { + "path": "../../packages/testlab/tsconfig.json" + } + ] +} diff --git a/tsconfig.json b/tsconfig.json index e3536a017c36..9335eaa67e3b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -103,6 +103,9 @@ { "path": "extensions/metrics/tsconfig.json" }, + { + "path": "extensions/pooling/tsconfig.json" + }, { "path": "extensions/typeorm/tsconfig.json" },