从Exchager数据交换到基于trade-off的系统设计
可以使用JDK提供的Exchager类进行同步交换:进行数据交换的双方将互相等待对方,直到双方的数据都准备完毕,才进行交换。Exchager类很少用到,但理解数据交换的时机却十分重要,这是一个基于trade-off的系统设计。下述分析方法能扩展到诸多系统设计的场景中,帮助我们更好的进行trade-off。
《Java并发编程实战》中介绍了判定数据交换时机的两种方案,却不甚清晰。从“时机选择的目的”出发,实际上存在着三种方案,各方案又有优劣,从而产生了trade-off。本文比较了这三种方案,通过对数据交换时机的分析加强trade-off的意识。
定义
数据交换:在Exchanger的两方栅栏机制中,双方互相等待对方的数据。
如读线程在读取发生前持有“空缓存”,写线程在写入完成后持有“满缓冲”(“满”只表示写入完成),那么数据交换就是指将读线程的“空缓冲”与写线程的“满缓冲”交换。
方案比较
依据“时机选择的的目的”,存在三种方案:
方案1. 交换次数最少
从交换次数最少的目的出发,交换行为应该发生在缓冲满和缓冲空时,这两种情况下都不得不发生交换,以满足最低的响应需求。
缓冲满时(填充线程的缓冲),填充任务发现无法继续填充缓冲区,就发起交换,以减少数据(到空)继续填充;缓冲空时(清空线程的缓冲),清空任务发现无法继续清空,就发起交换,以增加数据(到满)继续清空。
也可以将实际的交换任务委派给专门的交换线程,填充任务和清空任务都向该线程申请执行交换。
方案2. 交换最及时(响应最及时)
从响应最及时的目的出发,交换行为应该发生在缓冲刚增加数据和缓冲刚减少数据时,以满足“存在数据即交换”的最高的响应需求。
这种方案相当于去掉了缓冲区。一方面,一旦缓存不空就立刻发生交换,交换后就没有了数据;另一方面,一旦缓存空就开始交换数据,交换后缓存就不空。看起来数据根本需要写入缓存就完成了交换。
也可以设置一个特别小的缓冲,比如1个字节。但交换区的缓冲减小,只会让交换双方各自维护的缓冲区加大。
方案3. 适度的交换频率和响应
很明显:交换次数最少的话,一些数据的处理过程就将延迟;响应最及时的话,交换频率太高,很浪费性能,甚至大型系统中耗电都会成为问题。
所以可采用折中的方案,达到适度的交换频率和响应:交换行为发生在缓冲被填充到一定程度并保持一定时间 t 后,同时一旦缓冲满或缓冲空就立即发生交换。
如果将时间 t 设置为 0,则退化为方案2;如果将时间 t 设置无穷大,则退化为方案1,从而既能兼容以上两种方案,又能根据实际响应需求静态配置,甚至根据实时的性能分析结果进行动态调整。
如果将Exchager比作“数据交换系统”,方案3即完成了对“数据交换系统”的trade-off,也就是基于成本(如耗电等)、收益(如延迟等)对系统设计作出的权衡、妥协。
总结
通过对三种Exchager数据交换时机的分析,加强了我们在系统设计中的trade-off意识。
《Java并发编程实战》中介绍了方案1和方案3。直接在书中看到方案1和方案3可能很难理解,但分析了上述trade-off过程后,就能轻松理解数据交换的时机了。
本文链接:从Exchager数据交换到基于trade-off的系统设计
作者:猴子007
出处:https://monkeysayhi.github.io
本文基于 知识共享署名-相同方式共享 4.0 国际许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名及链接。
从Exchager数据交换到基于trade-off的系统设计的更多相关文章
- 基于Http替补新闻WebService数据交换
该系统的工作之间的相互作用.随着信息化建设的发展,而业界SOA了解并带来低TOC(总拥有成本)其他优势.越来越多的高层次的信息使用者关注. 这里暂且不提SOA这种架构规划.在系统间集成协议简单的讨论. ...
- 【AS3】Flash与后台数据交换四种方法整理
随着Flash Player 9的普及,AS3编程也越来越多了,所以这次重新整理AS3下几种与后台数据交换方法.1.URLLoader(URLStream)2.FlashRemoting3.XMLSo ...
- json 数据交换格式与java
http://wiki.mbalib.com/wiki/数据交换 数据交换是指为了满足不同信息系统之间数据资源的共享需要,依据一定的原则,采取相应的技术,实现不同信息系统之间数据资源共享的过程. 数据 ...
- 常用两种数据交换格式之XML和JSON的比较
目前,在web开发领域,主要的数据交换格式有XML和JSON,对于XML相信每一个web developer都不会感到陌生: 相比之下,JSON可能对于一些新步入开发领域的新手会感到有些陌生,也可能你 ...
- android之JSON 进行网络数据交换
什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同一时候也易于机器解析和生成,很适合于server与client的交互. J ...
- XML和JSON两种数据交换格式的比较
在web开发领域,主要的数据交换格式有XML和JSON,对于在 Ajax开发中,是选择XML还是JSON,一直存在着争议,个人还是比较倾向于JSON的.一般都输出Json不输出xml,原因就是因为 x ...
- Disruptor——一种可替代有界队列完成并发线程间数据交换的高性能解决方案
本文翻译自LMAX关于Disruptor的论文,同时加上一些自己的理解和标注.Disruptor是一个高效的线程间交换数据的基础组件,它使用栅栏(barrier)+序号(Sequencing)机制协调 ...
- 【计算机网络基础】数据交换技术和多路复用技术的正(nao)确(can)打开方式
交换的作用 数据交换是计算机网络中两个终端进行数据传输的方式,它又可以分成两种类型:电路交换和分组交换.很显然,问题的核心在于“交换”,那么我们首先要思考的是:交换的作用是什么? “交换”的作 ...
- servlet与ajax数据交换(json格式)
JSON数据格式: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于的一个子集. JSON采用完全独 ...
随机推荐
- trycatch之catch对捕获异常的处理及后续代码的执行的探索
工作时,一直对try块中throw的异常对象,在catch中如何处理此异常,以及trycatchfinally完毕,程序是否就此停止还是继续运行很迷惑,于是参考网上的资料,自己写了些demo,去慢慢探 ...
- Python & PyCharm & Django 搭建web开发环境
一.安装软件 1.安装 Python 2.7.PyCharm.pip(Python包管理工具).Django ( pip install Django) 二.部署 1.PyCharm 新建Django ...
- sql 的理解
sql的作用有: 1.筛选数据,连接表 2.数据的补充,连接表 3.数据的加减乘除的运算,+ - * / 4.数据的逻辑运输,比如case..when...,decode,nvl,ifnull.... ...
- SimpleXML php 解析xml 的方法
SimpleXML是PHP5后提供的一套简单易用的xml工具集,可以把xml转换成方便处理的对象,也可以组织生成xml数据.不过它不适用于包含namespace的xml,而且要保证xml格式完整(we ...
- Alphabet Cookies
Alphabet Cookies 题目描述 Kitty likes cookies very much, and especially the alphabet cookies. Now, she g ...
- Android系统移植与驱动开发
21世纪,Android发展非常迅速,在市场上占有很大的比例,遥遥领先与iOS,很大程度上是因为任何人都可以利用Android的源代码定制完全属于自己的嵌入式开发系统,而不需要向Google交一分钱. ...
- Thinkphp5 微信公众号token验证不成功的原因
最近要启动微信项目,上个月就开始了解微信的开发,这个月要启动项目,配置微信公众号信息一直失败.为此,我甚至手工写了微信提交过来的记录,如: ×tamp=1510210523& ...
- apache ab工具安装测试
1.安装 安装包下载地址: 将 httpd-2.2.29.tar.gz 解压到目录 /apps/install/httpd-2.2.29 ,这是我放置的位置 cd /apps/install/http ...
- 2.spring 学习
1.spring简单工程搭建 http://www.cnblogs.com/yun965861480/p/6278193.html 2.spring数据源 http://www.cnblogs.com ...
- 修改已经创建的docker容器的端口映射
原始链接:https://stackoverflow.com/questions/19335444/how-do-i-assign-a-port-mapping-to-an-existing-dock ...