-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Open
Labels
documentationImprovements or additions to documentationImprovements or additions to documentation
Description
场景
服务端是一个 PyTorch C++ 实现的 CTR 预估的服务,预估之前需要去 KV(类似 redis) 里读取特征作为 CTR 预估的输入。一个客户端请求可能读一次,也可能读两次 KV 。
详细流程可能是这样: 拿到请求体 -> 解析 -> 读 kv -> 产生模型输入 -> CTR 模型 -> calibration 模型 -> 其他逻辑 -> 返回 。
现在的实现
看了下 demo 然后就写了大概这样的逻辑
static WFFacilities::WaitGroup wait_group(1);
void sig_handler(int signo) { wait_group.done(); }
int main(int argc, char *argv[]) {
// .... something init
unsigned short port = 8083;
signal(SIGINT, sig_handler);
signal(SIGTERM, sig_handler);
WFHttpServer server(process);
if (server.start(port) == 0) {
wait_group.wait();
server.stop();
} else {
perror("Cannot start server");
exit(1);
}
return 0;
}
void process(WFHttpTask *server_task) {
protocol::HttpRequest *req = server_task->get_req();
protocol::HttpResponse *resp = server_task->get_resp();
long long seq = server_task->get_task_seq();
resp->set_http_version("HTTP/1.1");
resp->set_status_code("200");
std::string body;
auto uri = req->get_request_uri();
if (std::strcmp(uri, "/cvr") == 0) {
const void *body;
size_t size;
req->get_parsed_body(&body, &size);
std::string req_body = static_cast<const char *>(body);
std::string response_body = "";
MODL_MANAGER->predict(std::move(req_body), response_body);
resp->append_output_body(response_body.data(), response_body.size());
} else {
resp->set_status_code("404");
}
}
遇到的问题
由于在 MODL_MANAGER->predict(std::move(req_body), response_body); 里面实现了等待读取 KV 的逻辑和模型预估的部分。但读 KV 有可能会卡住(看了很久还不是很理解这个问题)。
想不占线程的读 KV,不知道怎么实现合适。一番讨论发现从我开始用 workflow 的时候就好像用错了,似乎在最开始就应该把逻辑分成不同的 task 。所以想是不是有什么最佳的实践。
补充一下, workflow 线上用了一年多了,在我要读 kv 之前都没任何问题, 50 ms 的预估时间,之前尝试过很多都不能很好的解决超时, workflow 可以..... 目前 p99 30ms cpu 打满基本不超时。
holmes1412 and ningyuwhut
Metadata
Metadata
Assignees
Labels
documentationImprovements or additions to documentationImprovements or additions to documentation