首页 > 解决方案 > 长流程的 SignalR:发送中间消息

问题描述

我正在使用 SignalR 在服务器端开始长时间计算,并在结果可用时向客户端发布消息。输入绑定是一个 HTTP 请求。

我希望能够发回多条消息,以便通知客户端该过程的不同步骤(例如,计算开始、计算结束等)。

我尝试将不同的消息推送到 context.bindings.signalRMessages 但我看到所有内容都在整个过程结束时一起发送。有没有办法在不同的时间发送多条消息?

另一个相关问题是我在客户端的 HTTP 请求一直卡住,直到进程结束。我希望能够尽早发布快速回复,因为我通过 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) {
        // ....
    }

};

我做错了什么还是不可能?

谢谢!

标签: javascriptazuresignalrazure-functions

解决方案


这对于简单的 HTTP 触发函数是不可能的,因为绑定仅在函数执行完成后才解析。

对于您的方案,持久功能将是完美的选择。

您仍然会有一个 HTTP 触发函数(客户端函数)开始编排并立即返回。在编排函数中,您将有单独的活动函数用于处理和使用 SignalR 绑定向客户端发送更新。


推荐阅读