文章归档

High performance Network Programming

Event-driven architecture, state machines et al.

http://250bpm.com/blog:25

In my previous blog post I've described the problems with callback-based architectures and hinted that the solution may be replacing the callbacks by events and state machines. In this post I would like to discuss the proposed solution in more detail. Specifically, I am going to define what the events and state machines actually are and explain why they are useful.

While the article may be used as an intro to nanomsg's internal architecture it can be also be though of as an opinion piece of possible interest to anybody dealing with event-driven architectures and/or

»» 继续阅读全文

zeroqp, make the server network programming sample and interesting.

zeroqp 是我这两天做的一个小东西。将传统的服务器网络编程转为服务化。zeroqp适合特定的场景,比如我自身的需求。所以zeroqp不是万能的。在其他更多的场合可能反而会令程序变得更加蹩脚。用自己的工具,解决自己的问题。好吧。我承认我又在意淫了。。。

zeroqp 主要有三个简单的API,zeroqp_open(), zeroq_ctl(), zeroqp_wait()

zeroqp_open() 会返回一个专用的描述符,但是并不是一个真正的文件句柄,自然不能用read() write()等系统调用去操作它。zeroqp_ctl() 函数用来向系统注册一个服务,或者删除一个服务。而只要 zeroqp_wait() 一旦执行,系统就会处于监听状态。zeroqp 会启动所有的服务并打开相应的端口,等待客户端进行链接。我们需要做的,仅仅是在zeroqp_wait()启动之前注册一些服务而已。

  1. int32_t zeroqp_ctl(int32_t zfd, int32_t op, struct zeroqp_service *zs);
  2. #define ZEROQP_CTL_ADD 0x01
  3. #define ZEROQP_CTL_DEL 0x02

服务是由结构提 struct zeroqp_service 装载的,在安装服务之前需要一些服务的基本信息,struct zeroqp_service 的结构如下,

  1. struct zeroqp_service {
  2. int8_t inet_addr[INET_ADDRSTRLEN];
  3. int32_t inet_port;
  4. int8_t zqp_srv[ZQPS_NAMESTRLEN];
  5. _srv_callback *zqp_cbfunc;
  6. }

inet_addr 字段,保存的是IP地址串,可以是IPv4也可以是IPv6,inet_port为该服务器上的某个端口,zqp_srv是需要注册的服务名字,是zeroqp_service的唯一标识。zqp_cbfunc是服务的回调函数。

zeroqp 所有的服务都是异步执行的,单线程,适合快速响应的需求,如IO密集型服务,不适合计算密集型的场景。不过大家可以改成自己的,分享一下就更好了。

举个简单的例子来描述一下zeroqp的用途:

某个公司有个客服部门,主要的工作就是向客户提供服务。至于提供什么服务,是由公司来决定的。比如客户需要维修电脑,会先打个电话给该公司的客服部门,该公司的客服部门接受到需求之后,先分析这个服务是不是我们可以提供的,如果可以,就转交到相应的人员去处理,如果不是,这个过程就结束了。

在这里,公司就是使用zeroqp的开发人员,你可以给你的server定制各种服务,接受服务请求是epoll来异步通知的。struct zeroqp_service 结构的作用是相当于告诉操作系统,我需要在某个IP地址和端口上打开一条热线电话。实际上tcp_listen()了一个监听端口。然后在这个端口上绑定各种定制的服务。

zeroqp 允许你在同一个IP地址和端口上安装不同的服务。

zeroqp 同样允许你在不同的IP地址和端口上安装相同的服务。

甚至,zeroqp 允许你在相同的IP地址和不同的端口上安装相同的服务。。。哈哈,混乱了吧。。。

其实我知道你只有一个IP,所以zeroqp就是说,让你在不同的端口安装不同的服务,每个端口有自己的服务队列,不同端口的服务之间是相互独立的,不受影响的。

_srv_callback *zqp_cbfunc; zqp_cbfunc是服务执行的回调函数,就是说如果某个客户端链接上来了,需要请求某个服务,就执行这个callback function()。zeroqp 会自动分析和提取客户端提供的各种参数,然后通过 _srv_callback 的入口 argc 和 argv 传入给 cbfunc。

_srv_callback(int32_t fd, int32_t argc, slice **argv);

比如说,我在server上安装了一个名为 sum 的服务,专门负责计算各个参数的和。然后客户端链接server,需要使用这种服务,client提供了三个参数 23,43,33,当server检测到有需求请求时,分析这个请求是哪个服务的然后转向执行相应的回调函数,也就是上面的_srv_callback实例对象。client提供的参数会通过字符串传入 _srv_callback 里。在这里 argc = 3, argv[0]->data = "23",argv[1]->data =

»» 继续阅读全文