自己用到的RPC通信原理简述

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,接着处理连接请求-->处理读事件-->处理写事件-->等待关闭的连接处理-->闲置连接处理等。

需要考虑的场景:

  • 是否要重连
  • 何时重连
  • 超时设置
  • 连接数设置
  • 闲置连接处理
  • 请求失败重试  

实现起来还是很复杂的,还要加上分布式考虑,服务发布的考虑等等。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值