[Day 28] Reactive Programming - RSocket Part2

前言

上一篇提到微服务的兴起是RSocket诞生的重要契机,相信有微服务开发经验的朋友,在微服务切分耦合与实际上的效能问题如何抉择伤透脑筋,服务间的沟通效率不彰是微服务一大痛点,HTTP协议本身是为了服务与客户端之间的沟通而诞生,这篇就来探讨RSocket与其他协定的差别。

HTTP

我们最熟悉的Http协定,OSI第7层,最初是用来发布或接收Html页面的方法,定义客户端与服务端之间的request/response的标准。

HTTP/1.1

建立连线需要成本,1.1提供Connection: keep-alive来帮助持续连接,减少建立与关闭连线的时间延迟。且不需要等待上一次的结果就可以发送下一个请求。并定义了现在常见的GETPOSTPUT...八种Http Medthod。

HTTP/2

在效能方便进一步的加强,增加了服务器推送功能、压缩HEAD增加传输速度、将多个请求合并在一个TCP(Multiplexing)而不是单独占用一条TCP connection、改用二进位而非原本的文本格式......等等大幅的增加网页的载入速度。

websocket

听到RSocket的时候我其实第一个想到就是websocket,与Http相同是OSI第7层,有别於单向短连接的http协定,websocket提供一个成本较低服务与客户端互动长连接的方式,相对於http当时可能需要透过Polling轮询的方式才能办到,而且又效能低下。

gRPC

建立於HTTP/2之上,为了适用於服务之间多语言的沟通,内文是透过Protobuf一种有效率的二进位讯息格式来传输,相对於原本的HTTP提高了效率。相对於常用的RESTful可以更充分的运用HTTP/2的优点。对於长连线与双向的沟通都有支援。

HTTP VS RSocket

  1. HTTP设计用於服务与浏览器沟通,RSocket则是为了微服务之间的沟通
  2. HTTP是单向,需要升级到Websocket才能建立双向的沟通,RSocket有效的建立双向沟通。
  3. HTTP并没有强制规定应用层的格式,虽然有RESTful但并不是强制要求,像是gRPC就是建立於HTTP/2但有强制要求,RSocket定义了两种应用层得流程控制(flow control),Reactive Streams request(n) Async Pull & Leasing(注1)
  4. HTTP只有一种request response,RSocket有四种,更能应对不同的使用场景。

websocket VS RSocket

  1. WebSocket只是一个框架,RSocket更完整。

gRPC VS RSocket

  1. gRPC为OSI第7层,RSocket是第5/6层。
  2. gRPC有自己特定的payloadRSocket没有特别指定。
  3. gRPC建立於HTTP/2之上只适用HTTP/2的情境,RSocket可以是TCP、档案或是WebSockets。
  4. gRP没有获得所有的浏览器支援,需要额外的程序码,RSocket只需要接受WebSockets连线就可以畅行各浏览器。

https://ithelp.ithome.com.tw/upload/images/20211012/20141418hqeWlPbFuT.jpg

图片来源:Toshiaki Maki, Staff Cloud Native Architect at VMware

补充说明

注1 Flow Control

  1. Reactive Streams request(n) Async Pull :就是基於我们之前介绍过的Reactive Streams透过Subscription.request(n)来建立订阅者与发布者之间的沟通,具体会由ReactorRxJava或是Akka Streams来实作,可以在应用层去控制资料传送的速率而不单单靠网路缓冲,适用於服务与服务或是服务与装置之间。
  2. Leasing:适用於服务与服务之间,server端要评估自己能负荷的空间给client端达到控制速率的效果,也就是client端可以使用特定逻辑的负载平衡演算法(load-balancing algorithms)来选择最佳的server端,范例推荐阅读简书

结语

其实提高效能还有一个显着的优点,就是可以降低硬体的成本,主管看到云端服务的帐单比较不会吐血。

资料来源

<<:  Day27 Cookie 的使用-2

>>:  you only look once - YOLO (1)

Day2 跟着官方文件学习Laravel-环境设定

我们今天要把环境给设定好,并且尝试将laravel专案启动,而在我写这篇文章之前,我已经有利用Hom...

Day14# Thread

在进入 Go 的重头戏 Concurrency 前,需要先来了解一下执行序(thread)是什麽,那...

为了转生而点技能-JavaScript,day4(运算子特性-precedence与associativity

运算子特性 1. 优先性(precedence):指的是一行程序列中如果才在2个以上的运算子,会依照...

第 27 集:Bootstrap 客制化 reboot 重置

此篇会介绍 Bootstrap 使用的 css reset 档案 _reboot.scss。 事前...

JavaScript学习日记 : Day1 - 前言

参赛动机 厘清JavaScript中自己一知半解的概念 透过写文章加强记忆,培养自己写文章的能力 ...