# mycat 2.0 架构（architecture draft）

author:junwen 2019-7-22

mycat2

Proxy模块实现了mysql的通讯协议框架，关于报文解析，发送，各种mysql命令的实现都是该模块的职责。但是这是不够，应该对外提供一个抽象的接口，该接口要完成两个功能

作为服务器，可以把结果集对象作为返回结果集的接口，我们称之为服务器模式接口，该接口在使用上是同步方法的用法，但是实际上报文发送是异步的。该接口还要完成一个非常重要的功能，屏蔽通讯框架之间的差异。

作为mysql，客户端发送请求然后获得响应，异步客户端模式，使用回调接收结果集，可以每行接收，也可以在结果集接收完毕再处理。

基于上述功能，把客户端获得的响应写入返回结果集的接口

混乱地，Proxy并不能特别纯粹地仅仅作为一个通讯框架

客户端登录的时候需要用到mysql服务器的变量信息

作为mysql客户端，也需要保存一些当前连接相关的变量

同上，作为mysql服务器会话，需要保存客户端设置的一些连接相关的变量

proxy使用reactor架构，读写线程SQL解析和读写同一个线程，不进行SQL复杂的处理，简单的分析改写，转发对应的mysql连接，不进行多个节点的结果集合拼



proxy的线程模型决定了它不能处理耗时的功能逻辑。耗时的功能逻辑在称为Grid的模块里面实现



Gird实现Proxy 服务器模式接口，Grid作为一个独立模块，处理耗时的任务

1.如果它在proxy环境里面运行，则使用多线程模式运行，一个线程对应一个会话

此时proxy的reactor 线程完整称为IO线程，但是Grid也可以把处理响应的任务投递回去reactor线程处理 

2.Grid在另外一个进程里面运行，通过IPC进行通信，IPC之间的心跳协议

3.Grid作为额外的MySQL服务器作为Proxy的后端，使用mycat协议请求，mysql报文响应。


