Socket.D 基于消息的响应式应用层网络协议

首先根据 Socket.D 官网 的副标题,Socket.D 的自我定义是:

基于事件和语义消息流的网络应用协议。

官网定义的特点是:

  • 基于事件,每个消息都可事件路由
  • 所谓语义,通过元信息进行语义描述
  • 流关联性,有相关的消息会串成一个流
  • 语言无关,使用二进制输传数据(支持 tcp, ws, udp)。支持多语言、多平台
  • 断线重连,自动连接恢复
  • 多路复用,一个连接便可允许多个请求和响应消息同时运行
  • 双向通讯,单链接双向互听互发
  • 自动分片,数据超出 16Mb,会自动分片、自动重组(udp 除外)
  • 接口简单,是响应式但用的是监听与回调风格(经典易用)

Socket.D 是基于这些特性需求诞生的一种新型响应式网络协议。Socket.D 借鉴了很多其他协议发展过程中遇到的问题,然后总结归纳进自己的实践当中。

基于 Socket.D 的一些主要特性分别做一下介绍,并和 HTTP 之类的常见协议进行比较:

  • Destination (URL) 显示连接地址
  • Event 事件
  • Multiplexed, Binary Protocol 多路复用的二进制协议
  • Bidirectional Streaming 双向流
  • Socket Resumption 连接恢复
  • Message passing 消息传递模型
  • Transport independent 与传输层解耦的应用层协议

一、两层路由能力

  • path 路由能力

Socket.D 是基于显示连接地址的,可以实现像 http 或 websocket 一样的“频道”路由的效果。地址例:

//模拟聊天场景的用户地址
sd:tcp://127.0.0.1:8602//模拟聊天场景的管理员地址
sd:tcp://127.0.0.1:8602/admin?u=admin&p=1234
  • event 路由能力

Socket.D 每个消息都有事件描述,可以起到 path 或 topic 或 cmd 类似的路由效果。示例:

//模拟消息中间件的发布指令
client.send("event.mq.publish", new StringEvent("{userId:1}").metaSet("topic","demo"));//模拟消息中间件的订阅指令
client.send("event.mq.subscribe", new StringEvent("").metaSet("topic","demo"));

二、多路复用的二进制协议

现在 Multiplexing,Asynchronous,Non-blocking I/O 已经被说烂了,基本上就是标配。这些特性意味着什么?拿HTTP的发展史感受一下:

从 HTTP1.0 到 HTTP3.0 在传输性能上的进步
  • 在 HTTP1.0 时代,每个 HTTP request 都要新建一个网络连接。网络连接不能复用
  • HTTP1.1 时代,一个网络连接仍然在一个时候只能负责一个 request,但是整个 request/response 结束后连接可以得到复用。
  • 会有文章讲到 HTTP1.1 的核心是pipeline功能,是也不是。pipelining 支持一个 TCP 连接上按照顺序连续发送多个 HTTP 请求而不需要等待前一个请求的响应,但是它同时要求HTTP response也要按照请求的顺序逐个发送,这对服务器提出了很多要求,而且如果第一个响应很慢会拖累所有的后续响应(pipeling的队头阻塞),所以事实上并没有得到多少运用。即使到今天大部分浏览器仍然是默认关闭HTTP pipelining功能的,所以说HTTP1.1的主要突破还只是连接复用。
  • HTTP2.0 是个飞跃,开始支持 multiplexing,一个TCP连接上可以同时承载多个request/response,用这种方式替代1.1的pipelining提升HTTP的并行效果,也自然不存在什么队头阻塞了。每一个request/response的信息流,我们把它称作一个HTTP stream。这个时候一个HTTP client对于一个origin,只需要建立一个TCP就够了。(但是multiplexing带来了新的问题)
  • 现在HTTP3.0也差不多了。2.0解决了1.1pipelining的队头阻塞问题,但是却无法解决TCP本身的队头阻塞。而因为TCP/IP在内核协议栈中,简直无法升级,于是HTTP选择了QUIC作为新的传输层协议。 QUIC基于UDP,在用户模式中实现了类似TCP的connection oriented的功能同时解决TCP的队头阻塞,自带multiplexing等等。

所以,HTTP/2具有的优点,Socket.D 都有。另外,Socket.D 是一个二进制协议,也就是说在一个 Socket.D 连接上传输的消息体对数据格式没有任何要求,应用程序可以为所欲为的压缩数据量的大小。

这样的二进制协议通常来说能给性能带来极大的提升,但是产生的代价是,网络中间件也会因为无法解读消息体中的数据,丧失了在对具体应用流量进行监控,日志和路由的能力。所以 Socket.D 通过把每个消息体分成 sid, event, data 和 metaString 的方式,在保证高效传输的前提下,也提供了暴露元数据给网络中间件的能力(方便做语义处理),同时还能路由消息。

frame: {flag, message: {sid, event, entity: { metaString, data}}}

对于每个 data,应用可以采用不同的序列化方法。metaString 则采用标准的 url queryString 的通用格式(所有网络中间件通用)。

  • data 一般作为应用本身需要传递的业务数据,采取自定义的高效序列化方式,且对网络基础设施不可见
  • metaString 采用标准的 url queryString 的通用格式。在分布式传输的过程中,这些中间件可以按需求对 metaString 进行读写,然后调整路由。

三、双向流

上面提到,HTTP这几年在传输性能上进步了很多。但说到底在应用层仍然仅支持client request/server response的交互模型。

这里一些同学可能有疑问,比如:

那HTTP/2推出的Server Push是什么

HTTP2.0推出了一个新的Server Push功能,但这个功能通常只是用来提前将一些静态资源返还给用户而已。举个例子:一个简单的网站有三个静态资源组成: index.html, index.css, index.js。 我们打开浏览器打开index.html,就会发起一个HTTP request拿到index.html。在不使用server push的情况下,我们要等浏览器解析出index.css 和 index.js之后才会再次向服务器发起请求。而运用server push,服务器可以根据一些规则预知到浏览器也需要index.css和index.js,并在客户端发送新的请求之前直接推送给该客户端。

所以,这个功能的使用场景非常有限,而且也不是一个真正双向的交互模式。

结论:仅仅使用HTTP/2协议,不在其基础之上再加一层其他协议的情况下是无法在应用层实现双向流的(比如,gRPC)。

回到交互模式,Socket.D 的几种模式:

  • Send
  • SendAndRequest -> Reply
  • SendAndSubscribe -> Stream Reply
  • Reply
  • ReplyEnd
  • Session(双向使用上面的发送与答复)

通常来说,越复杂的交互模式,为了保存交互状态,就需要占用更多的内存和计算资源。这也是为什么 Socket.D 会提供多种不同的 API。另外,当 Socket.D 的 client 和 server 建立了长连接之后,任何一方都可以是 Requester 或是 Responder。服务器也可以扮演 Requester 的角色,首先发起 Request。

四、异步消息传递

Socket.D 还有另外一个非常重要的概念使之完全区分于类HTTP协议,那就是异步消息传递。

不同于HTTP当中存在Request,Response。Socket.D在网络传输上只有Frame这一个消息格式。有一个相同点是,类HTTP协议通常拥有一个显式的destination (URL),使用起来会非常有亲切感和简单。

如果Requester的 Socket.D 消息R首先通过了一个网络中间件(Broker),那么请求者(Requester)并不关心该消息的最终目的地在哪里,网络中间件可以全权负责路由模块的实现。该架构可以支持微服务,也可以支持IOT场景,等等。

在这里插入图片描述

这种架构很有意思,不仅能在微服务中加入streaming支持,还有如下特点:

1.客户端也可以暴露服务

由于 Socket.D 的双向流特性,和Broker建立连接的客户端即可以做Requester也可以做Responder,比如图中的Device 1和Device 2虽然是移动终端或者IOT设备,但仍然可以向其他设备或数据中心的主机提供服务

2.自动服务注册/发现

Socket.D 在成功建立连接时。如果该client想要暴露一个服务,则在连接地址上给自己取个名字(就像加入一个社交群,让别人能At到你)。连接成功建立之后,Socket.D Broker可以直接通过记录网络连接状况来达到服务注册和发现的效果。通过’@'参数取名示例:

sd:tcp://127.0.0.1:8602?@=demoapp
3.基于消息 metaString 实现请求路由

前面说过,Socket.D 是一个二进制协议,但仍然可以在消息体中通过 metaString 来暴露信息给网络中间件。每个消息实体的 metaString 会带有‘@’参数, 告诉 Socket.D Broker 消息应该转发给谁,从而实现路由效果。示例:

client.send("/demo", new StringEntity("").at("demoapp"));

与连接时给自己取名的 ‘@’ 参数相乎应。取了名,就能被“别人” at 到!

4.暴露服务不需要Ip和Port

整个架构当中,所有节点都只需要知道Broker的地址和服务端口即可。只要成功连接信息流就是双向的。Borker可以直接通过建立的Connection寻址服务节点,所有的服务调用者都不需要知道服务暴露方的地址

而Broker又可以通过连接的 url 地址,进行签权控制。

5.天生的中心化管理

管理微服务集群往往需要有一个中心化的控制中心,在这个架构中 Socket.D Broker 就是自然而然的中心,知道整个集群中所有的情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/222883.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【湖仓一体尝试】MYSQL和HIVE数据联合查询

爬了两天大大小小的一堆坑,今天把一个简单的单机环境的流程走通了,记录一笔。 先来个完工环境照: mysqlhadoophiveflinkicebergtrino 得益于IBM OPENJ9的优化,完全启动后的内存占用: 1)执行联合查询后的…

CVE-2023-49898 Apache incubator-streampark 远程命令执行漏洞

项目介绍 Apache Flink 和 Apache Spark 被广泛用作下一代大数据流计算引擎。基于大量优秀经验结合最佳实践,我们将任务部署和运行时参数提取到配置文件中。这样,带有开箱即用连接器的易于使用的 RuntimeContext 将带来更轻松、更高效的任务开发体验。它…

Vue+ElementUI前端添加展开收起搜索框按钮

1、搜索框添加判断 v-if"advanced" <el-form-item label"创建日期" v-if"advanced"><el-date-pickerv-model"daterangeLedat"size"small"style"width: 240px"value-format"yyyy-MM-dd"type&q…

Midjourney v6 正式发布,AI创新工坊同步更新

Midjourney v6 开发团队将从2023 年 12 月 21 日今晚开始&#xff0c;在寒假期间让社区测试Midjourney v6模型的 alpha 版本。 要打开它&#xff0c;V6请从提示下方的下拉菜单中选择/settings或--v 6在提示后键入。 Midjourney v6 基本型号有哪些新功能&#xff1f; 更准确的…

算法题系列5·移除元素

目录 题目描述 实现 题目描述 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不…

【算法设计与分析】——动态规划算法

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

YB75XXH系列是采用CMOS工艺制造,低功耗的高压稳压器

YB75xxH 高耐压线性稳压器 ■产品简介&#xff1a; YB75XXH系列是采用CMOS工艺制造&#xff0c;低功耗的高压稳压器&#xff0c;最高输入电压可达25V,输出电压范围为1.5V一12.0V。它具有高精度的输出电压、极低的供电电流、极低的跌落电压等特点。 ■产品特点&#xff1a; …

TCP_滑动窗口介绍

简介 TCP协议中有两个窗口&#xff0c;滑动窗口和拥塞窗口&#xff0c;两者均是一种流控机制&#xff1b;滑动窗口是接收方的流控机制&#xff0c;拥塞窗口是发送方的流控机制。 本文介绍滑动窗口&#xff0c;接收方为TCP连接设置了接收缓存。当TCP连接接收到正确、按序的字节…

[SWPUCTF 2021 新生赛]Do_you_know_http已

打开环境 它说用WLLM浏览器打开&#xff0c;使用BP抓包&#xff0c;发送到重发器 修改User-Agent 下一步&#xff0c;访问a.php 这儿他说添加一个本地地址&#xff0c;它给了一个183.224.40.160&#xff0c;我用了发现没用&#xff0c;然后重新添加一个地址&#xff1a;X-Forwa…

网络爬虫之多任务数据采集(多线程、多进程、携程)

进程&#xff1a;操作系统中资源分配的基本单位 线程&#xff1a;使用进程资源处理具体任务 一个进程中可以有多个线程&#xff1a;进程相当于一个公司&#xff0c;线程是公司里面的员工。 一 多线程 多线程都是关于功能的并发执行。而异步编程是关于函数之间的非阻塞执行&…

linux 中 C++的环境搭建以及测试工具的简单介绍

文章目录 makefleCMakegdb调试 与 coredumpValgrind 内存检测gtest 单元测试 makefile 介绍 安装 : sudo apt install make makefile 的规则: 举例说明 包括&#xff1a;目标文件 、 依赖文件 、 生成规则 使用 &#xff1a; make make clean CMake : CMake是一个…

【基于激光雷达的路沿检测用于自动驾驶的真值标注】

文章目录 概要主要贡献内容概述实验小结 概要 论文地址&#xff1a;https://arxiv.org/pdf/2312.00534.pdf 路沿检测在自动驾驶中扮演着重要的角色&#xff0c;因为它能够帮助车辆感知道可行驶区域和不可行驶区域。为了开发和验证自动驾驶功能&#xff0c;标注的数据是必不可…

【SpringBoot篇】基于Redis实现生成全局唯一ID的方法

文章目录 &#x1f354;生成全局唯一ID&#x1f339;为什么要生成全局唯一id&#x1f33a;生成全局id的方法✨代码实现 &#x1f354;生成全局唯一ID 是一种在分布式系统下用来生成全局唯一id的工具 在项目中生成全局唯一ID有很多好处&#xff0c;其中包括&#xff1a; 数据…

革命性突破:Great River推出XL高速ARINC 818传感器测试卡

Great River Technology荣幸地宣布&#xff0c;与RVS&#xff08;远程视觉系统&#xff09;2.0平台合作推出的XL高速ARINC 818传感器测试卡正式亮相。这款开创性的测试卡在柯林斯航空电子公司&#xff08;RTX业务部&#xff09;和波音公司开发和测试RVS 2.0系统中发挥了重要作用…

Python办公自动化Day1

目录 文章声明⭐⭐⭐让我们开始今天的学习吧&#xff01;xlwt创建Excelxlrd读取Excelxlutils修改Excelxlwt设置样式常见的字体样式单元格宽高内容对齐方式设置单元格边框设置背景颜色样式整合起来的写法 文章声明⭐⭐⭐ 该文章为我&#xff08;有编程语言基础&#xff0c;非编…

引领汽车营销新趋势,3DCAT实时云渲染助力汽车三维可视化

当前&#xff0c;汽车产业发展正从电动化的上半场&#xff0c;向智能化的下半场迈进。除了车机技术体验的智能化之外&#xff0c;观车体验的智能化也不容忽视。 这是因为&#xff0c;随着数字化、智能化、个性化的趋势&#xff0c;消费者对汽车的需求和期待也越来越高&#xf…

听GPT 讲Rust源代码--src/tools(23)

File: rust/src/tools/clippy/rustc_tools_util/src/lib.rs 在Rust源代码中&#xff0c;rust/src/tools/clippy/rustc_tools_util/src/lib.rs文件的作用是为Clippy提供了一些实用工具和辅助函数。 该文件中定义了VersionInfo结构体&#xff0c;它有三个字段&#xff0c;分别为m…

web架构师编辑器内容-创建业务组件和编辑器基本行为

编辑器主要分为三部分&#xff0c;左侧是组件模板库&#xff0c;中间是画布区域&#xff0c;右侧是面板设置区域。 左侧是预设各种组件模板进行添加 中间是使用交互手段来更新元素的值 右侧是使用表单的方式来更新元素的值。 大致效果&#xff1a; 左侧组件模板库 最初的模板…

微前端样式隔离、sessionStorage、localStorage隔离

1、样式隔离 前端样式不隔离&#xff0c;会产生样式冲突的问题&#xff0c;这个点在qiankun也存在 子应用1修改一个样式 button {background: red&#xff01;important&#xff1b; }其它应用也会受到影响 qiankun的css隔离方案&#xff08;shadow dom&#xff09; shadow …

FCIS 2023网络安全创新大会-核心PPT资料下载

一、峰会简介 本次会议的主题是“AI大模型、人工智能与智能制造安全、攻击面管理与供应链安全”。 1、AI大模型 会议首先探讨了AI大模型在网络安全领域的应用。AI大模型是一种基于深度学习的模型&#xff0c;具有强大的特征提取和分类能力&#xff0c;可以用于检测和防御各种…