具有长过程的 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 绑定向客户端发送更新。