具有长过程的 SignalR:发送中间消息
SignalR with long process: send intermediate messages
我正在使用 SignalR 在服务器端开始长时间计算,并在结果可用时 post 向客户端发送消息。
输入绑定是一个 HTTP 请求。
我希望能够发回多条消息,以便通知客户端流程的不同步骤(例如,计算开始、计算结束等)。
我尝试将不同的消息推送到 context.bindings.signalRMessages,但我发现在整个过程结束时所有内容都一起发送。有没有办法在不同时间发送多条消息?
另一个相关问题是我在客户端的 HTTP 请求一直卡在进程结束之前。我希望能够尽早 post 快速响应,因为我是通过 signalR 消息获得响应的。
这是我的服务器代码:
module.exports = async function(context, req) {
let ID = context.bindingData.invocationId;
context.bindings.signalRMessages = [];
const messageQueue = context.bindings.signalRMessages;
var postMessage = (message) => {
message.userId = req.query.userId;
message.isPrivate = true;
messageQueue.push(message);
};
let preProcessData = preProcess(req.body.input);
let startMessage = {
"target": "optimStart",
"arguments": [{ preProcessData: preProcessData }]
};
postMessage(startMessage); // <<<< I want this one to be sent immediately
try {
let optimOutput = await computeOptim(req.body.input, ID); // that's the long process
let response = {
optimId: ID,
optimOutput: optimOutput
};
let optimCompleteMessage = {
"target": "optimComplete",
"arguments": [response]
};
postMessage(optimCompleteMessage);
} catch (err) {
// ....
}
};
我做错了什么还是不可能的?
谢谢!
这对于简单的 HTTP 触发函数是不可能的,因为绑定仅在函数执行完成后才解析。
对于您的情况,durable functions 将是完美的选择。
您仍然会有一个 HTTP 触发函数(client function) to start on orchestration and return immediately. In the orchestration function, you would have separate activity functions 用于处理和使用 SignalR 绑定向客户端发送更新。
我正在使用 SignalR 在服务器端开始长时间计算,并在结果可用时 post 向客户端发送消息。 输入绑定是一个 HTTP 请求。
我希望能够发回多条消息,以便通知客户端流程的不同步骤(例如,计算开始、计算结束等)。
我尝试将不同的消息推送到 context.bindings.signalRMessages,但我发现在整个过程结束时所有内容都一起发送。有没有办法在不同时间发送多条消息?
另一个相关问题是我在客户端的 HTTP 请求一直卡在进程结束之前。我希望能够尽早 post 快速响应,因为我是通过 signalR 消息获得响应的。
这是我的服务器代码:
module.exports = async function(context, req) {
let ID = context.bindingData.invocationId;
context.bindings.signalRMessages = [];
const messageQueue = context.bindings.signalRMessages;
var postMessage = (message) => {
message.userId = req.query.userId;
message.isPrivate = true;
messageQueue.push(message);
};
let preProcessData = preProcess(req.body.input);
let startMessage = {
"target": "optimStart",
"arguments": [{ preProcessData: preProcessData }]
};
postMessage(startMessage); // <<<< I want this one to be sent immediately
try {
let optimOutput = await computeOptim(req.body.input, ID); // that's the long process
let response = {
optimId: ID,
optimOutput: optimOutput
};
let optimCompleteMessage = {
"target": "optimComplete",
"arguments": [response]
};
postMessage(optimCompleteMessage);
} catch (err) {
// ....
}
};
我做错了什么还是不可能的?
谢谢!
这对于简单的 HTTP 触发函数是不可能的,因为绑定仅在函数执行完成后才解析。
对于您的情况,durable functions 将是完美的选择。
您仍然会有一个 HTTP 触发函数(client function) to start on orchestration and return immediately. In the orchestration function, you would have separate activity functions 用于处理和使用 SignalR 绑定向客户端发送更新。