服务器设计之请求处理框架

上一篇讲了工作线程池的设计,这一篇讲讲工作线程前面的事:如何写Server Front-end。


有三个主要类:ObMySQLServer,ObMySQLCallback,ObMySQLCommandQueueThread

ObMySQLServer负责和网络框架libeasy进行交互,具体交互的桥梁通过ObMySQLCallback来实现。首先ObMySQLServer将ObMySQLCallback注册到easy框架中(easy暴露了encode、decode、process、on_disconnect、on_connect、cleanup几个数据处理接口),easy框架收到请求后会回调ObMySQLCallback中的函数,ObMySQLCallback一方面维护easy的状态,一方面会将请求路由到ObMySQLServer,ObMySQLServer中有一整套处理请求的函数,它会判断请求类型,然后调用对应函数。

为了多线程处理并发请求,请求路由到ObMySQLServer后它并不是立即处理请求,而是将请求推送到ObMySQLCommandQueueThread线程池上去,唤醒一个线程来处理该请求。ObMySQLCommandQueueThread主要是提供线程资源,具体如何处理请求它也并不知道,它会委托ObMySQLPacketQueueHandler来处理。OceanBase中为了简化处理,ObMySQLServer实现了ObMySQLPacketQueueHandler接口。也就是说,转了一圈,请求最终还是被ObMySQLServer处理的,只不过切换到了另一个线程上下文中。


脱离OceanBase背景,再捋一遍如何写Server front-end。

首先要写一个server架子,这个server首先进行以下初始化:

  • 创建线程池,启动工作线程。为了共享状态(一些singleton的proxy、manager),server的指针可以在启动阶段就传递给工作线程,然后在工作线程中回调server提供的方法。
  • 调用网络框架的接口监听端口

一旦有请求到来,就从线程池中选择一个工作线程,将请求丢给它处理。

一般,线程池被实现为工作队列,没有请求时工作线程都等待在工作队列上,请求到来时工作线程被唤醒,并从队列上取出一个任务进行处理。提交一个请求到工作队列用queue.push(),从工作队列取出一个请求进行处理用queue.pop()。

工作队列有几个重要接口:

  • init(int thread_count)  -- 初始化工作队列,设定队列中的工作线程数
  • start()  -- 启动工作队列,主要是启动工作线程
  • stop()  -- 停止所有工作线程
  • push(packet)  --- 将请求放入工作队列,唤醒工作线程处理
  • run()  --- 工作线程主循环,用于等待请求、处理请求、等待请求、处理请求
实现工作队列需要对一对函数有比较深刻的认识pthread_cond_wait(), pthread_cond_signal(),通常在大型软件中你不会直接看到这两个函数,他们被封装起来了。在OB中它被封装到了 tbsys::CThreadCond

下一篇预告:如何写网络框架。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值