RPC中的一些问题
1.数据协议
序列化的方式(数据包的大小、序列化的优化)
要支持更多的数据形式(xml,json等等)
---->自定义数据的协议头,自定义数据的结束。
2.IO模型
2.1常见的IO模型
----->同步阻塞IO(Blocking IO):传统的IO模型
----->同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,
非阻塞的IO要求socket被设置为NONBLOCK.这里所说的NIO不是java不是java的NIO库(new io)
----->IO多路复用(IO Multiplexing):Reactor设计模式 也称为异步阻塞IO。
java中的Selector和linux中的epoll都是这种模式
----->异步IO(Asynchronous IO) :Proactor设计模式 异步非阻塞IO。
2.2同步和异步 : 用户线程和内核的交互方式
---->同步是指用户线程发起IO请求后,需要等待或者轮询你IO操作完成后才能继续执行
---->异步是指用户线程发起IO请求后,继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册回调函数
2.3阻塞和非阻塞
用户线程调用内核IO操作的方式,阻塞是指IO操作需要彻底完成后才能返回到用户空间,
非阻塞是指IO操作被调用后立即返回用户一个状态,无需等到IO操作彻底完成后
2.4 同步阻塞IO
用户线程通过系统调用read发起IO操作,由用户空间转换到内核空间,
内核等待数据包达到后,然后将接收到的数据拷贝到用户空间,完成read操作
伪代码:{
read(socket,buffer);
process(buffer)
}
用户需要等待read将socket中的数据读取到buffer后,才能继续处理接收的数据,
整个IO请求的过程中,用户线程是被苏泽的,导致用户在发起IO请求时,不能做
任何事情,对CPU利用不够。
2.5同步非阻塞IO
在同步阻塞IO的基础上将Socket设置NONBLOCK。这样做用户线程可以在发起IO请求后立即返回.
用户线程需要不断的发起IO请求,直到数据达到后,才能真正读取到数据,继续执行
伪代码:{
while(read(socket,buffer)!=SUCCESS){
process(buffer);
}
}
户线程可以在发起IO请求后立即返回.但是为了得到数据,仍需要不断轮询,重复请求,
消耗了大量的CPU资源。很少直接使用这种模型
2.6 多路复用IO
IO多路复用建立在内核提供的多路分离函数select基础之上的,使用select
函数可以避免同步非阻塞IO模型中的轮询等待问题。
用户首先将需要进行的IO操作的socket添加到select中,然后阻塞等待select系统调用返回。
当数据达到时,socket被激活,select函数返回。用户线程正式发起read请求,读取数据并
继续执行 看起来比同步阻塞模型效率更差。但是,使用select以后最大的优势是用户可以
在一个线程内同时处理多个socket的io请求,用户可以注册同个socket,然后不断调用select
读取被激活的socket.达到同一个线程内同时处理多个IO请求
伪代码{
select(socket);
while(1){
sockets = select();
for(Socket socket : sockets){
if(can_read(socket)){
read(socket,buffer);
process(buffer);
}
}
}
}
IO多路复用模型使用了Reactor设计模式实现了这一机制
2.7 异步IO
“真正“的异步IO需要操作系统更强的支持.
异步IO模型中,当用户线程收到通知时,数据已经被内核读取完毕,并放在了用户线程
指定的缓存区内,内核在IO完成后通知用户线程直接使用即可。
操作系统支持并非特别完善,更多采用的是IO多路复用模拟异步IO方式
3.线程模型
相关推荐
基于java的开发源码-高性能RPC框架 nfs-rpc.zip 基于java的开发源码-高性能RPC框架 nfs-rpc.zip 基于java的开发源码-高性能RPC框架 nfs-rpc.zip 基于java的开发源码-高性能RPC框架 nfs-rpc.zip 基于java的开发源码-...
基于Java的源码-高性能RPC框架 nfs-rpc.zip
基于Java的高性能RPC框架 nfs-rpc.zip
基于java的高性能RPC框架 nfs-rpc.zip
基于Java的实例源码-高性能RPC框架 nfs-rpc.zip
java源码:高性能RPC框架 nfs-rpc.rar
jsonrpc是一个基于Java的高性能开源RPC框架
阿里开源的额高性能 RPC 框架。.zip,Apache Dubbo is a high-performance, java based, open source RPC framework.
gRPC 是一个高性能、开源、通用的 RPC 框架,面向移动和 HTTP/2 设计,是由谷歌发布的首款基于 Protocol Buffers 的 RPC 框架。 gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用...
sofa-rpc,sofarpc是一个高性能、高扩展性、生产级的java rpc框架。.zip
Apache Dubbo是一个用Java编写的高性能,轻量级的开源RPC框架。 它提供了三个关键功能:基于接口的远程呼叫,负载平衡和容错以及自动服务注册和发现。 Apache Dubbo的构建旨在立即支持多个服务注册表和负载平衡策略...
sofa-rpc,SOFARPC是一种高性能、高扩展性、生产级的Java RPC框架。.zip
SOFARPC 是一个高可扩展性、高性能、生产级的 Java RPC 框架。在蚂蚁金服 SOFARPC 已经经历了十多年及五代版本的发展。SOFARPC 致力于简化应用之间的 RPC 调用,为应用提供方便透明、稳定高效的点对点远程服务调用...
项目名称 ...支持Spring Boot Starter,也支持Spring Cloud的服务注册发现,使用brpc-java替换Feign HTTP调用,提升性能。 支持服务器推送机制,并支持扩展服务器推送协议。 支持多种命名服务,例如Zookee
SOFARPC 是一个高可扩展性、高性能、生产级的 Java RPC 框架。在蚂蚁金服 SOFARPC 已经经历了十多年及五代版本的发展。SOFARPC 致力于简化应用之间的 RPC 调用,为应用提供方便透明、稳定高效的点对点远程服务调用...
高性能RPC框架 nfs-rpc源码示例
SOFARPC 是一个高可扩展性、高性能、生产级的 Java RPC 框架。在蚂蚁金服 SOFARPC 已经经历了十多年及五代版本的发展。SOFARPC 致力于简化应用之间的 RPC 调用,为应用提供方便透明、稳定高效的点对点远程服务调用...
该库提供Java Spring应用程序之间的RPC通信。 主要特点: Apache ZooKeeper(带有TLSv1.2)用于服务发现 同步和异步RPC调用-通信类型由客户端而不是服务器确定 一个接口可以有多个服务器实现-客户端通过在请求中...
技术分享:纯Java的高性能长连接RPC解决方案