Skip to content

Commit 0e48956

Browse files
authored
feat: enable asyncLocalStorage by default (#251)
koajs/koa#1721
1 parent f25a1c5 commit 0e48956

14 files changed

Lines changed: 238 additions & 26 deletions

File tree

.github/workflows/nodejs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ jobs:
2222
strategy:
2323
fail-fast: false
2424
matrix:
25-
node-version: [8, 10, 12, 14, 16]
25+
node-version: [8, 10, 12, 14, 16, 18]
2626
os: [ubuntu-latest, windows-latest, macos-latest]
2727

2828
steps:

benchmark/middleware/README.md

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,151 @@ Transfer/sec: 6.01MB
2929
```
3030

3131
![](https://user-images.githubusercontent.com/985607/32474444-2f4b7cde-c332-11e7-923f-8dfb709a7a24.png)
32+
33+
### 2022-12-06
34+
35+
Enable asyncLocalStorage
36+
37+
```
38+
v18.12.1
39+
server started at 7001
40+
------- generator middleware -------
41+
["generator middleware #1","generator middleware #2","generator middleware #3","generator middleware #4","generator middleware #5","generator middleware #6","generator middleware #7","generator middleware #8","generator middleware #9","generator middleware #10","generator middleware #11","generator middleware #12","generator middleware #13","generator middleware #14","generator middleware #15","generator middleware #16","generator middleware #17","generator middleware #18","generator middleware #19","generator middleware #20"]
42+
Running 10s test @ http://127.0.0.1:7001/generator
43+
8 threads and 50 connections
44+
Thread Stats Avg Stdev Max +/- Stdev
45+
Latency 2.42ms 584.46us 12.20ms 94.43%
46+
Req/Sec 2.50k 601.24 18.36k 97.63%
47+
198950 requests in 10.10s, 153.00MB read
48+
Requests/sec: 19699.09
49+
Transfer/sec: 15.15MB
50+
------- async middleware -------
51+
["async middleware #1","async middleware #2","async middleware #3","async middleware #4","async middleware #5","async middleware #6","async middleware #7","async middleware #8","async middleware #9","async middleware #10","async middleware #11","async middleware #12","async middleware #13","async middleware #14","async middleware #15","async middleware #16","async middleware #17","async middleware #18","async middleware #19","async middleware #20"]
52+
Running 10s test @ http://127.0.0.1:7001/async
53+
8 threads and 50 connections
54+
Thread Stats Avg Stdev Max +/- Stdev
55+
Latency 1.97ms 1.58ms 43.26ms 96.10%
56+
Req/Sec 3.23k 0.86k 24.84k 95.38%
57+
257959 requests in 10.10s, 179.02MB read
58+
Requests/sec: 25533.50
59+
Transfer/sec: 17.72MB
60+
61+
v16.18.1
62+
server started at 7001
63+
------- generator middleware -------
64+
["generator middleware #1","generator middleware #2","generator middleware #3","generator middleware #4","generator middleware #5","generator middleware #6","generator middleware #7","generator middleware #8","generator middleware #9","generator middleware #10","generator middleware #11","generator middleware #12","generator middleware #13","generator middleware #14","generator middleware #15","generator middleware #16","generator middleware #17","generator middleware #18","generator middleware #19","generator middleware #20"]
65+
Running 10s test @ http://127.0.0.1:7001/generator
66+
8 threads and 50 connections
67+
Thread Stats Avg Stdev Max +/- Stdev
68+
Latency 2.53ms 1.21ms 36.34ms 93.77%
69+
Req/Sec 2.44k 372.60 7.16k 91.78%
70+
194905 requests in 10.10s, 149.87MB read
71+
Requests/sec: 19288.29
72+
Transfer/sec: 14.83MB
73+
------- async middleware -------
74+
["async middleware #1","async middleware #2","async middleware #3","async middleware #4","async middleware #5","async middleware #6","async middleware #7","async middleware #8","async middleware #9","async middleware #10","async middleware #11","async middleware #12","async middleware #13","async middleware #14","async middleware #15","async middleware #16","async middleware #17","async middleware #18","async middleware #19","async middleware #20"]
75+
Running 10s test @ http://127.0.0.1:7001/async
76+
8 threads and 50 connections
77+
Thread Stats Avg Stdev Max +/- Stdev
78+
Latency 1.76ms 405.33us 10.08ms 89.00%
79+
Req/Sec 3.43k 264.17 5.94k 85.09%
80+
275242 requests in 10.10s, 191.08MB read
81+
Requests/sec: 27242.76
82+
Transfer/sec: 18.91MB
83+
84+
v14.21.1
85+
server started at 7001
86+
------- generator middleware -------
87+
["generator middleware #1","generator middleware #2","generator middleware #3","generator middleware #4","generator middleware #5","generator middleware #6","generator middleware #7","generator middleware #8","generator middleware #9","generator middleware #10","generator middleware #11","generator middleware #12","generator middleware #13","generator middleware #14","generator middleware #15","generator middleware #16","generator middleware #17","generator middleware #18","generator middleware #19","generator middleware #20"]
88+
Running 10s test @ http://127.0.0.1:7001/generator
89+
8 threads and 50 connections
90+
Thread Stats Avg Stdev Max +/- Stdev
91+
Latency 4.16ms 2.46ms 39.16ms 91.43%
92+
Req/Sec 1.55k 349.54 1.92k 84.88%
93+
123307 requests in 10.04s, 94.43MB read
94+
Requests/sec: 12280.55
95+
Transfer/sec: 9.40MB
96+
------- async middleware -------
97+
["async middleware #1","async middleware #2","async middleware #3","async middleware #4","async middleware #5","async middleware #6","async middleware #7","async middleware #8","async middleware #9","async middleware #10","async middleware #11","async middleware #12","async middleware #13","async middleware #14","async middleware #15","async middleware #16","async middleware #17","async middleware #18","async middleware #19","async middleware #20"]
98+
Running 10s test @ http://127.0.0.1:7001/async
99+
8 threads and 50 connections
100+
Thread Stats Avg Stdev Max +/- Stdev
101+
Latency 2.88ms 1.38ms 24.43ms 93.97%
102+
Req/Sec 2.19k 283.92 2.94k 85.25%
103+
174192 requests in 10.01s, 120.54MB read
104+
Requests/sec: 17395.81
105+
Transfer/sec: 12.04MB
106+
107+
v12.22.12
108+
server started at 7001
109+
------- generator middleware -------
110+
["generator middleware #1","generator middleware #2","generator middleware #3","generator middleware #4","generator middleware #5","generator middleware #6","generator middleware #7","generator middleware #8","generator middleware #9","generator middleware #10","generator middleware #11","generator middleware #12","generator middleware #13","generator middleware #14","generator middleware #15","generator middleware #16","generator middleware #17","generator middleware #18","generator middleware #19","generator middleware #20"]
111+
Running 10s test @ http://127.0.0.1:7001/generator
112+
8 threads and 50 connections
113+
Thread Stats Avg Stdev Max +/- Stdev
114+
Latency 11.04ms 9.39ms 75.99ms 91.60%
115+
Req/Sec 638.74 167.21 0.90k 63.25%
116+
50990 requests in 10.04s, 38.43MB read
117+
Requests/sec: 5078.85
118+
Transfer/sec: 3.83MB
119+
------- async middleware -------
120+
["async middleware #1","async middleware #2","async middleware #3","async middleware #4","async middleware #5","async middleware #6","async middleware #7","async middleware #8","async middleware #9","async middleware #10","async middleware #11","async middleware #12","async middleware #13","async middleware #14","async middleware #15","async middleware #16","async middleware #17","async middleware #18","async middleware #19","async middleware #20"]
121+
Running 10s test @ http://127.0.0.1:7001/async
122+
8 threads and 50 connections
123+
Thread Stats Avg Stdev Max +/- Stdev
124+
Latency 7.45ms 7.68ms 69.86ms 93.04%
125+
Req/Sec 1.00k 195.80 1.26k 74.50%
126+
80059 requests in 10.03s, 54.83MB read
127+
Requests/sec: 7981.39
128+
Transfer/sec: 5.47MB
129+
```
130+
131+
Disable asyncLocalStorage
132+
133+
```
134+
v18.12.1
135+
server started at 7001
136+
------- generator middleware -------
137+
["generator middleware #1","generator middleware #2","generator middleware #3","generator middleware #4","generator middleware #5","generator middleware #6","generator middleware #7","generator middleware #8","generator middleware #9","generator middleware #10","generator middleware #11","generator middleware #12","generator middleware #13","generator middleware #14","generator middleware #15","generator middleware #16","generator middleware #17","generator middleware #18","generator middleware #19","generator middleware #20"]
138+
Running 10s test @ http://127.0.0.1:7001/generator
139+
8 threads and 50 connections
140+
Thread Stats Avg Stdev Max +/- Stdev
141+
Latency 2.22ms 1.18ms 38.70ms 93.88%
142+
Req/Sec 2.79k 361.32 3.27k 85.50%
143+
222356 requests in 10.01s, 171.13MB read
144+
Requests/sec: 22208.19
145+
Transfer/sec: 17.09MB
146+
------- async middleware -------
147+
["async middleware #1","async middleware #2","async middleware #3","async middleware #4","async middleware #5","async middleware #6","async middleware #7","async middleware #8","async middleware #9","async middleware #10","async middleware #11","async middleware #12","async middleware #13","async middleware #14","async middleware #15","async middleware #16","async middleware #17","async middleware #18","async middleware #19","async middleware #20"]
148+
Running 10s test @ http://127.0.0.1:7001/async
149+
8 threads and 50 connections
150+
Thread Stats Avg Stdev Max +/- Stdev
151+
Latency 1.71ms 0.98ms 33.63ms 94.19%
152+
Req/Sec 3.60k 511.38 10.65k 91.28%
153+
288119 requests in 10.10s, 200.07MB read
154+
Requests/sec: 28513.37
155+
Transfer/sec: 19.80MB
156+
157+
v8.17.0
158+
server started at 7001
159+
------- generator middleware -------
160+
["generator middleware #1","generator middleware #2","generator middleware #3","generator middleware #4","generator middleware #5","generator middleware #6","generator middleware #7","generator middleware #8","generator middleware #9","generator middleware #10","generator middleware #11","generator middleware #12","generator middleware #13","generator middleware #14","generator middleware #15","generator middleware #16","generator middleware #17","generator middleware #18","generator middleware #19","generator middleware #20"]
161+
Running 10s test @ http://127.0.0.1:7001/generator
162+
8 threads and 50 connections
163+
Thread Stats Avg Stdev Max +/- Stdev
164+
Latency 4.10ms 2.11ms 29.73ms 93.47%
165+
Req/Sec 1.53k 241.05 3.74k 84.43%
166+
122526 requests in 10.11s, 91.14MB read
167+
Requests/sec: 12123.93
168+
Transfer/sec: 9.02MB
169+
------- async middleware -------
170+
["async middleware #1","async middleware #2","async middleware #3","async middleware #4","async middleware #5","async middleware #6","async middleware #7","async middleware #8","async middleware #9","async middleware #10","async middleware #11","async middleware #12","async middleware #13","async middleware #14","async middleware #15","async middleware #16","async middleware #17","async middleware #18","async middleware #19","async middleware #20"]
171+
Running 10s test @ http://127.0.0.1:7001/async
172+
8 threads and 50 connections
173+
Thread Stats Avg Stdev Max +/- Stdev
174+
Latency 3.66ms 4.33ms 86.07ms 96.97%
175+
Req/Sec 1.89k 296.76 2.24k 86.50%
176+
151007 requests in 10.04s, 101.04MB read
177+
Requests/sec: 15046.06
178+
Transfer/sec: 10.07MB
179+
```

lib/egg.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const utils = require('./utils');
1212
const Router = require('@eggjs/router').EggRouter;
1313
const Timing = require('./utils/timing');
1414
const Lifecycle = require('./lifecycle');
15+
const enableAsyncLocalStorage = !!require('async_hooks').AsyncLocalStorage;
1516

1617
const DEPRECATE = Symbol('EggCore#deprecate');
1718
const ROUTER = Symbol('EggCore#router');
@@ -37,7 +38,9 @@ class EggCore extends KoaApplication {
3738
assert(fs.statSync(options.baseDir).isDirectory(), `Directory ${options.baseDir} is not a directory`);
3839
assert(options.type === 'application' || options.type === 'agent', 'options.type should be application or agent');
3940

40-
super();
41+
// enable asyncLocalStorage by default
42+
// https://github.com/koajs/koa/pull/1721
43+
super({ asyncLocalStorage: enableAsyncLocalStorage });
4144

4245
this.timing = new Timing();
4346

lib/lifecycle.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ const getReady = require('get-ready');
66
const { Ready } = require('ready-callback');
77
const { EventEmitter } = require('events');
88
const debug = require('debug')('egg-core:lifecycle');
9+
const utils = require('./utils');
10+
911
const INIT = Symbol('Lifycycle#init');
1012
const INIT_READY = Symbol('Lifecycle#initReady');
1113
const DELEGATE_READY_EVENT = Symbol('Lifecycle#delegateReadyEvent');
@@ -15,8 +17,6 @@ const IS_CLOSED = Symbol('Lifecycle#isClosed');
1517
const BOOT_HOOKS = Symbol('Lifecycle#bootHooks');
1618
const BOOTS = Symbol('Lifecycle#boots');
1719

18-
const utils = require('./utils');
19-
2020
class Lifecycle extends EventEmitter {
2121

2222
/**

lib/utils/timing.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ const assert = require('assert');
44
const MAP = Symbol('Timing#map');
55
const LIST = Symbol('Timing#list');
66

7-
87
class Timing {
98

109
constructor() {

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
},
3434
"ci": {
3535
"type": "github",
36-
"version": "8, 10, 12, 14, 16",
36+
"version": "8, 10, 12, 14, 16, 18",
3737
"afterScript": "after_success:\n - npminstall codecov && codecov --disable=gcov",
3838
"license": {
3939
"year": 2016
@@ -73,7 +73,7 @@
7373
"get-ready": "^2.0.1",
7474
"globby": "^10.0.2",
7575
"is-type-of": "^1.2.1",
76-
"koa": "^2.7.0",
76+
"koa": "^2.14.0",
7777
"koa-convert": "^1.2.0",
7878
"node-homedir": "^1.1.1",
7979
"ready-callback": "^2.1.0",

test/asyncLocalStorage.test.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
'use strict';
2+
3+
const assert = require('assert');
4+
const path = require('path');
5+
const request = require('supertest');
6+
const enableAsyncLocalStorage = !!require('async_hooks').AsyncLocalStorage;
7+
const EggApplication = require('./fixtures/egg').Application;
8+
9+
describe('test/asyncLocalStorage.test.js', () => {
10+
let app;
11+
before(() => {
12+
app = new EggApplication({
13+
baseDir: path.join(__dirname, 'fixtures/session-cache-app'),
14+
type: 'application',
15+
});
16+
app.loader.loadAll();
17+
});
18+
19+
it('should start app with asyncLocalStorage = true by default', async () => {
20+
assert(app.currentContext === undefined);
21+
const res = await request(app.callback())
22+
.get('/');
23+
assert(res.status === 200);
24+
console.log(res.body);
25+
assert(res.body.sessionId === 'mock-session-id-123');
26+
if (enableAsyncLocalStorage) {
27+
assert(res.body.traceId);
28+
}
29+
assert(app.currentContext === undefined);
30+
});
31+
});

test/egg.test.js

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,7 @@ describe('test/egg.test.js', () => {
466466
after(() => app && app.close());
467467

468468
describe('app', () => {
469-
it('should get timing', function* () {
469+
it('should get timing', async () => {
470470
app = utils.createApp('timing');
471471
app.loader.loadPlugin();
472472
app.loader.loadConfig();
@@ -477,10 +477,10 @@ describe('test/egg.test.js', () => {
477477
app.loader.loadMiddleware();
478478
app.loader.loadController();
479479
app.loader.loadRouter();
480-
yield app.ready();
480+
await app.ready();
481481

482482
const json = app.timing.toJSON();
483-
assert(json.length === 27);
483+
assert(json.length === 28);
484484

485485
assert(json[1].name === 'Application Start');
486486
assert(json[1].end - json[1].start === json[1].duration);
@@ -500,30 +500,32 @@ describe('test/egg.test.js', () => {
500500

501501
// loadCustomApp
502502
assert(json[11].name === 'Load app.js');
503-
assert(json[12].name === 'Require(6) app.js');
504-
assert(json[13].name === 'Before Start in app.js:6:9');
505-
assert(json[14].name === 'Before Start in mock Block');
506-
assert(json[15].name === 'readyCallback in mockReadyCallbackWithoutFunction');
503+
// test/fixtures/egg/node_modules/session/app.js
504+
assert(json[12].name.startsWith('Require(6) '));
505+
assert(json[13].name === 'Require(7) app.js');
506+
assert(json[14].name === 'Before Start in app.js:6:9');
507+
assert(json[15].name === 'Before Start in mock Block');
508+
assert(json[16].name === 'readyCallback in mockReadyCallbackWithoutFunction');
507509

508-
assert(json[16].name === 'Load "proxy" to Context');
509-
assert(json[17].name === 'Load Controller');
510-
assert(json[18].name === 'Load "controller" to Application');
510+
assert(json[17].name === 'Load "proxy" to Context');
511+
assert(json[18].name === 'Load Controller');
512+
assert(json[19].name === 'Load "controller" to Application');
511513

512514
// loadService
513-
assert(json[19].name === 'Load Service');
514-
assert(json[20].name === 'Load "service" to Context');
515+
assert(json[20].name === 'Load Service');
516+
assert(json[21].name === 'Load "service" to Context');
515517

516518
// loadMiddleware
517-
assert(json[21].name === 'Load Middleware');
518-
assert(json[22].name === 'Load "middlewares" to Application');
519+
assert(json[22].name === 'Load Middleware');
520+
assert(json[23].name === 'Load "middlewares" to Application');
519521

520522
// loadController
521-
assert(json[23].name === 'Load Controller');
522-
assert(json[24].name === 'Load "controller" to Application');
523+
assert(json[24].name === 'Load Controller');
524+
assert(json[25].name === 'Load "controller" to Application');
523525

524526
// loadRouter
525-
assert(json[25].name === 'Load Router');
526-
assert(json[26].name === 'Require(7) app/router.js');
527+
assert(json[26].name === 'Load Router');
528+
assert(json[27].name === 'Require(8) app/router.js');
527529
});
528530
});
529531

test/fixtures/egg/app/middleware/status.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
module.exports = function() {
44
return (ctx, next) => {
5+
ctx.traceId = `trace:${Date.now()}`;
56
if (ctx.path === '/status') {
67
ctx.body = 'egg status';
78
return;

test/fixtures/egg/node_modules/session/app.js

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)