ZeroC Ice发送大数据
继上文,我们使用ZeroC Ice传递大块数据时,通常有两种做法,一种是一次请求,另一种就是分多次请求(,这种做法在官方文档有例子)。选哪一种根据需要而定。
当分多次请求来完成一大块数据,到底选择每次请求多大的数据合适呢?
首先清楚下面几点,每次请求应该用 two-way进行,也就是 request - reply 模式来确保数据发送。one-way模式是只管单向发送的。那么就有下面几个点
一个最小的Ice reply包大小为 79

一个Ice心跳包大小为 68

一个分段的ack包大小为 60

无论是返回 void的 reply包,还是心跳包,都必须通过 Ice环境和 Ice协议,也就是必须通过 POLL_OUT事件,唤醒线程池去发送。这里有隐藏的问题,在某些机器上的linux,POLL_OUT事件并不正常工作。
分段的ack动作,完全由协议栈的tcp驱动完成,不会像应用层依赖epoll事件去发送数据,受POLL_OUT事件不正常而影响。
如果一次请求过小,我们假定为了迎合链路去发送数据,将一次请求的数据量定为小MTU,假设是1K,那么每发送1K就要接收端在应用层响应并通过 Ice环境(epoll线程池)发送一个reply包,最小体积为 79。
为了减少接收端频繁在应用层响应,(最主要还是epoll 等待的POLL_OUT事件),我们就要适当增加一次请求的数据体积。这时候tcp层就需要将请求包分段发送,当请求包大小刚好跨越 MSS限制时,这样就会造成浪费,剩下的小部分数据不得不进行一次分段。为了提高利用,最好就是一次请求在 MSS 限制内尽可能的大, 最好是MTU的倍数。
从上面的例图,一个10K分段的ack包,在1300地递增,也就是分段以多个ip包,每个1300地到达接收端。并且到达是不按时间顺序的,但是接收端可以重组这个分段的ip包。分段的ack包的seq并没有任何改变,窗口也不会变化。
这里就有一问题,我们必须查询 socket 的 MTU 以及 MSS,但是 ZeroC Ice完全将底层 socket 与使用用户隔离,所以当你使用这个中间件后,你就不得不忍受这种封装。
另外再次声讨一下,sequence<byte> 在所有平台上工作良好,除子php平台上,是鸡肋的整数数组,这最少要损耗10倍的空间。
2018.02.14 补充:
Ice.MessageSizeMax是接收方的限制属性,当一个twoway请求,client 和 server都扮演一次接收方。client request to server,server 就是 request message 的接收方。server reply to client,client 就是 reply message 的接收方。当请求或响应的消息包的数据太大时,都要调整两边的 Ice.MessageSizeMax。当你在一方捕捉到关于这个属性的异常,不是限制了发送,而是限制了接收,换句话说不是发不出去,而是拒绝了接收从对方来的消息。
ZeroC Ice发送大数据的更多相关文章
- C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全
简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...
- 发送大数据时,PDU的问题?
昨天发现通过 Ice发送请求传递一个大块数据时,当请求的体积大于1.2M后,直接抛出异常Connection Lost,对方peer或是断开了.通过防火墙配置排查,以及对同一网络同一机器的php服务p ...
- python网络编程-socket发送大数据包问题
一:什么是socket大数据包发送问题 socket服务器端或者客户端在向对方发送的数据大于对方接受的缓存时,会出现第二次接受还接到上次命令发送的结果.这就出现象第一次接受结果不全,第二次接果出现第一 ...
- socket对于大数据的发送和接收
大数据是指大于32K或者64K的数据. 大数据的发送和接收通过TSTREAM对象来进行是非常方便的. 我们把大数据分割成一个个4K大小的小包,然后再依次传输. 一.大数据的发送的类语言描述: 1)创建 ...
- ZeroC Ice 暂记
摘自: http://weibo.com/p/1001603869896789339575 原文地址: http://www.oschina.net/question/865233_242146 吴治 ...
- 开发zeroc ice应用入门(java开发ice应用,python开发ice应用,java与python结合开发ice服务)
ice作为一种rpc框架,为主流平台设计,包括Windows和Linux,支持广泛的语言,包括C++,Java,C#(和其他.Net的语言,例如Visual Basic),Python,Ruby,PH ...
- 大数据量冲击下Windows网卡异常分析定位
背景 mqtt的服务端ActiveMQ在windows上,多台PC机客户端不停地向MQ发送消息. 现象 观察MQ自己的日志data/activemq.log里显示,TCP链接皆异常断开.此时尝试从服务 ...
- YARN-MR 大数据第二天
大数据第二天 1.YARN(管理和调度集群中的各类资源) 1.1 产生的背景: 1.直接源于MR版本1的缺陷(如:单点故障.难以支持MR之外的计算框架等) 2.多计算框架各自为站,数据共享困难(如:M ...
- Hadoop 大数据第一天
大数据第一天 1.Hadoop生态系统 1.1 Hadoop v1.0 架构 MapReduce(用于数据计算) HDFS(用于存储数据) 1.2 Hadoop v2.0 架构 MapReduce(用 ...
随机推荐
- UI测试之元素定位
定位方式优先级选择: ID>Name>CSS>XPath 1.使用id定位 2.使用name定位 3.使用class定位 4.使用css选择器定位 示例xml: <?xml ...
- java-反编译工具(luyten)
下载地址:https://github.com/deathmarine/Luyten
- 使用Redis在Hibernate中进行缓存
Hibernate是Java编程语言的开放源代码,对象/关系映射框架.Hibernate的目标是帮助开发人员摆脱许多繁琐的手动数据处理任务.Hibernate能够在Java类和数据库表之间以及Java ...
- mysql库表优化实例
一.SQL优化 1.优化SQL一般步骤 1.1 查看SQL执行频率 SHOW STATUS LIKE 'Com_%'; Com_select:执行SELECT操作的次数,一次查询累加1.其他类似 以下 ...
- 面对对象高阶+反射+魔法方法+单例(day22)
目录 昨日内容 组合 封装 property装饰器 多态 鸭子类型 今日内容 classmethod staticmethod 面对对象高级 isinstance issubclass 反射(重要) ...
- QTCreator配置调试参数
1. 调试参数在“Projects”的配编译参数那儿,编译参数build的旁边run中 2. 加断点是在文件行数左边那个地方
- 2018.8.9 python中的动态传参与命名空间
主要内容: 1.函数参数 ----动态传参 2.名称空间与作用域 3.函数的嵌套 4.global,nonlocal关键字 一.函数参数 ------动态传参 形参的第三种:动态传参 动态传参分为两种 ...
- Android H5混合开发(1):构建Cordova 项目
Cordova是什么 Apache Cordova是一个开源的移动开发框架.允许你用标准的web技术-HTML5,CSS3和JavaScript做跨平台开发. 以移动平台为例,安卓.IOS平台设备的常 ...
- null与undefined的区别?
古之立大事者,不惟有超世之才,亦必有坚忍不拔之志. ——北宋· 苏 轼<晁错论> 1.首先看一个判断题:null和undefined 是否相等 console.log(null== ...
- eclipse 工具翻译插件安装
http://download.eclipse.org/technology/babel/update-site/R0.15.1/oxygen