分享一个纯异步 MySQL 客户端

2022-02-07 21:38:20 +08:00
 cpprookie

最近发现了一个简单易用,性能非常强大的纯异步 mysql 客户端 -- c++ Workflow ,无需依赖任何库。

项目地址 : https://github.com/sogou/workflow

先看看简单例子如何使用

#include "workflow/Workflow.h"
#include "workflow/WFTaskFactory.h"
#include "workflow/MySQLResult.h"

using namespace protocol;

int main()
{
    std::string url = "mysql://root:123@localhost";
    WFMySQLTask *task = WFTaskFactory::create_mysql_task(url, 0, [](WFMySQLTask *task)
    {
        MySQLResponse *resp = task->get_resp();
        MySQLResultCursor cursor(resp);
        std::vector<MySQLCell> arr;
        while (cursor.fetch_row(arr))
        {
            fprintf(stderr, "[%s]\n", arr[0].as_string().c_str());
        }
    });
    task->get_req()->set_query("SHOW DATABASES");
    task->start();
    getchar();
}

创建 MySQL 任务非常简单,有如下几个核心元素

  1. url 参数,mysql://uname:pwd@host:port/dbname ,还支持以 SSL 连接访问 MySQL ,mysqls://

  2. set_query ,执行的 SQL 语句;

  3. callback ,异步返回结果的回调

  4. 结果集

一个 MySQLResponse 里包含若干 ResultSet ,一个 ResultSet 包含若干 Row, 一个 Row 包含若干 Field ,很轻松的进行结果集处理,规避掉各种细节。

除了常见的 sql 的增删改查、建库删库、建表删表、预处理等等,还支持多语句多结果集,事务等其他的功能特性。

所有命令都可以拼接到一起通过 set_query() 传给 WFMySQLTask (包括 INSERT/UPDATE/SELECT/DELETE/PREPARE/CALL )。

举个例子

req->set_query("SELECT * FROM table1; CALL procedure1(); INSERT INTO table3 (id) VALUES (1);");

在返回的 MySQL Response 中,有多个 ResultSet ,遍历即可

作为 workflow 原生自有协议的一部分,它与任务流,服务治理能特性完美融合,与 http ,redis ,计算任务统一使用,并能够通过 upstream 轻松实现读写分离。通过 workflow 灵活的任务流机制,支持 MySQL 存储过程。

高性能

除了易用性外,最为重要的就是 workflow 的高性能。在合理配置下,每秒能处理几万次 MySQL 请求。

在传统的 MySQL 客户端,往往是同步阻塞式的,在向 MySQL 发送请求到 MySQL 回复响应的过程中,整个线程处于阻塞等待状态。如果希望提高并发处理能力,往往要设置大量的工作线程,而工作线程的切换,以及临界资源的锁争夺,性能会有较大的影响。

而作为异步 MySQL 客户端,向 MySQL 发送请求之后,线程就可以执行本地其他异步调用,或者发送下一个 MySQL 请求,无任何阻塞,用很少的线程,就能拥有很高的并发处理能力。

更多信息请看:

Workflow MySQL 中文文档 : https://github.com/sogou/workflow/blob/master/docs/tutorial-12-mysql_cli.md

2488 次点击
所在节点    MySQL
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/832323

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX