1. WS 服务配置 如有雷同,纯属巧合。呵呵。
<attributes http.timeout="5000"
http.connection.timeout="3000"
http.connection.manager.timeout="1000"
max.connections.per.host="30"
max.total.connections="120" />
2. 实现一
其实现是使用的xfire,它底层通过使用httpclient进行web请求发送,因此我们编程界面看到的配置基本都是会传递下去的,如果我们了解了httpclient的各个参数的含义。私下自己查下httpclient的相关参数。
- http.timeout-->http.socket.timeout
- http.connection.htimeout-->http.connection.timeout
- http.connection.manager.timeout-->http.connection-manager.timeout
- max.connections.per.host-->http.connection-manager.max-per-host
- max.total.connections-->http.connection-manager.max-total
httpclient中获取连接的过程大致如下:
- 找空闲连接,当然是看目标ip是否有足够的空闲连接
- 没达到上限(包括集群和目标ip都没有达到上限)就创建和目标ip的连接
- 集群连接达到上限,但是目标ip的连接没有达到上限,同时集群连接中有空闲连接,那么就关闭集群中空闲连接,然后再重新创建目标ip的一个连接
上述过程的操作实体是连接,连接个数个限制是由http.connection-manager.max-per-host和http.connection-manager.max-total两个参数来控制的,前者用来控制这个服务调用(sofa里的服务引用),和服务提供方集群里的任意一台机器最多可以建立多少个连接,后者就是和整个集群最多建立多少个连接
WS存在的问题:
- 传输的对象属性没有getter和setter方法,会报比如找不到writer method等问题
- 传递的对象没有默认的构造函数
- 传递的对象属性声明为Object类型,会导致堆栈溢出
- 传输对象,包括参数和返回值,不能带有太复杂
- c/s接口不一致,且存在方法重载的情况,可能会出现的方法调错的情况
- 服务端异常 404等。
另一种实现 - Apache Mina
业务线程准确请求tr服务的时候,业务线程会负责构建一个Request对象,但不负责对象的序列化过程以及通信过程,但是同步模式下,该业务线程会同步在那里等结果,直到有东西可以返回,这个东西可以是正常的通信结果,也可能是一个超时的异常结果,其中超时的异常结果由一个叫做TimeoutRespScanner的线程塞进去。责对象序列化和通信的是由mina的IO线程来负责的,IO线程数是cpu核数+1,每个IO线程会关联一个Slector对象,这个对象会关注要求它托管的连接的各种读写等事件,该IO线程实现参考SocketIoProcessor$Worker,看了源码会发现其实是一个无线循环顺序做一些操作,每隔1s做一次select,接着处理连接请求-->处理读事件-->处理写事件-->等待关闭的连接处理-->闲置连接处理等。
需要考虑的场景:
- 是否要重连
- 何时重连
- 超时设置
- 连接数设置
- 闲置连接处理
- 请求失败重试
实现起来还是很复杂的,还要加上分布式考虑,服务发布的考虑等等。