我一直觉得datasnap不适合做REST,因为http的东西用indy来做容器,承受力差了点是一方面,另外最主要的是比起java的世界delphi代码不好解耦(VCL for Web没人用我想这也是个主要原因吧)。今天看TDSHTTPService,觉得这个控件还是有点妙用。
普通情况下TDSHTTPService挂这个DSServer,以发布要公布的服务方法。这是应该有的功能。
我这里想说的是TDSHTTPService不挂DSServer,设置DSHostname 和DSPort后居然可以做转发。
有了这个功能,我们就能做一个简单的容灾切换(Failover):前面一个机器D,提供http的服务,程序收到请求后,直接通过tcp连接后面真正干活的机器A的服务方法; 如果机器A不行了,修改DSHostname 和DSPort,将请求转发到机器B。看到这里是不是想datasnap要是能做简单集群就好了,其实也是应该可行的:既然能转发,那么根据一定规则将请求转发到不同机器上好了。
这样相对来说,datasnap来做服务,就算是简单的容灾啦,进一步如果机器A好了,要切回去, 也应该没问题。
切题时,HTTP Session在机器D上面,还得注意Session的延续。要延续Session,就要看TDSHTTPService的实现Session的方法。
TDSHTTPService其实是个Transport,只负责传输的,当然由于是http的,他得负责解析http。实现http解析的是TDSHTTPService的HttpServer,是TDSHTTPServer类,负责解析Http。TDSHTTPServer有一个属性TunnelService,是TDSTunnelService类,它具体的负责从Http流里Session的读取写入,截取TDSTunnelService的事件,来做Session的延续。
XE2里EMBT提供了一个Failover的例子,可以参考。
不过TDSHTTPService的具体实现思路我还没弄清楚,它是如何转发的还待看代码。
没有评论:
发表评论