[闻数起舞]gRPC和RSocket之间的区别


[闻数起舞]gRPC和RSocket之间的区别
文章图片
我们一直被问到这个问题 。 通常 , gRPC和RSocket尝试解决不同的问题 。 gRPC是使用HTTP/2的RPC框架 。 RSocket是较低级别的消息传递网络层 。 因此 , 开发人员将直接使用RSocket进行低级交互 , 并可以选择使用RSocket-RPC作为位于RSocket之上的易于使用的RPC层 。
现在 , 让我们更具体地看一下gRPC和RSocket之间的区别 。
OSI层gRPC和RSocket位于堆栈的不同层 。 gRPC位于OSI层7上-在HTTP/2之上构建的RPC层 。 RSocket是OSI5/6层 , 可通过网络对响应流语义进行建模 。 反应性流提供了一种使用反压对异步流进行建模的方法 。 在10,000英尺的视野中 , 您将使用RSocket来构建gRPC之类的东西(例如RSocket-RPC) , 该东西将位于OSI(应用程序)层7 。
协议gRPC不是传统意义上的协议 。 它由HTTP/2标头 , 生成的代码和protobuf中的约定组成 。 跨网络传输的内容中没有足够的信息来确定正在发生的事情 。 例如 , 如果protobuf中存在不匹配项 , 则gRPC可以通过一元调用来调用流 。 gRPC设计类似于Web服务 。
RSocket是具有正式定义的5/6层二进制协议 。 您无需生成代码来确定RSocket发生了什么—您只需了解协议即可 。
有效载荷对于您要发送的有效载荷 , gRPC持谨慎态度-出于所有意图和目的 , 它都是protobuf 。
RSocket不自觉 , 允许您发送不透明字节 。
优点发送字节更加灵活 , 因为您不必定义用于发送数据的协议 。 RSocket可用于传输数据库查询 , 就像传输图片一样容易 。
网络传输gRPC旨在与HTTP/2语义一起使用 。 如果要通过其他传输方式发送它 , 则必须模仿HTTP/2语义 。 在整个网络中 , 它有效地绑定到HTTP/2和TCP 。
RSocket只需要一个双工连接即可发送和接收字节 。 这可以是TCP , 文件 , WebSockets等 。 在RSocket中 , 很容易通过WebSockets从浏览器接收调用 , 然后使用TCP调用服务器 。 交互将感觉透明 , 并且与开发人员相同 。
浏览器支持gRPC在Web浏览器中不起作用 。 Web浏览器的支持要求生成和部署其他代码 。
RSocket通过Websockets在Web浏览器中工作 。 不需要任何新代码-只需启动一个接受WebSocket连接的RSocket服务器即可 。
客户端/服务器交互gRPC具有传统的客户端/服务器模型 , 因为它基于HTTP/2和RPC语义 。 在gRPC中 , 客户端连接到服务器 , 但是服务器无法调用客户端 。 此外 , 由于gRPC是RPC层 , 因此您只能进行在protobuf文件中定义的调用 。
RSocket在传统的HTTP意义上没有客户端服务器交互 。 在RSocket中 , 一旦客户端连接到服务器 , 它们都可以成为请求者和响应者 。 这意味着在连接后 , RSocket是全双工的 , 并且服务器的请求者可以发起对客户端请求者的调用 , 即 , 服务器一旦连接就可以对Web浏览器进行调用 。
流量控制gRPC的流控制是基于字节的 , 因为它最终是HTTP/2流控制 。 它没有应用程序流控制的概念 , 因为它不会在参与者之间使用此信息发送消息 。 HTTP/2流控制具有有限的价值 , 因为TCP还提供字节级流控制 。
RSocket的流控制是应用程序级流控制 。 这取决于收件人可以处理多少条消息 。 RSocket具有一个REQUEST_N帧 , 在请求多个消息的参与者之间共享 。 处理完这些消息后 , 它将请求更多消息 。 这与基础传输字节级流控制无关 。 这意味着 , 如果服务速度变慢 , 它可能会在网络缓冲区已满之前减慢消息数量 。 此信息在服务之间传播 。
取消订单在gRPC中 , 取消通常只从客户端到服务器 。 仅当序列不完整时 , 服务器才应发送取消消息 。
RSocket取消在请求者和响应者之间发送 。 哪一方是客户端还是服务器都没有关系 。 另外 , 由于反应流语义 , 它们在服务之间自动传播 。