罪一:网络传输方式问题。传统的rpc框架或者是基于rmi等方式的远程服务调用采用的是同步阻塞i/o,当客户端的并发或者网络延时增大之后,同步阻塞i/o会频繁的wait导致i/o线程经常性阻塞,由于线程无法高效的工作,i/o处理能力自然下降。
采用bio通讯模型的服务端,通常是由一个独立的acceptor线程负责监听客户端的连接,接受到客户端的连接之后,为其创建一个心的线程处理请求消息,处理完成之后,返回应答消息给客户端,线程销毁,这就是典型的一个请求一应答模型。该架构最大的问题就是不具备弹性的伸缩能力,当并发访问增加之后,服务线程个数和并发访问数成线性正比,由于线程是java虚拟机非常宝贵的资源,当线程膨胀之后,系统的性能急剧下降。随着并发量的增加,可能会导致句柄溢出,线程堆栈溢出等问题,并最终导致服务器宕机。
罪二:序列化问题。java序列化存在一下几个典型的问题:
a)java序列化是其内部一个对象的编码技术,无法跨语言,例如异构系统之间的对接,java序列化的码流需要通过其它的语言反序列化成原始对象,目前很难支持。
b)相比其它的开源的序列化框架,java序列化的码流太大,无论网络传输还是持久化道磁盘,都会导致额外的资源占用。
c)序列化的性能比较的差,资源的占有率高,主要是cpu资源的占用比较高。
罪三:线程模型问题。由于采用的是同步阻塞i/o,导致每个tcp的连接都会被占用1个线程,由于线程资源是jvm虚拟机非常宝贵的资源,当i/o读写阻塞导致线程无法被释放时,会导致系统性能急剧下降,严重的甚至会导致虚拟机无法创建心的线程。