首页 > 其他分享 >关于联网交互

关于联网交互

时间:2024-10-23 11:09:52浏览次数:1  
标签:Socket 队列 联网 终端 ZeroMQ 交互 连接 其实 关于

进程间的通讯经常需要走网络。网络的交互方式有很多,最基础的就是Socket,.NET平台还封装了TcpListener和TcpClient,跟Socket相差不大,属于简单封装。
另外我们公司常用的交互方式还有ZeroMQ和RabbitMQ。
其实C++那边用ZeroMQ比较多。C++开发经常也开前后台,有人负责前台的界面部分,可能会使用MFC或QT,然后另外有人负责后台的业务代码。C++的前后端交互有时候经常也直接使用ZeroMQ,一些状态和配置的东西,有时候也会借助Redis数据库。
ZeroMQ他们使用最多的还是发布/订阅模式。
C#这边,ZeroMQ的实现对应是NetMQ,一些常用的模式都有。
但在之前的项目使用中,发些一些问题:
1、请求/响应模式,其实相当的脆弱,请求端和响应端的收发必须保持严格的一致,中间如果出现任意一个请求端的操作不正确,会导致响应端的线程也崩掉,导致服务也会不正常。
这点上个人感觉还是不太能接触。其实类似的TCP的监听和HTTP的监听,某一个终端交互的异常,可能会导致和这一路的终端交互会异常或中断,但一般都不会影响其它终端的交互和监听响应端的后绫正常工作。
所以强烈建议不要使用这个请求/响应模式,这个问题,我不是知道是NetMQ的问题,还是所有的ZeroMQ都会有这个问题。
2、NetMQ的发布/订阅,底层的实现一般都还是一个个TCP Socket,当然还可以设置其它的连接方式。
这种方式会有什么问题呢?相当于一个终端的订阅就是一个Socket连接,这种方式其实并不适合大批量大流量的订阅发布。
之前我们有个项目,拿发布/订阅模式去分发文件。服务端用的是千兆网卡。连了30台机器,其实每个终端分到的有效带宽是3MB/S。
发布端往消息队列里面放文件数据的时候,只要超过3MB/S,相当于整个的带宽已经不足够把数据发出去了。
这样的NetMQ底层的队列就会积压缓存,过一段时间,队列就会满出来。队列满出来以后,NetMQ就会去丢掉一些数据包。类似一些大文件,丢掉一些包,就会导致这个文件传送就失败了。
所以当时在遇到很多终端连着,并且传送大文件的时候,是有问题的。
连接的终端比较少,或者传送小文件的时候是没有问题的。连接的终端少时,每个终端分到的带宽就比较多,传输数据就比较快,就不容易出现堆积的情况。传送小文件的时候,因为本身持续的时间比较短,消息队列的缓存还没满,整个发送过程就结束了。
因为当时已经是在项目后期,我们没办法重新更换网络传输架构,所以我们当时的解决方式是,发布端控制一下往队列里面放数据的速度,比如我们就按3MB/S的速度往队列里面放,达到这个速率了以后,我们就暂停。
因为我们主要用来传输一些文档类的小文件,所以这样限制其实问题不大。
但这样的限制,在连接的终端比较少的情况下,其实是比较浪费的。相当于千兆的网络,如果就连了两台的机子,也限制了3MB/S的速度,其实就是在浪费带宽。所以其实还需要根据连接的终端情况来调整带宽,所以相对就比较复杂。
所以后面的时间,我其实也有一直在研究这个文件大批量分开发的问题。个人感觉比较好的理念,其实是P2P的方式,当然也可以使用组播这些方式。但是我做的那个项目里面,有种情况,有些终端可能会后续连进来的,所以想完全靠组播来一劳永逸的解决也比较难。
所以当时的想法就是想着,不要把流量全部集中在服务端。大文件的话可以采用分块的方式,一般终端已经下载了,没下的终端可以从已经下载的终端来获取。
一种解决方案是借助IPFS。这种方式需要在服务器和每个终端上先安装一个IPFS的服务。然后借助IpfsShipyard.Ipfs.Http.Client,调用IPFS的服务来实现。

Install-Package IpfsShipyard.Ipfs.Http.Client

示例代码:

using Ipfs.Http;

var ipfs = new IpfsClient();

const string filename = "QmXarR6rgkQ2fDSHjSY5nM2kuCXKYGViky5nohtwgF65Ec/about";
string text = await ipfs.FileSystem.ReadAllTextAsync(filename);

还有一种方式,就是完全自己实现,自己切块,每个终端都去监听连接。自己去控制去哪里获取分块。
分块采HASH值标识和保存。

SOCKET的使用

很多同事都不喜欢直接使用SOCKET,主要是觉得状态的维护比较麻烦。包括C++那边,平常喜欢用ZeroMQ,主要也还是觉得它不用维护终端和连接状态。
但是个人的话,不排诉Socket,有时候甚至喜欢用Socket,主要也是因为状态的连接和可控。
用了第三方封装的通讯库,有个很大的问题,一些基础的信息和连接状态,有时候反而变得比较难感知。
关于Socket的使用,最近也有一些想法。
个人感觉其实不同的操作,可以用不同的通道来处理。
类似有些操作,其实比较像请求响应,其实可以使用单次连接的方式,连上去,发消息,然后收消息,收完以后就把连接给关闭了。
还有一些有点像发布订阅的方式,连上去,告诉服务端,我要什么东西,然后服务端按要求持续的发送数据。
另外还有一些情况,采集的间隔可变的,客户端发一个采集的请求,服务端就回一帧的。什么时候停止也是客户端自己决定的。其实也可以起一个专门的线程和连接去完成这部分的操作。
我个人的理解,其实分线程分连接去完成上面三部分的工作。可以不要用同一个Socket连接,这样的话,逻辑相对会比较简单。

标签:Socket,队列,联网,终端,ZeroMQ,交互,连接,其实,关于
From: https://www.cnblogs.com/wzwyc/p/18495977

相关文章

  • 鸿蒙Next之数据同步艺术之五:跨应用数据交互
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在许多应用场景中,用户需要在不同应用之......
  • C#关于WebSocket的使用
    因为主要做CS开发,所以之前没怎么涉及WebSocket的使用。前面有个项目,想着前端能不能直接跟我这边交互,所以研究了一下.NET的WebSocket的使用。客户端连接客户端的连接相对比较简单,可以直接使用ClientWebSocket即可。示例代码:usingSystem.Net.WebSockets;usingSystem.Threadin......
  • 推荐一些关于计算机网络和 TCP/IP 协议的书籍
    以下是一些关于计算机网络和TCP/IP协议的优秀书籍推荐:《TCP/IP详解》:作者为W.RichardStevens,这是一套经典之作,分为三卷。《TCP/IP详解卷1:协议》:详细解析了TCP/IP协议的工作原理和实现细节,对协议族中的各个层次和协议,如IP、TCP、UDP等进行了深入剖析,适合想......
  • 关于软件开发中UI相关的问题
    因为个人的使用习惯,我现在经常是笔记本+显示器的使用方式。然后家里用的是27寸的4K显示器,显示器的缩放比例一般是设置成150%。使用的过程中发现很多的软件,在UI显示上都会出现一些问题。主要是两点:1、多屏/横竖屏。一些软件在有多个显示屏,特别是几个显示屏的分辨率不一样,或者有横......
  • 6个关于JavaScript的超级技巧
    对象属性简写问题:将变量分配给对象属性可能会重复。解决方案:使用属性简写来简化对象创建。动态属性名称问题:使用动态属性名称创建对象可能很冗长。解决方案:使用计算属性名称动态创建对象属性。数组方法:map()、、filter()和reduce()问题:对数组进行迭代可能会重复。解决方案......
  • Python与excel交互(xlwt库和openpyxl库的使用)
    xlw库介绍xlwt是用于在Python中操作Excel文件的第三方库,主要用于创建和写入Excel文件(xls格式)。使用xlwt可以方便地设置单元格的样式,像设置字体(如字体大小、颜色等)、对齐方式(水平和垂直对齐)和边框等。还能灵活控制工作表的行高和列宽,以满足不同数据展示的需求。在数据写入......
  • 关于我、重生到500年前凭借C语言改变世界科技vlog.8——函数递归
    文章目录1.递归的介绍2.递归的限制条件3.递归实战应用3.1求n的阶乘3.2顺序打印一个整数的每一位4.递归与迭代5.递归经典问题的拓展希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力!1.递归的介绍在vlog.2的printf函数的返回值举例中,我们使......
  • 2024/10/22日 日志 --》关于Maven的基础学习 笔记整理
    今天正式步入Maven的学习,以下是基本的笔记整理。点击查看代码--Maven--·Maven是专门用于管理和构建Java项目的工具,它的主要功能有:--·提供了一套标准化的项目结构--·提供了一套标准化的构建流程(编译,测试,打包,发布...)--·提供了一套依赖管理机制--·......
  • 深度了解flink rpc机制(三)-组件以及交互
    FlinkRPC整体架构Flink集群间组件的通信底层是使用的actorsystem通信模型和动态代理来实现的,先简单看下FlinkRPC相关的类UML图通信组件RpcGatewayFlinkRPC远程调用网关,是FlinkRPC定义远程调用的接口协议,对外提供可调用的接口,所有实现RPC的组件,都要实现这个接口......
  • 物联网从层次结构上分为几层,各层的主要作用是什么
    物联网的层次结构包括感知层、网络层和核心层,每个层次都扮演着不可或缺的角色。感知层负责数据采集,网络层实现数据传输,核心层则进行数据处理和决策。这种层次结构的设计使得物联网能够高效地运行,为人们的生活和工作带来了巨大的便利和效益。1.感知层(PerceptionLayer)感知层是......