Silly多端口监听支持

前两天在编写一个新服务器程序时才意识到,多台不同类型的服务器相互通信,服务器仅监听一个端口号是非常不方便的,比如服务器集群中的ctrl_server需要接受多种不同的服务器建立链接,让所有链接去涌入同一个端口显然是不明智的,这时候就需要监听多个不同的端口。

让我纠结了两天的问题是到底该以怎么样的方式增加多端口支持。

首先先到的是,去掉配置文件中port的支持,增加一个listen API让lua逻辑自己去指定监听哪几个端口号,但是有一个明显的问题,多个worker现在启动时加载同一套lua代码,一个worker监听成功就会导致,其他worker失败。

现在面临着两个旋择,一个就是让配置文件可以没个worker指定一个bootstrap,但这样会有一个问题,多个worker并不能通信,有可能两个端口的命令需要操作一块共享的数据,因此并不能实现。

还有一个让lua逻辑判断只有workid为零时才真的去监听,其他worker仅仅注册一下相关端口的处理函数即可。但总感觉这种设计有点bad taste的感觉。

还有一种方式就是让silly底层可以支持对一个端口多次监听,但如果lua逻辑是在刚启动就进行端口监听(大多数情况也的确如此),那么多个worker同时调用listen api时就要处理并发问题,这样事情就稍微变得复杂一点了。

为了简化设计,我修改了为lua提供的listen API语义,此api仅仅向socket注册不同端口号的处理函数并不实际进行监听操作,silly根据配置文件中配置的端口号组进行监听,当从某个端口号的listen fd accept出socket向socket.lua发消息时,将这个socket来源于哪个监听端口号一并发出。

这样socket.lua就可以根据端口号来为这个socket fd选择合适的处理函数。

为了避免lua中listen的端口号和配置文件指定的端口号不同的错误,silly的config文件在指定端口号组时需要为每个端口号起一个名字,在lua代码中listen传入的参数是port的名字,而并非是数字。


11月4日补充:

如上文中的ctrl_server即需要接受client请求又需要与其他server进行通信。

client与server之间的通信是不被信任的,所以所有的通信数据包需要进行加密处理,而server与server之间的通信是可以相互信任的,所以都是明文发送。因此一般的服务器集架设过程中会为每台服务器配置2块网卡,一块网卡接入公网为client服务器,另一块网卡用于与其他服务器组成一个局域网。

这样做可以不但可以增加server之间通信的安全性,还可以提高server之间通信的效率。

仔细回忆一两台计算机通过网络通信的流程。1台电脑发出数据包后, 数据包首先到达网关,网关根据去目的ip找到相应的计算机,然后将数据包转到给相应的计算机。

如果server之间使用公网ip进行通信,那么就必须要经过电信的网关,这样数据包不但会有被拦截的风险,还会增加不必要的开销。毕竟相比局域网的网关来说,电信的网关实在太远了。

为了防止有恶意链接从公网接入开放给其他服务器进行通信的接口, 在listen时必须能够支持仅对某块网卡上的特定端口进行监听。

因此silly除了要增加多端口监听支持外, 还需要增加对指针ip地址的某端口进行监听。当我们需要针对任何网卡进行监听时,将ip地址设为0.0.0.0即可表示INADDR_ANY.

发表评论

8 + two =