问题:在一问一答服务器上,客户端发来一个请求,服务器向其他服务器请求其他数据,最后汇总。服务器所有都是非阻塞操作。

 思考,如何将这些离散的逻辑集中起来?让逻辑更加清晰呢?

 

    这里我使用有限状态机来将逻辑封装起来。每个状态机一个入口和一个出口,推送数据进去,使状态改变。获得数据和数据发送的目标。在一问一答的模式下,目标为客户,也就意味着状态结束了。

   状态机内部无需关心源数据从哪里来,目标数据往哪里去。只需要关心源数据什么格式,目标数据什么格式,需要些什么数据,发往逻辑上的目标是哪里。

   这样做,就可以将跟服务器环境有关的所有东西 和 业务逻辑所有东西隔离开来。在状态机这边,每次想要获得其他服务器的数据,就准备相关数据(请求所需要的数据,和目标) 然后结束,底层查看目标,并获得数据(并不理会数据的意义)。然后获得目标ip,连接,发送(或使用连接池)。接收到数据后,压入状态机。

   下一步要考虑的是,不同状态机里面有一些状态是相同的。如判断是否登陆(sessionid向登陆服务器查询),这个过程可能在很多地方都有用,如果按照这样就会出现大量重复代码。引入子状态机,子状态机通过引用,共用父状态机的数据(为了多个子状态机的数据传递)。比如子状态机A通过sessionid获得userid,子状态机B通过userid获得userinfo。这里,A不认识B,A要怎样将userid给B呢?故有,A和B都使用同一个userid。这样问题就解决了。

  下一个问题就是子状态跳转问题,这里就让人联想到数据结构里的图,自然就可以解决了。比如A成功就跳到B,不成功则跳到C。这样,在主状态机里面,只需要将这个状态图构建出来。就如创建XX目标YY状态跳到XX。

  将整个引擎构建出来的话,就可以只编写状态转换(子状态机足够多)。但不编写额外的子状态机。