一、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. 《SQLi-Labs》03. Less 11~15

    @ 目录 索引 Less-11 题解 原理 Less-12 题解 Less-13 题解 Less-14 题解 Less-15 题解 原理 sqli.开启新坑. 索引 Less-11:POST 回显注入 ...

  2. uni微信小程序隐私协议

    最近小程序又新增了个 隐私协议弹窗.需要用户去授权,官网的一些API才能使用.官网地址 功能展示 项目地址:https://ext.dcloud.net.cn/plugin?id=14358 1.ma ...

  3. QA|不同模块之间的引用(导入问题)问题;|Pycharm

    结构如图,在xxu的test.py中想要导入t2包中的sayhello和word两个方法 注意:首先需要打开xxu和t2的上层目录,因为解释器是从打开的那个文件开始查找的,所以这里应该打开B01_01 ...

  4. HiAI Foundation助力端侧音视频AI能力,高性能低功耗释放云侧成本

    过去三年是端侧AI高速发展的几年,华为在2020年预言了端侧AI的发展潮流,2021年通过提供端云协同的方式使我们的HiAI Foundation应用性更进一个台阶,2022年提供视频超分端到端的解决 ...

  5. Mysql忘记密码后如何重置密码

    长时间不使用本机的Mysql后把密码忘记了咋整?直接上干货: 第一步(Mysql部署的位置,若自己能找到就忽略这一步):任务管理器中也可以找到 第二步:修改配置文件 在my.ini末尾加上 skip- ...

  6. gitbook在线记事本

    https://app.gitbook.com/ About this template: An Internal Wiki to lay out everything anyone needs to ...

  7. .NET 8 候选版本 2 (RC2) 现已可用

    .NET 8 候选版本 2 (RC2) 现已可用,并包含了许多 ASP.NET Core 的出色新改进! 这是我们计划在今年晚些时候发布的最终 .NET 8 版本之前分享的最后一个候选版本..NET ...

  8. Python 中多态性的示例和类的继承多态性

    单词 "多态" 意味着 "多种形式",在编程中,它指的是具有相同名称的方法/函数/操作符,可以在许多不同的对象或类上执行. 函数多态性 一个示例是 Python ...

  9. NewStarCTF 2023 公开赛道 WEEK4|MISC 部分WP

    R通大残 1.题目信息 R通大残,打了99,补! 2.解题方法 仔细分析题目,联想到隐写的R通道. 首先解释一下:R是储存红色的通道,通道里常见有R(红).G(绿).B(蓝)三个通道,如果关闭了R通道 ...

  10. 打造美团外卖新体验,HarmonyOS SDK持续赋能开发者共赢鸿蒙生态

    从今年8月起,所有升级到HarmonyOS 4的手机用户在美团外卖下单后,可通过屏幕上的一个"小窗口",随时追踪到"出餐.取餐.送达"等订单状态.这个能让用户实 ...