UNPKG

7.66 kBPlain TextView Raw
1// 用子进程方案确保函数计算每次执行的时候不存在全局变量依赖问题
2exports.handler = require('./index-client').handler
3
4
5// 线上测试方案不可行:子进程无法输出打印信息,以及
6// 线上报错问题子进程退出的时候会修改本地文件系统,需要重定向到/tmp目录中
7// message: Error: EROFS: read-only file system, mkdir '/code/var'
8// exports.handler11111 = async function (event, context, callback) {
9// return new Promise((resolve, reject) => {
10// const cluster = require('cluster')
11// if (cluster.isMaster) {
12// const fse = require('fs-extra')
13// // 创建子进程模拟线上请求的隔离方便global变量的使用保持与FC环境的一致性
14// const worker = cluster.fork()
15// let __out__ = {
16// statusCode: 550,
17// }
18// // worker.on('message', msg => {
19// // console.log('111=>' + JSON.stringify(msg))
20// // __out__ = msg
21// // })
22// worker.on('exit', function (worker, code, signal) {
23// __out__ = fse.readJSONSync('/tmp/sub-process-out.json')
24// console.log('222=>' + JSON.stringify({__out__, worker, code, signal}))
25// // callback(null, __out__)
26// callback(null, __out__)
27// resolve()
28// // // 根据请求类型GET/POST/OPTIONS进行正确的HTML或AXJS请求输出响应
29// // // console.log('Worker %d died with code/signal %s. Restarting worker...', worker.process.pid, signal || code);
30// // callback(null, {
31// // isBase64Encoded: true,
32// // statusCode: 555,
33// // headers: {
34// // "Content-type": "application/json",
35// // },
36// // // base64 encode body so it can be safely returned as JSON value
37// // body: new Buffer(JSON.stringify({a: 44, b: 55})).toString('base64')
38// // })
39// // resolve()
40// })
41// } else {
42// const fse = require('fs-extra')
43// process.on('unhandledRejection', (err) => {
44// // process.send({
45// // statusCode: 551,
46// // })
47// console.log('unhandledRejection', err)
48// fse.writeJSONSync('/tmp/sub-process-out.json', {
49// statusCode: 551,
50// })
51// process.exit()
52// })
53// process.on('uncaughtException', (err) => {
54// // process.send({
55// // statusCode: 552,
56// // })
57// console.log('uncaughtException', err)
58// fse.writeJSONSync('/tmp/sub-process-out.json', {
59// statusCode: 552,
60// })
61// process.exit()
62// })
63//
64// let jsonResponse = {
65// isBase64Encoded: true,
66// statusCode: 200,
67// headers: {
68// "Content-type": "application/json",
69// },
70// // base64 encode body so it can be safely returned as JSON value
71// body: new Buffer(JSON.stringify({a: 1, b: new Date()})).toString('base64')
72// }
73// console.log(jsonResponse)
74// fse.ensureFileSync('/tmp/sub-process-out.json')
75// // fse.writeFileSync('/tmp/sub-process-out.json', '{"statusCode":599}')
76// fse.writeJSONSync('/tmp/sub-process-out.json', jsonResponse)
77// // process.send({a:1,b:2,c:'c'})
78// // process.send(jsonResponse)
79// // callback(null, jsonResponse)
80// process.nextTick(() => {
81// process.exit(0)
82// })
83// // require('./index-client').handler(event, context, (x, msg) => {
84// // process.send(msg)
85// // }).then(data => {
86// // process.exit()
87// // })
88// // .catch(err => {
89// // // callback(null, {
90// // // statusCode: 553,
91// // // })
92// // process.exit()
93// // })
94// }
95// })
96// }
97
98
99
100
101
102// 实验结果:
103// 父子进程模型在线上FC环境是不可用的目前,begg的多进程模型不可用仅可用于研发环境的单机FC线上环境模拟。
104// 线上FC的环境是基于express构建的改造环境,一个容器只对应一个请求,下个请求来了会复用该容器,上次残留的全局变量也会保存下来。
105// 改进方案:请求上下文的复用机制。每次请求开始的时候需要对请求上下文进行重新初始化处理,确保会话状态的一致性。
106// const cluster = require('cluster')
107// if (cluster.isMaster) {
108// exports.handler = function (event, context, callback) {
109// console.log('xxxxxx')
110// console.log(11111)
111// const worker = cluster.fork()
112// console.log(22222)
113// worker.on('exit', function (worker, code, signal) {
114// console.log(22222333333)
115// callback(null,{statusCode:200})
116// })
117// }
118// }else{
119// // 子进程此处执行无效!!FC线上环境不支持此用法。
120// // console.log = ()=>{}
121// // console.log(33333)
122// }
123// 线上错误日志信息如下:
124// FC Invoke Start RequestId: 4d2b4f06-709d-552c-1560-dfa821e1058c
125// load code for handler:index.handler
126// 2018-09-15T23:14:17.882Z 4d2b4f06-709d-552c-1560-dfa821e1058c [verbose] xxxxxx
127// 2018-09-15T23:14:17.883Z 4d2b4f06-709d-552c-1560-dfa821e1058c [verbose] 11111
128// 2018-09-15T23:14:17.900Z 4d2b4f06-709d-552c-1560-dfa821e1058c [verbose] 22222
129// /var/fc/runtime/nodejs8/node_modules/mkdirp/index.js:90
130// throw err0;
131// ^
132// Error: EROFS: read-only file system, mkdir '/code/var'
133// at Object.fs.mkdirSync (fs.js:885:18)
134// at sync (/var/fc/runtime/nodejs8/node_modules/mkdirp/index.js:71:13)
135// at Function.sync (/var/fc/runtime/nodejs8/node_modules/mkdirp/index.js:77:24)
136// at newLogger (/var/fc/runtime/nodejs8/src/logger.js:22:12)
137// at Object.<anonymous> (/var/fc/runtime/nodejs8/src/logger.js:54:14)
138// at Module._compile (module.js:635:30)
139// at Object.Module._extensions..js (module.js:646:10)
140// at Module.load (module.js:554:32)
141// at tryModuleLoad (module.js:497:12)
142// at Function.Module._load (module.js:489:3)
143// 2018-09-15T23:14:18.109Z 4d2b4f06-709d-552c-1560-dfa821e1058c [verbose] 22222333333
144// FC Invoke End RequestId: 4d2b4f06-709d-552c-1560-dfa821e1058c
145//
146
147// TODO 进一步实验调用子进程模型(这个是可行的曾经在有数图片渲染服务上验证过可行性,直接执行子进程将执行结果回传到文本文件上,
148// TODO 但是存在的问题日志信息没法输出问题,方案仍然不可行。)
149// const cross_spawn = require('cross-spawn')
150// // 同步系统命令调用执行
151// async function xcmd(...args) {
152// try {
153// const options = {}
154// options.cwd = options.cwd || process.env.__ctxPath || process.cwd();
155// // xassert(_.isArray(args) && args.length > 0)
156// const cmd = args.shift()
157// const ret = cross_spawn.sync(cmd, args, Object.assign({stdio: 'inherit'}, options))
158// // xassert(ret.status === 0, ERR$UNKNOWN, ret)
159// return ret
160// } catch (err) {
161// await xwarn(err)
162// xthrow(err)
163// }
164// }
\No newline at end of file