浅谈 Socket.D 与响应式编程
一、Socket.D 的主要特性
首先,Scoket.D 是高效一个二进制的网络通讯协议(官方我讲法是:基于事件和语义消息流的网络应用协议),能够满足很多场景下使用。其次,Scoket.D 是温和的响应式(采用回调风格)。
1、三种通讯模式
- send 只是发送(发送后不管了)
发送一个请求,无需为这个请求发送答复报文。适用于监控埋点,日志上报等,这种场景下无需回执,丢失几个请求无伤大雅。
- sendAndRequest(发送并请求,要求一个“答复”)
发送一条请求消息,响应方收到后发回一个答复消息。传统的 HTTP 就是典型的 sendAndRequest。
- sendAndSubscribe(发送并订阅,可接收N个“答复”)
发送一个订阅消息,响应方收到后发回N个答复报文。传统的 MQ 是典型的 sendAndSubscribe。
2、双向监听双向会话
Server 可以监听 Client 发来的消息;Client 也可以监听 Server 发来的消息。形成的 Session,更是可以相互对发消息。
3、其它
- 二进制协议,紧凑高效
- 有语议、有事件
- 多路复用
- 灵活的传输层切换: TCP/UDP/WebSocket等
- 支持自动分等高级特性
4、与其它协议对比
感观上像是各协议的优点提纯。简单且强大,非常有未来感!
对比项目 | socket.d | http | websocket | rsocket | socket.io |
---|---|---|---|---|---|
发消息(Qos0) | 有 | 无 | 有 | 有 | 有 |
发送并请求(Qos1) | 有 | 有 | 无 | 有 | 无 |
发送并订阅 | 有 | 无 | 无 | 有 | 无 |
答复或响应 | 有 | 有 | 无 | 有 | 无 |
单连接双向通讯 | 有 | 无 | 有(不便) | 有 | 有(不便) |
数据分片 | 有 | / | 无 | 有 | 有 |
断线自动重连 | 有 | / | 无 | 有 | 有 |
有元信息 | 有 | 有 | 无 | 有 | 无 |
有事件(或路径) | 有 | 有 | 无 | 无 | 有 |
有流(或消息关联性) | 有 | 无 | 无 | 有 | 无 |
Broker 模式集群 | 有 | 无 | 无 | 有 | 无 |
异步 | 异步 | 同步 | 异步 | 异步 | 异步 |
接口体验 | 经典 | 经典 | 经典 | 响应式(复杂) | 经典 |
基础传输协议 | tcp, udp, ws | tcp | http | tcp, udp, ws | ws |
二、Socket.D 的内部实现
1、帧的设计
socket.d 是以帧为单位进行传输。大的帧还会自动分片成小帧进行传输(超过 16MB 自动分裂重组,大小可配置),到达接收端后再自动聚合。
- 帧的逻辑结构
frame: {flag, message: {sid, event, entity: { metaString, data}}}
帧的数据逻辑结构:帧里有标志和消息;消息里有流标识、事件、实体;实体里有元信息字符串和数据。
- 完整的标准帧码
[len:int][flag:int][sid:str(<64)][\n][event:str(<512)][\n][metaString:str(<4k)][\n][data:byte(<16m)]
字段 | 类型 | 大小 | 说明 |
---|---|---|---|
len | int | 4字节 | 帧长度(包括它自己的 4字节占位) |
flag | int | 4字节 | 标志(相当于协议指令) |
sid | String | 64字节以内 | 流标识。格式为: guid |
event | String | 512字节以内 | 事件。格式为:可见字符 string |
metaString | String | 4Kb以内 | 元信息字符串。格式为:通用的 uri queryString |
data | byte[] | 16Mb以内 | 数据。格式为: byte[] |
注意:当使用 udp 传输时,帧长度不能超过 2k (听说,实际不能超过 1.4k )
- 简化的辅助帧码(Ping, Pong, Close),取消了 message 部分
[len:int][flag:int]
2、数据实体——Entity
基于帧之上,一般开发者接触到的是 Entity, 它类似一个HTTP报文,可以是一个Request,也可以是一个Response。由两个部分组成:
- MetaString 元信息字符串,类似 HTTP 的 header。格式:字符串
- Data 数据,类似 HTTP 的 body。格式:二进制
3、玩法
Socket.D 有很多玩法,传统的 RPC 自然不在话下,用来做 IM 也未尝不可,开发 MQ 也很简单(FolkMQ 就是用它开发的)。某些特性也可以用来做代理或者网络穿透。
IoT的场景,比如小明的家里有个智能空调,小明想在外面通过手机 APP 来控制空调开关,如何优雅地描述这个控制问题?最精炼的解决方案就是"小明调用空调上开关的API"。
另外最经典的玩法就是Broker了,Broker类似一种“软路由”的方案,可以让服务的发布访问变得简单。发布服务只要连接到Broker,调用方通过反向请求的方式来让Broker透明转发即可,摒弃了传统的注册中心,端口管理等常见的服务治理手段。
4、关于 Socket.D Broker
Broker 有很多优势,发布服务不需要监听端口,无需 Sidecar,服务注册变得简单,无需 zk、etcd 之类,LoadBalance 变得简单,也更安全,没监听端口后很难攻击。也有很多劣势,网络上多了一跳,性能是有一定损耗的,Broker 是中心化设计,类似我们平时全局的 Nginx 一样,但是 Broker 的优雅启停显然更加复杂,受限于整个 Broker 集群的瓶颈等等。上帝为你关闭了一扇门,就一定会为你打开一扇窗。
三、响应式编程,难吗?
响应式编程是个老话题了,它早已无处不在,甚至你在Excel里SUM求和,本质上也是种响应式的思维。响应式本质上就是响应变化的数据流。Socket.D 这个协议本身就是以响应式之名,将其扩展到网络层面。
但是,响应式接口对一般程序员,不太友好。Socket.D 是响应式,但采用"经典的回调界面"。
四、总结
Socket.D 是个很有趣的网络协议,未来应该会普及流行。它解决问题的思路和设计很令人耳目一新。如果大家有兴趣,可以去它的官网了解下。
浅谈 Socket.D 与响应式编程的更多相关文章
- 浅谈Spring 5的响应式编程
这篇使用Spring 5进行响应式编程的入门文章展示了你现在可以使用的一些新的non-blocking, asynchronous.感谢优锐课老师给予的指导! 近年来,由于响应式编程能够以声明性的方式 ...
- [转帖]浅谈响应式编程(Reactive Programming)
浅谈响应式编程(Reactive Programming) https://www.jianshu.com/p/1765f658200a 例子写的非常好呢. 0.9312018.02.14 21:22 ...
- 浅谈Socket编程
浅谈Socket编程 说到Socket,想必大家会觉得陌生又熟悉.许多同学听说过Socket,但仅仅知道它翻译成中文叫做套接字,除此之外似乎并没有太多的了解了.那么今天我就来抛砖引玉地聊一聊Socke ...
- Unity基于响应式编程(Reactive programming)入门
系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoT ...
- [译] Swift 的响应式编程
原文 https://github.com/bboyfeiyu/iOS-tech-frontier/blob/master/issue-3/Swift的响应式编程.md 原文链接 : Reactiv ...
- Swift 响应式编程 浅析
这里我讲一下响应式编程(Reactive Programming)是如何将异步编程推到一个全新高度的. 异步编程真的很难 大多数有关响应式编程的演讲和文章都是在展示Reactive框架如何好如何惊人, ...
- 响应式编程系列(一):什么是响应式编程?reactor入门
响应式编程 系列文章目录 (一)什么是响应式编程?reactor入门 (二)Flux入门学习:流的概念,特性和基本操作 (三)Flux深入学习:流的高级特性和进阶用法 (四)reactor-core响 ...
- Reactive(1) 从响应式编程到"好莱坞"
目录 概念 面向流设计 异步化 响应式宣言 参考文档 概念 Reactive Programming(响应式编程)已经不是一个新东西了. 关于 Reactive 其实是一个泛化的概念,由于很抽象,一些 ...
- Java reactor响应式编程
转载自:https://www.cnblogs.com/lixinjie/p/a-reactive-streams-on-jvm-is-reactor.html 响应式编程 作为响应式编程方向上的第一 ...
- 响应式编程库RxJava初探
引子 在读 Hystrix 源码时,发现一些奇特的写法.稍作搜索,知道使用了最新流行的响应式编程库RxJava.那么响应式编程究竟是怎样的呢? 本文对响应式编程及 RxJava 库作一个初步的探索. ...
随机推荐
- 前瞻|Java 21 新特性 String Templates(字符串模版)
在日常写Java的时候,对于字符串的操作是非常普遍的,其中最常见的就是对字符串的组织.也因为这个操作非常普遍,所以诞生了很多方案,总下来大概有这么几种: 使用+拼接 使用StringBuffer和Sp ...
- 前端设计模式:单例模式(Singleton)
00.基本概念 单例模式(Singleton Pattern),也称单体模式,就是全局(或某一作用域范围)唯一实例,大家共享.复用一个实例对象,也可减少内存开销.单例模式应该是最基础.也最常见的设计模 ...
- Jupyter_Notebook_添加代码自动补全功能
Jupyter Notebook 添加代码自动补全功能 安装 如果之前安装过显示目录功能的话,这一步骤可以跳过. pip install jupyter_contrib_nbextensions 配置 ...
- 流水线中便捷迭代,鲲鹏DevKit 23.0新能力抢先看
本文分享自华为云社区<鲲鹏DevKit 23.0:流水线中便捷迭代鲲鹏版本,迁移.开发.调优无缝衔接>,作者:华为云社区精选 . 数字时代,海量的行业应用驱动着多样性算力的飞速发展,以鲲鹏 ...
- React-Admin后台管理模板|react18+arco+zustand后台解决方案
基于react18.x+vite4+arco-design自研中后台管理系统解决方案ReactAdmin. react-vite-admin 基于vite4搭建react18.x后台管理项目.使用了r ...
- 拿到开发板需要做的事情 -- 配置Python环境
1.查看系统时间 date -R 2.修改系统时间 windows上时间项目时间正常,Ubuntu16.04上时间错误 - 贾斯丁哔哔 - 博客园 (cnblogs.com) 3.安装pip3 sud ...
- 【MISC】[MoeCTF 2022]cccrrc --crc32爆破
附件下载下来为压缩包,需要密码,查看该压缩包的内容 此处发现里面四个txt文件均已被加密,但是每个txt的内容都只有四个字节,符合crc32爆破条件,直接上脚本: import binascii im ...
- TypeScript学习小结:基础使用
TypeScript学习小结:基础使用 某册子买了两年多了,到最近才开始学习TypeScript,拖延症的严重症状了:不过我还是深信人做一件事是需要一个契机的. 学完之后整体感受是:TypeScrip ...
- JS判断点是否在线段上
本文利用向量的点积和叉积来判断点是否在线段上. 基础知识补充 从零开始的高中数学--向量.向量的点积.带你一次搞懂点积(内积).叉积(外积).Unity游戏开发--向量运算(点乘和叉乘 说明 点积可以 ...
- 牛客多校第五场 K King of Range
题意: 给定一个\(n\)个数得序列\(a_i\),给定\(m\)个询问,每次给出一个\(k\),寻找有多少个区间\([l, r]\)中最大值与最小值之差严格大于\(k\). 思路: 可以发现,如果已 ...