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(用 ...
随机推荐
- opencv::直方图均衡化
直方图均衡化 图像直方图: 是指对整个图像像在灰度范围内的像素值是指对整个图像像在灰度范围内的像素值(~)统计出现频率次数,据此生成的直方图,称为图像直方图-直方图. 直方图反映了图像灰度的分布情况. ...
- 常用函数-Time
#pragma pack(push,1) /* 在这中间定义的结构体,已单字节对齐 */ #pragma pack(pop) /************************************ ...
- pytest7-多个fixtures执行顺序
举例: import pytest order = [] @pytest.fixture(scope='session') def s1(): order.append("s1") ...
- Mybatis源码阅读 之 玩转Executor
承接上篇博客, 本文探究MyBatis中的Executor, 如下图: 是Executor体系图 本片博客的目的就是探究如上图中从顶级接口Executor中拓展出来的各个子执行器的功能,以及进一步了解 ...
- LeetCode108——Convert Sorted Array to Binary Search Tree
题目: Given an array where elements are sorted in ascending order, convert it to a height balanced BST ...
- Java自动化测试框架-04 - 来给你的测试报告化个妆整个形 - (上)(详细教程)
简介 前边通过宏哥的讲解和分享想必小伙伴们和童鞋们都已经见过testng框架生成的测试报告,是不是它的样子和长相实在是不敢让大家伙恭维.那么今天宏哥就当一回美容师,由宏哥来给它美美容:当一回外科医生, ...
- CCBPM工作流系统中如何在特定的一个步骤,调用起另外一条流程
关键词: 工作流快速开发平台 工作流设计 业务流程管理 asp.net 开源工作流bpm工作流系统 java工作流主流框架 自定义工作流引擎 需求描述: 1, 操作员在操作最后一个节点时, ...
- JVM(6) 字节码执行引擎
编译器(javac)将Java源文件(.java文件)编译成Java字节码(.class文件). 类加载器负责加载编译后的字节码,并加载到运行时数据区(Runtime Data Area) 通过类加载 ...
- 基于jquery,php实现AJAX长轮询(LongPoll),类似推送机制
HTTP是无状态.单向的协议,用户只能够通过客服端向服务器发送请求并由服务器处理发回一个响应.若要实现聊天室.WEBQQ.在线客服.邮箱等这些即时通讯的应用,就要用到“ 服务器推送技术(Comet)” ...
- ios下app内嵌h5页面是video适配问题
ios下做新闻详情用h5页面实现然后打包到app中,其中新闻详情页会有视频,安卓下video的poster可以做到适应video大小,但是ios下会按照poster图片大小将video等比撑大,但是视 ...