最近发现了一个简单易用,性能非常强大的纯异步 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 任务非常简单,有如下几个核心元素
url 参数,mysql://uname:pwd@host:port/dbname ,还支持以 SSL 连接访问 MySQL ,mysqls://
set_query ,执行的 SQL 语句;
callback ,异步返回结果的回调
结果集
一个 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