我正在编写一个基于Nodejs的服务,N,位于实体A和B之间。
A <----> N <----> BApp APOST是对N的同步请求,N必须用它只能通过调用外部服务B获得的数据来响应。
问题是,B是一个异步服务/API:对任何N POSTs到B的响应首先使用HTTP 202 (“请求已接受”),然后使用实际数据作为从B到N的回调POST请求,因此,实际上,在单线程N中,我必须以某种方式保持来自A的当前同步请求“暂停”,而不阻塞来自A到N的其他潜在请求,同时N和B之间的异步消息交换完成来自当前搁置的A的请求。
比如说,在Nodejs中,是否可以使用承诺或async/await魔术?
发布于 2022-05-05 12:28:42
使用请求id、本地缓存和超时,您可以执行如下操作:
const requestIdAndResponseDetailsMap = {};
router.post('/request-from-a', function requestFromAHandler(request, response) {
const requestId = request.body.id;
makeCallToB(request.body); // ensure that request id is passed to B and sent in the call from B to N.
cacheServiceAResponseWithTimeout(requestId, response);
});
router.post('/callback-from-b', function callbackFromBHandler(request, response) {
const dataFromB = request.body;
tryRespondToA(dataFromB);
response.json({ success: true });
});
function tryRespondToA(responseFromB) {
const requestId = responseFromB.id;
const cachedData = requestIdAndResponseDetailsMap[requestId];
if(cachedData === undefined) {
return;
}
delete requestIdAndResponseDetailsMap[requestId];
clearTimeout(cachedData.timerReference);
cachedData.response.json(responseFromB);
}
function cacheServiceAResponseWithTimeout(requestId, response) {
const timerReference = setTimeout(function timerCallback() {
const cachedData = requestIdAndResponseDetailsMap[requestId];
delete requestIdAndResponseDetailsMap[requestId];
cachedData.response.json({ message: 'Service B request timed out' });
}, TIMEOUT_IN_MILLISECONDS);
requestIdAndResponseDetailsMap[requestId] = { response, timerReference };
}https://stackoverflow.com/questions/72126225
复制相似问题