sogou / workflow

C++ Parallel Computing and Asynchronous Networking Framework

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Mysql连接数过大问题和字符串转义问题。

csyourui opened this issue · comments

commented

hi 我最近在使用workflow中遇到了两个问题:

  1. 在每一个Http回调中启动一次mysql的task任务,使用时发现当http调用过大时会导致db连接数过大占满了db,workflow中可以通过什么途径限制db连接上限?这块有什么优化空间吗?
  2. 在使用Mysql的set_query()方法时,发现插入字符串未经过转义的问题,请问workflow有实现EscapeString方法吗?

你好,第一个问题,控制并发连接数有几个方法可以解决:

最简单的,可以参考https://github.com/sogou/workflow/blob/master/docs/about-config.md 看看配置单个目标的最大连接数,学着里边的例子把一个远端目标的连接数改小:

struct WFGlobalSettings settings = GLOBAL_SETTINGS_DEFAULT;
settings.endpoint_params. max_connections = 50;
WORKFLOW_library_init(&settings);

注意这样会修改掉全局的配置。

另外比较建议的方式是自己控制http发出的mysql请求并发数,workflow中的series就是可以用来做任务的控制的。还有如果只想改一个目标的settings,也可以把这个目标地址通过upstream的方式配置,就可以独享自己的一份settings了,参考这里:https://github.com/sogou/workflow/blob/master/docs/about-upstream.md

第二个问题,mysql的set_query()目前没有提供转义功能,需要你先转好。我看了下,官方客户端这个函数的实现也许还可能需要和当前mysql的当前字符集转义字符串有关?所以我们需要调研一下再决定是否支持~

通过改最大连接数的方法不太好,会导致MySQL任务失败。
最佳方法是用WFResourcePool。
https://github.com/sogou/workflow/blob/master/docs/about-conditional.md

直接给你写个demo吧:

#include "workflow/WFResourcePool.h"
#include "workflow/WFTaskFactory.h"
#include "workflow/WFHtttpServer.h"
#include "workflow/MySQLResult.h"

WFResourcePool respool(50);  // 假设最大50个并发

void mysql_callback(WFMySQLTask *task)
{
    respool.post(NULL);  // 归还资源
    ...
}

void process(WFHttpTask *server_task)
{
    WFMySQLTask *mysql_task = WFTaskFactory::create_mysql_task(..., mysql_callback);
    WFConditional *cond = respool.get(mysql_task);
    series_of(server_task)->push_back(cond);
}

int main()
{
    WFHttpServer(process);
    ....
}

比你原来的代码只多两行:
1、产生mysql_task之后,通过respool.get得到一个条件任务。用条件任务代替mysql_task。
2、mysql_callback里,先通过respool.post归还资源。

commented

明白了,辛苦各位了