sogou/workflow

server端如何复用一组消息的context?

yangxuanyong opened this issue · 2 comments

WorkFlow 是一个很好的异步框架,在client端可以通过 series.context的复用,将上下文在相关消息流程(如一个功能点需要一组消息完成,而非单一消息,这一组消息需要共享一个上下文)中流转,切实满足了多线程异步环境下的编程需求;但是server端,series和收到的消息都是割裂的 ,当server端收到clientA的一组消息时,这一组消息表现为多个series和多个task,WF框架是否能提供一个适合server端这种场景的context?

首先,clientA发给server的请求并不能保证是同一个连接,这时候要维护上下文信息的话是不是需要类似http cookie的东西?
如果是要记录同一个连接上的信息,我们是可以获得连接上下文的。

#include "workflow/WFConnection.h"

void process(WFHttpTask *task)
{
    WFConnection *conn = task->get_connection();
    CTX *ctx = (CTX *)conn->get_context();

    if (ctx == nullptr)
    {
        ctx = new CTX;
        conn->set_context(ctx, [](void *ctx) { delete (CTX *)ctx; });
    }
    ...
}

关于链接上下文是有一个文档的,你看看能不能满足你的需求。
https://github.com/sogou/workflow/blob/master/docs/about-connection-context.md
process里使用连接上下文比较简单,无需判断get_connection()的返回值,也无需考虑竞争的情况。

WFConnection context 配合keep-alive 可以临时解决一下;综合来看,还是建立一个全局的context map,以cookie或token做关键字这种传统方案更适合大多数场景。