JavaScriptã®éåæã³ã³ããã¹ããšãªã¯ãšã¹ãã¹ã³ãŒã倿°ãæ·±ãæãäžããçŸä»£ã®ã¢ããªã±ãŒã·ã§ã³ã«ãããéåææäœå šäœã®ç¶æ ãšäŸåé¢ä¿ã管çããæè¡ãæ¢ããŸãã
JavaScriptã®éåæã³ã³ããã¹ãïŒãªã¯ãšã¹ãã¹ã³ãŒã倿°ã®åŸ¹åºè§£èª¬
éåæããã°ã©ãã³ã°ã¯ãç¹ã«åæãªã¯ãšã¹ãã®åŠçãæãéèŠã§ããNode.jsã®ãããªç°å¢ã«ãããŠãçŸä»£ã®JavaScriptã®åºç€ã§ããããããéåææäœå šäœã§ç¶æ ãšäŸåé¢ä¿ã管çããããšã¯ãããã«è€éã«ãªãå¯èœæ§ããããŸããåäžãªã¯ãšã¹ãã®ã©ã€ããµã€ã¯ã«å šäœã§ã¢ã¯ã»ã¹å¯èœãªãªã¯ãšã¹ãã¹ã³ãŒã倿°ã¯ã匷åãªè§£æ±ºçãæäŸããŸãããã®èšäºã§ã¯ãJavaScriptã®éåæã³ã³ããã¹ãã®æŠå¿µãæ·±ãæãäžãããªã¯ãšã¹ãã¹ã³ãŒã倿°ãšãããã广çã«ç®¡çããããã®æè¡ã«çŠç¹ãåœãŠãŸãããã€ãã£ãã¢ãžã¥ãŒã«ãããµãŒãããŒãã£ã©ã€ãã©ãªãŸã§ãããŸããŸãªã¢ãããŒããæ¢æ±ããå ç¢ã§ä¿å®å¯èœãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã®ã«åœ¹ç«ã€å®è·µçãªäŸãšæŽå¯ãæäŸããŸãã
JavaScriptã«ãããéåæã³ã³ããã¹ãã®çè§£
JavaScriptã®ã·ã³ã°ã«ã¹ã¬ããã®æ§è³ªã¯ãã€ãã³ãã«ãŒããšçžãŸã£ãŠããã³ããããã³ã°æäœãå¯èœã«ããŸãããã®éåææ§ã¯ãã¬ã¹ãã³ã·ããªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«äžå¯æ¬ ã§ããããããããã¯ãŸããã³ã³ããã¹ã管çã«ããã課é¡ããããããŸããåæç°å¢ã§ã¯ã倿°ã¯èªç¶ã«é¢æ°ããããã¯å ã«ã¹ã³ãŒããããŸããå¯Ÿç §çã«ãéåææäœã¯è€æ°ã®é¢æ°ãã€ãã³ãã«ãŒãã®ã€ãã¬ãŒã·ã§ã³ã«åæ£ãããå¯èœæ§ããããäžè²«ããå®è¡ã³ã³ããã¹ããç¶æããããšãå°é£ã«ãªããŸãã
è€æ°ã®ãªã¯ãšã¹ããåæã«åŠçãããŠã§ããµãŒããŒãèããŠã¿ãŠãã ãããåãªã¯ãšã¹ãã«ã¯ããŠãŒã¶ãŒèªèšŒæ å ±ããã®ã³ã°çšã®ãªã¯ãšã¹ãIDãããŒã¿ããŒã¹æ¥ç¶ãªã©ãç¬èªã®ããŒã¿ã»ãããå¿ èŠã§ãããã®ããŒã¿ãåé¢ããã¡ã«ããºã ããªããã°ãããŒã¿ç Žæãäºæããªãåäœã®ãªã¹ã¯ããããŸããããã§ãªã¯ãšã¹ãã¹ã³ãŒã倿°ã圹ç«ã¡ãŸãã
ãªã¯ãšã¹ãã¹ã³ãŒã倿°ãšã¯äœãïŒ
ãªã¯ãšã¹ãã¹ã³ãŒã倿°ãšã¯ãéåæã·ã¹ãã å ã®åäžã®ãªã¯ãšã¹ããŸãã¯ãã©ã³ã¶ã¯ã·ã§ã³ã«åºæã®å€æ°ã§ããããã«ãããçŸåšã®ãªã¯ãšã¹ãã«ã®ã¿é¢é£ããããŒã¿ãä¿åããã³ã¢ã¯ã»ã¹ã§ããåææäœéã®åé¢ãä¿èšŒãããŸãããããã¯ãååä¿¡ãªã¯ãšã¹ãã«ã¢ã¿ãããããå°çšã®ã¹ãã¬ãŒãžã¹ããŒã¹ã®ãããªãã®ã§ããããã®ãªã¯ãšã¹ãã®åŠçã§è¡ãããéåæåŒã³åºãå šäœã§æç¶ããŸããããã¯ãéåæç°å¢ã§ããŒã¿ã®æŽåæ§ãšäºæž¬å¯èœæ§ãç¶æããããã«äžå¯æ¬ ã§ãã
以äžã«ããã€ãã®äž»èŠãªãŠãŒã¹ã±ãŒã¹ãæããŸãïŒ
- ãŠãŒã¶ãŒèªèšŒïŒ èªèšŒåŸã«ãŠãŒã¶ãŒæ å ±ãä¿åãããªã¯ãšã¹ãã©ã€ããµã€ã¯ã«å ã®åŸç¶ã®ãã¹ãŠã®æäœã§å©çšå¯èœã«ããŸãã
- ãã®ã³ã°ãšãã¬ãŒã·ã³ã°ã®ããã®ãªã¯ãšã¹ãIDïŒ åãªã¯ãšã¹ãã«äžæã®IDãå²ãåœãŠãã·ã¹ãã å šäœã«äŒæãããŠãã°ã¡ãã»ãŒãžãé¢é£ä»ããå®è¡ãã¹ã远跡ããŸãã
- ããŒã¿ããŒã¹æ¥ç¶ïŒ ãªã¯ãšã¹ãããšã«ããŒã¿ããŒã¹æ¥ç¶ã管çããé©åãªåé¢ã確ä¿ããæ¥ç¶ãªãŒã¯ãé²ããŸãã
- æ§æèšå®ïŒ ã¢ããªã±ãŒã·ã§ã³ã®ç°ãªãéšåããã¢ã¯ã»ã¹ã§ãããªã¯ãšã¹ãåºæã®æ§æãèšå®ãä¿åããŸãã
- ãã©ã³ã¶ã¯ã·ã§ã³ç®¡çïŒ åäžãªã¯ãšã¹ãå ã§ãã©ã³ã¶ã¯ã·ã§ã³ã®ç¶æ ã管çããŸãã
ãªã¯ãšã¹ãã¹ã³ãŒã倿°ãå®è£ ããã¢ãããŒã
JavaScriptã§ãªã¯ãšã¹ãã¹ã³ãŒã倿°ãå®è£ ããããã«äœ¿çšã§ããã¢ãããŒãã¯ããã€ããããŸããåã¢ãããŒãã«ã¯ãè€éããããã©ãŒãã³ã¹ãäºææ§ã®èгç¹ãããããããã«ãã¬ãŒããªãããããŸããæãäžè¬çãªææ³ã®ããã€ããã¿ãŠãããŸãããã
1. æåã§ã®ã³ã³ããã¹ãäŒæ
æãåºæ¬çãªã¢ãããŒãã¯ãåéåæé¢æ°ã«åŒæ°ãšããŠã³ã³ããã¹ãæ å ±ãæåã§æž¡ãããšã§ããçè§£ã¯ç°¡åã§ããããã®æ¹æ³ã¯ãç¹ã«æ·±ããã¹ããããéåæåŒã³åºãã§ã¯ãããã«é¢åã§ãšã©ãŒãçºçãããããªããŸãã
äŸïŒ
function handleRequest(req, res) {
const userId = authenticateUser(req);
processData(userId, req, res);
}
function processData(userId, req, res) {
fetchDataFromDatabase(userId, (err, data) => {
if (err) {
return handleError(err, req, res);
}
renderResponse(data, userId, req, res);
});
}
function renderResponse(data, userId, req, res) {
// userIdã䜿çšããŠã¬ã¹ãã³ã¹ãããŒãœãã©ã€ãº
res.end(`Hello, user ${userId}! Data: ${JSON.stringify(data)}`);
}
ã芧ã®ãšããã`userId`ã`req`ã`res`ãå颿°ã«æåã§æž¡ããŠããŸããããã¯ãããè€éãªéåæãããŒã§ã¯ç®¡çããŸããŸãå°é£ã«ãªããŸãã
ãã¡ãªããïŒ
- ãã€ã©ãŒãã¬ãŒãã³ãŒãïŒ ãã¹ãŠã®é¢æ°ã«æç€ºçã«ã³ã³ããã¹ããæž¡ããšãå€ãã®åé·ãªã³ãŒããçæãããŸãã
- ãšã©ãŒãçºçããããïŒ ã³ã³ããã¹ããæž¡ãå¿ããããšã容æã§ããã°ã«ã€ãªãããŸãã
- ãªãã¡ã¯ã¿ãªã³ã°ã®å°é£ãïŒ ã³ã³ããã¹ãã倿Žããã«ã¯ããã¹ãŠã®é¢æ°ã·ã°ããã£ãä¿®æ£ããå¿ èŠããããŸãã
- å¯çµåïŒ é¢æ°ã¯åãåãç¹å®ã®ã³ã³ããã¹ãã«å¯çµåã«ãªããŸãã
2. AsyncLocalStorage (Node.js v14.5.0以é)
Node.jsã¯ãéåææäœå šäœã§ã³ã³ããã¹ãã管çããããã®çµã¿èŸŒã¿ã¡ã«ããºã ãšããŠ`AsyncLocalStorage`ãå°å ¥ããŸãããããã¯ãéåæã¿ã¹ã¯ã®ã©ã€ããµã€ã¯ã«å šäœã§ã¢ã¯ã»ã¹å¯èœãªããŒã¿ãä¿åããæ¹æ³ãæäŸããŸããããã¯äžè¬çã«ãçŸä»£ã®Node.jsã¢ããªã±ãŒã·ã§ã³ã§æšå¥šãããã¢ãããŒãã§ãã`AsyncLocalStorage`ã¯`run`ããã³`enterWith`ã¡ãœãããä»ããŠåäœããã³ã³ããã¹ããæ£ããäŒæãããããšãä¿èšŒããŸãã
äŸïŒ
const { AsyncLocalStorage } = require('async_hooks');
const asyncLocalStorage = new AsyncLocalStorage();
function handleRequest(req, res) {
const requestId = generateRequestId();
asyncLocalStorage.run(new Map(), () => {
asyncLocalStorage.getStore().set('requestId', requestId);
asyncLocalStorage.getStore().set('request', req);
processData(res);
});
}
function processData(res) {
fetchDataFromDatabase((err, data) => {
if (err) {
return handleError(err, res);
}
renderResponse(data, res);
});
}
function fetchDataFromDatabase(callback) {
const requestId = asyncLocalStorage.getStore().get('requestId');
// ... ãã®ã³ã°/ãã¬ãŒã·ã³ã°ã®ããã«ãªã¯ãšã¹ãIDã䜿çšããŠããŒã¿ãååŸ
setTimeout(() => {
callback(null, { message: 'Data from database' });
}, 100);
}
function renderResponse(data, res) {
const requestId = asyncLocalStorage.getStore().get('requestId');
res.end(`Request ID: ${requestId}, Data: ${JSON.stringify(data)}`);
}
ãã®äŸã§ã¯ã`asyncLocalStorage.run`ãæ°ããã³ã³ããã¹ãïŒ`Map`ã§è¡šçŸïŒãäœæãããã®ã³ã³ããã¹ãå ã§æäŸãããã³ãŒã«ããã¯ãå®è¡ããŸãã`requestId`ã¯ã³ã³ããã¹ãã«ä¿åããã`fetchDataFromDatabase`ãš`renderResponse`ã§`asyncLocalStorage.getStore().get('requestId')`ã䜿çšããŠã¢ã¯ã»ã¹ã§ããŸãã`req`ãåæ§ã«å©çšå¯èœã«ãªããŸããç¡å颿°ãäž»èŠãªããžãã¯ãã©ããããŸãããã®é¢æ°å ã®ã©ã®éåææäœããèªåçã«ã³ã³ããã¹ããç¶æ¿ããŸãã
ã¡ãªããïŒ
- çµã¿èŸŒã¿ïŒ ææ°ã®Node.jsããŒãžã§ã³ã§ã¯å€éšäŸåã¯äžèŠã§ãã
- èªåã³ã³ããã¹ãäŒæïŒ ã³ã³ããã¹ãã¯éåææäœå šäœã§èªåçã«äŒæãããŸãã
- åå®å šæ§ïŒ TypeScriptã䜿çšãããšãã³ã³ããã¹ã倿°ã«ã¢ã¯ã»ã¹ããéã®åå®å šæ§ãåäžãããããšãã§ããŸãã
- é¢å¿ã®æç¢ºãªåé¢ïŒ 颿°ã¯ã³ã³ããã¹ããæç€ºçã«æèããå¿ èŠããããŸããã
ãã¡ãªããïŒ
- Node.js v14.5.0以éãå¿ èŠïŒ å€ãããŒãžã§ã³ã®Node.jsã¯ãµããŒããããŠããŸããã
- ããããªããã©ãŒãã³ã¹ãªãŒããŒãããïŒ ã³ã³ããã¹ãã¹ã€ããã³ã°ã«é¢é£ããå°ããªããã©ãŒãã³ã¹ãªãŒããŒãããããããŸãã
- ã¹ãã¬ãŒãžã®æå管çïŒ `run`ã¡ãœããã«ã¯ã¹ãã¬ãŒãžãªããžã§ã¯ããæž¡ãå¿ èŠãããããªã¯ãšã¹ãããšã«Mapãé¡äŒŒã®ãªããžã§ã¯ããäœæããå¿ èŠããããŸãã
3. cls-hooked (Continuation-Local Storage)
`cls-hooked`ã¯ãcontinuation-local storageïŒCLSïŒãæäŸããã©ã€ãã©ãªã§ãçŸåšã®å®è¡ã³ã³ããã¹ãã«ããŒã¿ãé¢é£ä»ããããšãã§ããŸããããã¯ããã€ãã£ãã®`AsyncLocalStorage`ãç»å Žããåãããé·å¹Žã«ããã£ãŠNode.jsã§ãªã¯ãšã¹ãã¹ã³ãŒã倿°ã管çããããã®äžè¬çãªéžæè¢ã§ãããçŸåšã§ã¯äžè¬çã«`AsyncLocalStorage`ã奜ãŸããŸããã`cls-hooked`ã¯ãç¹ã«ã¬ã¬ã·ãŒãªã³ãŒãããŒã¹ãå€ãNode.jsããŒãžã§ã³ããµããŒãããå Žåã«ã¯ãäŸç¶ãšããŠå®è¡å¯èœãªéžæè¢ã§ãããã ããããã©ãŒãã³ã¹ãžã®åœ±é¿ãããããšã«çæããŠãã ããã
äŸïŒ
const cls = require('cls-hooked');
const namespace = cls.createNamespace('my-app');
const { v4: uuidv4 } = require('uuid');
cls.getNamespace = () => namespace;
const express = require('express');
const app = express();
app.use((req, res, next) => {
namespace.run(() => {
const requestId = uuidv4();
namespace.set('requestId', requestId);
namespace.set('request', req);
next();
});
});
app.get('/', (req, res) => {
const requestId = namespace.get('requestId');
console.log(`Request ID: ${requestId}`);
res.send(`Hello, Request ID: ${requestId}`);
});
app.get('/data', (req, res) => {
const requestId = namespace.get('requestId');
setTimeout(() => {
// éåææäœãã·ãã¥ã¬ãŒã
console.log(`Asynchronous operation - Request ID: ${requestId}`);
res.send(`Data, Request ID: ${requestId}`);
}, 500);
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
ãã®äŸã§ã¯ã`cls.createNamespace`ããªã¯ãšã¹ãã¹ã³ãŒãã®ããŒã¿ãä¿åããããã®åå空éãäœæããŸããããã«ãŠã§ã¢ã¯åãªã¯ãšã¹ãã`namespace.run`ã§ã©ããããããããªã¯ãšã¹ãã®ã³ã³ããã¹ãã確ç«ããŸãã`namespace.set`ã¯`requestId`ãã³ã³ããã¹ãã«ä¿åãã`namespace.get`ã¯åŸã§ãªã¯ãšã¹ããã³ãã©å ãã·ãã¥ã¬ãŒããããéåææäœäžã«ãããååŸããŸããUUIDã¯äžæã®ãªã¯ãšã¹ãIDãäœæããããã«äœ¿çšãããŸãã
ã¡ãªããïŒ
- åºã䜿çšãããŠããïŒ `cls-hooked`ã¯é·å¹Žã«ããã人æ°ã®ããéžæè¢ã§ããã倧ããªã³ãã¥ããã£ããããŸãã
- ã·ã³ãã«ãªAPIïŒ APIã¯æ¯èŒçã«äœ¿ãããããçè§£ããããã§ãã
- å€ãNode.jsããŒãžã§ã³ããµããŒãïŒ å€ãããŒãžã§ã³ã®Node.jsãšäºææ§ããããŸãã
ãã¡ãªããïŒ
- ããã©ãŒãã³ã¹ãªãŒããŒãããïŒ `cls-hooked`ã¯ã¢ã³ããŒãããã«äŸåããŠããããããããã©ãŒãã³ã¹ãªãŒããŒããããåŒãèµ·ããå¯èœæ§ããããŸããããã¯é«ã¹ã«ãŒãããã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯é¡èã«ãªãããšããããŸãã
- ç«¶åã®å¯èœæ§ïŒ ã¢ã³ããŒãããã¯ä»ã®ã©ã€ãã©ãªãšç«¶åããå¯èœæ§ããããŸãã
- ã¡ã³ããã³ã¹ã®æžå¿µïŒ `AsyncLocalStorage`ããã€ãã£ããœãªã¥ãŒã·ã§ã³ã§ãããããå°æ¥ã®éçºãšã¡ã³ããã³ã¹ã®åŽåã¯ãã¡ãã«éäžããå¯èœæ§ãé«ãã§ãã
4. Zone.js
Zone.jsã¯ãéåææäœã远跡ããããã«äœ¿çšã§ããå®è¡ã³ã³ããã¹ããæäŸããã©ã€ãã©ãªã§ããäž»ã«Angularã§ã®äœ¿çšã§ç¥ãããŠããŸãããZone.jsã¯Node.jsã§ãªã¯ãšã¹ãã¹ã³ãŒã倿°ã管çããããã«ã䜿çšã§ããŸãããã ãã`AsyncLocalStorage`ã`cls-hooked`ãšæ¯èŒããŠãããè€éã§éããœãªã¥ãŒã·ã§ã³ã§ãããã¢ããªã±ãŒã·ã§ã³ã§æ¢ã«Zone.jsã䜿çšããŠããå Žåãé€ããäžè¬çã«ã¯æšå¥šãããŸããã
ã¡ãªããïŒ
- å æ¬çãªã³ã³ããã¹ãïŒ Zone.jsã¯éåžžã«å æ¬çãªå®è¡ã³ã³ããã¹ããæäŸããŸãã
- Angularãšã®çµ±åïŒ Angularã¢ããªã±ãŒã·ã§ã³ãšã®ã·ãŒã ã¬ã¹ãªçµ±åã
ãã¡ãªããïŒ
- è€éãïŒ Zone.jsã¯åŠç¿æ²ç·ãæ¥ãªè€éãªã©ã€ãã©ãªã§ãã
- ããã©ãŒãã³ã¹ãªãŒããŒãããïŒ Zone.jsã¯å€§ããªããã©ãŒãã³ã¹ãªãŒããŒããããåŒãèµ·ããå¯èœæ§ããããŸãã
- åçŽãªãªã¯ãšã¹ãã¹ã³ãŒã倿°ã«ã¯éå°ïŒ åçŽãªãªã¯ãšã¹ãã¹ã³ãŒã倿°ã®ç®¡çã«ã¯éå°ãªãœãªã¥ãŒã·ã§ã³ã§ãã
5. ããã«ãŠã§ã¢é¢æ°
Express.jsã®ãããªãŠã§ãã¢ããªã±ãŒã·ã§ã³ãã¬ãŒã ã¯ãŒã¯ã§ã¯ãããã«ãŠã§ã¢é¢æ°ã¯ãªã¯ãšã¹ããã€ã³ã¿ãŒã»ããããã«ãŒããã³ãã©ã«å°éããåã®ã¢ã¯ã·ã§ã³ãå®è¡ãã䟿å©ãªæ¹æ³ãæäŸããŸããããã«ãŠã§ã¢ã䜿çšããŠãªã¯ãšã¹ãã¹ã³ãŒã倿°ãèšå®ããåŸç¶ã®ããã«ãŠã§ã¢ãã«ãŒããã³ãã©ã§å©çšå¯èœã«ããããšãã§ããŸããããã¯ã`AsyncLocalStorage`ã®ãããªä»ã®ã¡ãœããã®ãããããšé »ç¹ã«çµã¿åããããŸãã
äŸïŒAsyncLocalStorageãExpressããã«ãŠã§ã¢ãšå ±ã«äœ¿çšïŒïŒ
const express = require('express');
const { AsyncLocalStorage } = require('async_hooks');
const { v4: uuidv4 } = require('uuid');
const app = express();
const asyncLocalStorage = new AsyncLocalStorage();
// ãªã¯ãšã¹ãã¹ã³ãŒã倿°ãèšå®ããããã«ãŠã§ã¢
app.use((req, res, next) => {
asyncLocalStorage.run(new Map(), () => {
const requestId = uuidv4();
asyncLocalStorage.getStore().set('requestId', requestId);
asyncLocalStorage.getStore().set('request', req);
next();
});
});
// ã«ãŒããã³ãã©
app.get('/', (req, res) => {
const requestId = asyncLocalStorage.getStore().get('requestId');
res.send(`Hello! Request ID: ${requestId}`);
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
ãã®äŸã¯ããªã¯ãšã¹ããã«ãŒããã³ãã©ã«å°éããåã«ãããã«ãŠã§ã¢ã䜿çšããŠ`AsyncLocalStorage`ã«`requestId`ãèšå®ããæ¹æ³ã瀺ããŠããŸãããã®åŸãã«ãŒããã³ãã©ã¯`AsyncLocalStorage`ãã`requestId`ã«ã¢ã¯ã»ã¹ã§ããŸãã
ã¡ãªããïŒ
- äžå åãããã³ã³ããã¹ã管çïŒ ããã«ãŠã§ã¢é¢æ°ã¯ããªã¯ãšã¹ãã¹ã³ãŒã倿°ã管çããããã®äžå åãããå ŽæãæäŸããŸãã
- é¢å¿ã®æç¢ºãªåé¢ïŒ ã«ãŒããã³ãã©ã¯ã³ã³ããã¹ãã®èšå®ã«çŽæ¥é¢äžããå¿ èŠããããŸããã
- ãã¬ãŒã ã¯ãŒã¯ãšã®ç°¡åãªçµ±åïŒ ããã«ãŠã§ã¢é¢æ°ã¯ãExpress.jsã®ãããªãŠã§ãã¢ããªã±ãŒã·ã§ã³ãã¬ãŒã ã¯ãŒã¯ãšããçµ±åãããŠããŸãã
ãã¡ãªããïŒ
- ãã¬ãŒã ã¯ãŒã¯ãå¿ èŠïŒ ãã®ã¢ãããŒãã¯ãäž»ã«ããã«ãŠã§ã¢ããµããŒããããŠã§ãã¢ããªã±ãŒã·ã§ã³ãã¬ãŒã ã¯ãŒã¯ã«é©ããŠããŸãã
- ä»ã®æè¡ã«äŸåïŒ ããã«ãŠã§ã¢ã¯éåžžãå®éã«ã³ã³ããã¹ããä¿åãäŒæããããã«ãä»ã®æè¡ïŒäŸïŒ`AsyncLocalStorage`ã`cls-hooked`ïŒã®ãããããšçµã¿åãããå¿ èŠããããŸãã
ãªã¯ãšã¹ãã¹ã³ãŒã倿°ã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
ãªã¯ãšã¹ãã¹ã³ãŒã倿°ã䜿çšããéã«èæ ®ãã¹ãããã€ãã®ãã¹ããã©ã¯ãã£ã¹ã以äžã«ç€ºããŸãïŒ
- é©åãªã¢ãããŒããéžæããïŒ Node.jsã®ããŒãžã§ã³ãããã©ãŒãã³ã¹èŠä»¶ãè€éããªã©ã®èŠå ãèæ ®ããŠãããŒãºã«æé©ãªã¢ãããŒããéžæããŸããäžè¬çã«ã`AsyncLocalStorage`ãçŸä»£ã®Node.jsã¢ããªã±ãŒã·ã§ã³ã§æšå¥šããããœãªã¥ãŒã·ã§ã³ã§ãã
- äžè²«ããåœåèŠåã䜿çšããïŒ ã³ãŒãã®å¯èªæ§ãšä¿å®æ§ãåäžãããããã«ããªã¯ãšã¹ãã¹ã³ãŒã倿°ã«äžè²«ããåœåèŠåã䜿çšããŸããäŸãã°ããã¹ãŠã®ãªã¯ãšã¹ãã¹ã³ãŒã倿°ã®åã«`req_`ãä»ããŸãã
- ã³ã³ããã¹ããææžåããïŒ åãªã¯ãšã¹ãã¹ã³ãŒã倿°ã®ç®çãšããããã¢ããªã±ãŒã·ã§ã³å ã§ã©ã®ããã«äœ¿çšãããããæç¢ºã«ææžåããŸãã
- æ©å¯ããŒã¿ãçŽæ¥ä¿åããªãïŒ ãªã¯ãšã¹ãã³ã³ããã¹ãã«ä¿åããåã«ãæ©å¯ããŒã¿ãæå·åãŸãã¯ãã¹ãã³ã°ããããšãæ€èšããŠãã ããããã¹ã¯ãŒãã®ãããªç§å¯æ å ±ãçŽæ¥ä¿åããããšã¯é¿ããŠãã ããã
- ã³ã³ããã¹ããã¯ãªãŒã³ã¢ããããïŒ å Žåã«ãã£ãŠã¯ãã¡ã¢ãªãªãŒã¯ããã®ä»ã®åé¡ãé¿ããããã«ããªã¯ãšã¹ããåŠçãããåŸã«ã³ã³ããã¹ããã¯ãªãŒã³ã¢ããããå¿ èŠããããããããŸããã`AsyncLocalStorage`ã§ã¯ã`run`ã³ãŒã«ããã¯ãå®äºãããšã³ã³ããã¹ãã¯èªåçã«ã¯ãªã¢ãããŸããã`cls-hooked`ã®ãããªä»ã®ã¢ãããŒãã§ã¯ãæç€ºçã«åå空éãã¯ãªã¢ããå¿ èŠããããããããŸããã
- ããã©ãŒãã³ã¹ã«æ³šæããïŒ ãªã¯ãšã¹ãã¹ã³ãŒã倿°ã䜿çšããããšã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãç¹ã«ã¢ã³ããŒãããã«äŸåãã`cls-hooked`ã®ãããªã¢ãããŒãã«ã¯æ³šæããŠãã ãããã¢ããªã±ãŒã·ã§ã³ã培åºçã«ãã¹ãããŠãããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ãã察åŠããŸãã
- åå®å šæ§ã®ããã«TypeScriptã䜿çšããïŒ TypeScriptã䜿çšããŠããå Žåã¯ããããå©çšããŠãªã¯ãšã¹ãã³ã³ããã¹ãã®æ§é ãå®çŸ©ããã³ã³ããã¹ã倿°ã«ã¢ã¯ã»ã¹ããéã®åå®å šæ§ã確ä¿ããŸããããã«ããããšã©ãŒãæžããä¿å®æ§ãåäžããŸãã
- ãã®ã³ã°ã©ã€ãã©ãªã®äœ¿çšãæ€èšããïŒ ãªã¯ãšã¹ãã¹ã³ãŒã倿°ããã®ã³ã°ã©ã€ãã©ãªãšçµ±åããŠããã°ã¡ãã»ãŒãžã«ã³ã³ããã¹ãæ å ±ãèªåçã«å«ããŸããããã«ããããªã¯ãšã¹ãã®è¿œè·¡ãåé¡ã®ãããã°ã容æã«ãªããŸããWinstonãMorganã®ãããªäººæ°ã®ãã®ã³ã°ã©ã€ãã©ãªã¯ãã³ã³ããã¹ãã®äŒæããµããŒãããŠããŸãã
- 忣ãã¬ãŒã·ã³ã°ã«çžé¢IDã䜿çšããïŒ ãã€ã¯ããµãŒãã¹ã忣ã·ã¹ãã ãæ±ãå Žåãçžé¢IDã䜿çšããŠè€æ°ã®ãµãŒãã¹ã«ãŸããããªã¯ãšã¹ãã远跡ããŸããçžé¢IDã¯ãªã¯ãšã¹ãã³ã³ããã¹ãã«ä¿åããHTTPããããŒãä»ã®ã¡ã«ããºã ã䜿çšããŠä»ã®ãµãŒãã¹ã«äŒæãããããšãã§ããŸãã
å®äžçã§ã®äŸ
ãªã¯ãšã¹ãã¹ã³ãŒã倿°ãããŸããŸãªã·ããªãªã§ã©ã®ããã«äœ¿çšã§ããããããã€ãã®å®äžçã®äŸãèŠãŠã¿ãŸãããïŒ
- Eã³ããŒã¹ã¢ããªã±ãŒã·ã§ã³ïŒ Eã³ããŒã¹ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããªã¯ãšã¹ãã¹ã³ãŒã倿°ã䜿çšããŠãã«ãŒãå ã®ååãé éå äœæãæ¯æãæ¹æ³ãªã©ããŠãŒã¶ãŒã®ã·ã§ããã³ã°ã«ãŒãã«é¢ããæ å ±ãä¿åã§ããŸãããã®æ å ±ã¯ãååã«ã¿ãã°ããã§ãã¯ã¢ãŠãããã»ã¹ã泚æåŠçã·ã¹ãã ãªã©ãã¢ããªã±ãŒã·ã§ã³ã®ããŸããŸãªéšåããã¢ã¯ã»ã¹ã§ããŸãã
- éèã¢ããªã±ãŒã·ã§ã³ïŒ éèã¢ããªã±ãŒã·ã§ã³ã§ã¯ããªã¯ãšã¹ãã¹ã³ãŒã倿°ã䜿çšããŠãå£åº§æ®é«ãååŒå±¥æŽãæè³ããŒããã©ãªãªãªã©ããŠãŒã¶ãŒã®å£åº§ã«é¢ããæ å ±ãä¿åã§ããŸãããã®æ å ±ã¯ãå£åº§ç®¡çã·ã¹ãã ãååŒãã©ãããã©ãŒã ãã¬ããŒãã·ã¹ãã ãªã©ãã¢ããªã±ãŒã·ã§ã³ã®ããŸããŸãªéšåããã¢ã¯ã»ã¹ã§ããŸãã
- ãã«ã¹ã±ã¢ã¢ããªã±ãŒã·ã§ã³ïŒ ãã«ã¹ã±ã¢ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããªã¯ãšã¹ãã¹ã³ãŒã倿°ã䜿çšããŠãæ£è ã®ç æŽãçŸåšã®æè¬ãã¢ã¬ã«ã®ãŒãªã©ãæ£è ã«é¢ããæ å ±ãä¿åã§ããŸãããã®æ å ±ã¯ãé»åã«ã«ãïŒEHRïŒã·ã¹ãã ãåŠæ¹ã·ã¹ãã ã蚺æã·ã¹ãã ãªã©ãã¢ããªã±ãŒã·ã§ã³ã®ããŸããŸãªéšåããã¢ã¯ã»ã¹ã§ããŸãã
- ã°ããŒãã«ã³ã³ãã³ã管çã·ã¹ãã ïŒCMSïŒïŒ è€æ°ã®èšèªã§ã³ã³ãã³ããæ±ãCMSã¯ããŠãŒã¶ãŒã®åªå èšèªããªã¯ãšã¹ãã¹ã³ãŒã倿°ã«ä¿åããããšããããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã¯ãŠãŒã¶ãŒã®ã»ãã·ã§ã³å šäœã§èªåçã«æ£ããèšèªã®ã³ã³ãã³ããæäŸã§ããŸããããã«ããããŠãŒã¶ãŒã®èšèªèšå®ãå°éããããŒã«ã©ã€ãºãããäœéšãä¿èšŒãããŸãã
- ãã«ãããã³ãSaaSã¢ããªã±ãŒã·ã§ã³ïŒ è€æ°ã®ããã³ãã«ãµãŒãã¹ãæäŸããSoftware-as-a-ServiceïŒSaaSïŒã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããã³ãIDããªã¯ãšã¹ãã¹ã³ãŒã倿°ã«ä¿åã§ããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã¯åããã³ãã®ããŒã¿ãšãªãœãŒã¹ãåé¢ããããŒã¿ã®ãã©ã€ãã·ãŒãšã»ãã¥ãªãã£ã確ä¿ã§ããŸããããã¯ããã«ãããã³ãã¢ãŒããã¯ãã£ã®æŽåæ§ãç¶æããããã«äžå¯æ¬ ã§ãã
çµè«
ãªã¯ãšã¹ãã¹ã³ãŒã倿°ã¯ãéåæJavaScriptã¢ããªã±ãŒã·ã§ã³ã§ç¶æ ãšäŸåé¢ä¿ã管çããããã®è²ŽéãªããŒã«ã§ããåæãªã¯ãšã¹ãéã§ããŒã¿ãåé¢ããã¡ã«ããºã ãæäŸããããšã§ãããŒã¿ã®æŽåæ§ã確ä¿ããã³ãŒãã®ä¿å®æ§ãåäžããããããã°ãç°¡çŽ åããŸããæåã§ã®ã³ã³ããã¹ãäŒæãå¯èœã§ãããNode.jsã®`AsyncLocalStorage`ã®ãããªçŸä»£çãªãœãªã¥ãŒã·ã§ã³ã¯ãéåæã³ã³ããã¹ããåŠçããããã®ããå ç¢ã§å¹ççãªæ¹æ³ãæäŸããŸããé©åãªã¢ãããŒããæ éã«éžæãããã¹ããã©ã¯ãã£ã¹ã«åŸãããªã¯ãšã¹ãã¹ã³ãŒã倿°ããã®ã³ã°ããã¬ãŒã·ã³ã°ããŒã«ãšçµ±åããããšã§ãéåæJavaScriptã³ãŒãã®å質ãšä¿¡é Œæ§ãå€§å¹ ã«åäžãããããšãã§ããŸããéåæã³ã³ããã¹ãã¯ãç¹ã«ãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã§åœ¹ç«ã¡ãŸãã
JavaScriptãšã³ã·ã¹ãã ãé²åãç¶ããäžã§ãéåæã³ã³ããã¹ãã管çããããã®ææ°æè¡ãåžžã«ææ¡ããããšã¯ãã¹ã±ãŒã©ãã«ã§ä¿å®å¯èœããã€å ç¢ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«äžå¯æ¬ ã§ãã`AsyncLocalStorage`ã¯ããªã¯ãšã¹ãã¹ã³ãŒã倿°ã«å¯ŸããŠã¯ãªãŒã³ã§ããã©ãŒãã³ã¹ã®é«ããœãªã¥ãŒã·ã§ã³ãæäŸããæ°ãããããžã§ã¯ãã§ã®æ¡çšãåŒ·ãæšå¥šãããŸãããã ãã`cls-hooked`ã®ãããªã¬ã¬ã·ãŒãœãªã¥ãŒã·ã§ã³ãå«ããããŸããŸãªã¢ãããŒãã®ãã¬ãŒããªããçè§£ããããšã¯ãæ¢åã®ã³ãŒãããŒã¹ãç¶æããç§»è¡ããããã«éèŠã§ãããããã®æè¡ã掻çšããŠãéåæããã°ã©ãã³ã°ã®è€éããå æããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã®ããã«ããä¿¡é Œæ§ãé«ãå¹ççãªJavaScriptã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŠãã ããã