一、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 与响应式编程的更多相关文章

  1. 浅谈Spring 5的响应式编程

    这篇使用Spring 5进行响应式编程的入门文章展示了你现在可以使用的一些新的non-blocking, asynchronous.感谢优锐课老师给予的指导! 近年来,由于响应式编程能够以声明性的方式 ...

  2. [转帖]浅谈响应式编程(Reactive Programming)

    浅谈响应式编程(Reactive Programming) https://www.jianshu.com/p/1765f658200a 例子写的非常好呢. 0.9312018.02.14 21:22 ...

  3. 浅谈Socket编程

    浅谈Socket编程 说到Socket,想必大家会觉得陌生又熟悉.许多同学听说过Socket,但仅仅知道它翻译成中文叫做套接字,除此之外似乎并没有太多的了解了.那么今天我就来抛砖引玉地聊一聊Socke ...

  4. Unity基于响应式编程(Reactive programming)入门

    系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoT ...

  5. [译] Swift 的响应式编程

    原文  https://github.com/bboyfeiyu/iOS-tech-frontier/blob/master/issue-3/Swift的响应式编程.md 原文链接 : Reactiv ...

  6. Swift 响应式编程 浅析

    这里我讲一下响应式编程(Reactive Programming)是如何将异步编程推到一个全新高度的. 异步编程真的很难 大多数有关响应式编程的演讲和文章都是在展示Reactive框架如何好如何惊人, ...

  7. 响应式编程系列(一):什么是响应式编程?reactor入门

    响应式编程 系列文章目录 (一)什么是响应式编程?reactor入门 (二)Flux入门学习:流的概念,特性和基本操作 (三)Flux深入学习:流的高级特性和进阶用法 (四)reactor-core响 ...

  8. Reactive(1) 从响应式编程到"好莱坞"

    目录 概念 面向流设计 异步化 响应式宣言 参考文档 概念 Reactive Programming(响应式编程)已经不是一个新东西了. 关于 Reactive 其实是一个泛化的概念,由于很抽象,一些 ...

  9. Java reactor响应式编程

    转载自:https://www.cnblogs.com/lixinjie/p/a-reactive-streams-on-jvm-is-reactor.html 响应式编程 作为响应式编程方向上的第一 ...

  10. 响应式编程库RxJava初探

    引子 在读 Hystrix 源码时,发现一些奇特的写法.稍作搜索,知道使用了最新流行的响应式编程库RxJava.那么响应式编程究竟是怎样的呢? 本文对响应式编程及 RxJava 库作一个初步的探索. ...

随机推荐

  1. 前瞻|Java 21 新特性 String Templates(字符串模版)

    在日常写Java的时候,对于字符串的操作是非常普遍的,其中最常见的就是对字符串的组织.也因为这个操作非常普遍,所以诞生了很多方案,总下来大概有这么几种: 使用+拼接 使用StringBuffer和Sp ...

  2. 前端设计模式:单例模式(Singleton)

    00.基本概念 单例模式(Singleton Pattern),也称单体模式,就是全局(或某一作用域范围)唯一实例,大家共享.复用一个实例对象,也可减少内存开销.单例模式应该是最基础.也最常见的设计模 ...

  3. Jupyter_Notebook_添加代码自动补全功能

    Jupyter Notebook 添加代码自动补全功能 安装 如果之前安装过显示目录功能的话,这一步骤可以跳过. pip install jupyter_contrib_nbextensions 配置 ...

  4. 流水线中便捷迭代,鲲鹏DevKit 23.0新能力抢先看

    本文分享自华为云社区<鲲鹏DevKit 23.0:流水线中便捷迭代鲲鹏版本,迁移.开发.调优无缝衔接>,作者:华为云社区精选 . 数字时代,海量的行业应用驱动着多样性算力的飞速发展,以鲲鹏 ...

  5. React-Admin后台管理模板|react18+arco+zustand后台解决方案

    基于react18.x+vite4+arco-design自研中后台管理系统解决方案ReactAdmin. react-vite-admin 基于vite4搭建react18.x后台管理项目.使用了r ...

  6. 拿到开发板需要做的事情 -- 配置Python环境

    1.查看系统时间 date -R 2.修改系统时间 windows上时间项目时间正常,Ubuntu16.04上时间错误 - 贾斯丁哔哔 - 博客园 (cnblogs.com) 3.安装pip3 sud ...

  7. 【MISC】[MoeCTF 2022]cccrrc --crc32爆破

    附件下载下来为压缩包,需要密码,查看该压缩包的内容 此处发现里面四个txt文件均已被加密,但是每个txt的内容都只有四个字节,符合crc32爆破条件,直接上脚本: import binascii im ...

  8. TypeScript学习小结:基础使用

    TypeScript学习小结:基础使用 某册子买了两年多了,到最近才开始学习TypeScript,拖延症的严重症状了:不过我还是深信人做一件事是需要一个契机的. 学完之后整体感受是:TypeScrip ...

  9. JS判断点是否在线段上

    本文利用向量的点积和叉积来判断点是否在线段上. 基础知识补充 从零开始的高中数学--向量.向量的点积.带你一次搞懂点积(内积).叉积(外积).Unity游戏开发--向量运算(点乘和叉乘 说明 点积可以 ...

  10. 牛客多校第五场 K King of Range

    题意: 给定一个\(n\)个数得序列\(a_i\),给定\(m\)个询问,每次给出一个\(k\),寻找有多少个区间\([l, r]\)中最大值与最小值之差严格大于\(k\). 思路: 可以发现,如果已 ...