《什么是流式思维?》读后自认为的精华内容
2017-12-10 22:02
204 查看
背景
什么是流
面向函数流式特点
流式处理的基本要素是-事件
流式思维在大数据架构上应用
流式思维在微观上应用
流式思维巧妙的回避资源争夺问题的体现
流式思维的特点总结
A little bit of progress every dayCome on
我们在这个代码中相当于启动了四条不会交汇的流,实际是四个线程,这四个线程正好利用四核CPU,这样避免了一个CPU做红绿灯。
解决这个问题通过引入流式处理,流式方法的特点是事件流,那么我们这里引入事件:
持续不断地调用changeChannel就会产生持续不断的事件流,在事件流的终点,我们再进行慢速处理,这样不会影响原来的流程,这是在一个水流管道上再分流出一个管道,从而不影响原来水流的操作方式,正如南水北调工程是在长江这个水流中分支出一个通道流向北方。
这种流式处理正是LMAX架构的核心,依靠Disruptor这种管道队列,LMAX能做到每秒处理600万订单的吞吐量,正如设计一个无堵塞的港口,其处理能力只有时间的限制,没有被处理对象数量的限制一样。
上述案例,我们巧妙将慢速的数据库操作转移他处,但是要真正解决数据库的资源争夺,我们还是可以使用流式思维,数据库就不要存储可变的状态数据,因为对同一个数据表记录会存在多个修改的引发的争夺现象,我们只要向数据库或文件中增加新数据,而不是修改原来的数据,永远只是追加Append操作,这种Append是典型的流式操作,我们可以将事件流不断追加到数据库或文件系统等慢速设备上,需要时再通过事件流加载再次播放到指定的状态。这是Event Sourcing/CQRS的基本思路。
总之,流式思维应用在架构设计上大有好处,架构治理如同治水,流式思维类似大禹治水,以疏替堵,顺势而为,面向对象 面向函数 异步编程 并发编程等都只是手段方法而已。
================================================================
什么是流
面向函数流式特点
流式处理的基本要素是-事件
流式思维在大数据架构上应用
流式思维在微观上应用
流式思维巧妙的回避资源争夺问题的体现
流式思维的特点总结
A little bit of progress every dayCome on
背景
最近在学习很好很实用的库:RxJava。就在学习的过程中,偶然的接触到了“流式api”一词,然后对这个词进行搜索。搜索到一篇很棒的文章讲什么是流式思维,进而记录读文章后自认为的精华内容供以后学习理解并分享转载这篇文章什么是流式思维?什么是流
最先联想到的是“水流”,潺潺不断,流是一种动态过程,如果你想截断水流,最简单的是堵住它,所以,流是不能被堵塞的,也就是非堵塞,只有非堵塞才会形成流。面向函数流式特点
流式的面向函数思维会更侧重平台制度性的建设,会忽视个体的差异,拥抱个体的大数据量。从这点来说,流式思维更适合进行大数据处理和分析,比如hadoop和Spark。流式处理的基本要素是-事件
事件是一个一旦发生就不再改变的值对象,每个事件结构基本一样,我们不关心事件内部的规则和状态,而是关心无数个事件的处理,因此事件是一个流式系统的基本要素,有了无数个事件就需要有事件的源和目的,掌握这三点就容易帮助我们理解流式系统。流式思维在大数据架构上应用
比如Storm这个大数据处理框架,其有几个好像陌生的概念:Spout Tuple Bolt,如果单从字面上理解是“嘴” “元组” “螺栓”等意思,但是你从流式角度去思考就很容易理解,Spout嘴是产生事件流的源,而Tuple元组代表一个个小事件,多个事件就是Tuples了,Tuples代表了事件流,而Bolt代表流过程中一个处理器,如同将两个水管接在一起的接头。流式思维在微观上应用
流式思维不但可以应用在大数据处理上,也能使用在微观的CPU使用上,前面我们谈到CPU类似红绿灯调度员,调度两条线程(水管)的协调,如果我们采取流式思维,设计出不会交汇的多条水管,那么CPU就不会去做红绿灯这种看似高效率实际是低效率的事情。比如我们在安卓编程中,可以采取如下流式编程:apiService.login() //后端线程 .getUserData() //后端线程 .saveUserData() //后端线程 .subscribe(Subscriber { //UI线程 void onComplete(){} void onError(Exception e){} void onNext(Object o){} });
我们在这个代码中相当于启动了四条不会交汇的流,实际是四个线程,这四个线程正好利用四核CPU,这样避免了一个CPU做红绿灯。
流式思维巧妙的回避资源争夺问题的体现
比如这里我们会将状态保存到数据库中,数据库操作需要连接池等慢处理:public void changeChannel(changeCommand cmd){ state = cmd.getState(); //修改当前状态为新的状态 repository.save(state); //这个慢速会成为整个方法处理过程的瓶颈。 }
解决这个问题通过引入流式处理,流式方法的特点是事件流,那么我们这里引入事件:
public void changeChannel(changeCommand cmd){ state = cmd.getState(); //修改当前状态为新的状态 producer.send(changeEvent en); //触发一个changeEvent事件,没有堵塞 }
持续不断地调用changeChannel就会产生持续不断的事件流,在事件流的终点,我们再进行慢速处理,这样不会影响原来的流程,这是在一个水流管道上再分流出一个管道,从而不影响原来水流的操作方式,正如南水北调工程是在长江这个水流中分支出一个通道流向北方。
这种流式处理正是LMAX架构的核心,依靠Disruptor这种管道队列,LMAX能做到每秒处理600万订单的吞吐量,正如设计一个无堵塞的港口,其处理能力只有时间的限制,没有被处理对象数量的限制一样。
上述案例,我们巧妙将慢速的数据库操作转移他处,但是要真正解决数据库的资源争夺,我们还是可以使用流式思维,数据库就不要存储可变的状态数据,因为对同一个数据表记录会存在多个修改的引发的争夺现象,我们只要向数据库或文件中增加新数据,而不是修改原来的数据,永远只是追加Append操作,这种Append是典型的流式操作,我们可以将事件流不断追加到数据库或文件系统等慢速设备上,需要时再通过事件流加载再次播放到指定的状态。这是Event Sourcing/CQRS的基本思路。
总之,流式思维应用在架构设计上大有好处,架构治理如同治水,流式思维类似大禹治水,以疏替堵,顺势而为,面向对象 面向函数 异步编程 并发编程等都只是手段方法而已。
流式思维的特点总结
1、流式擅长处理大数据 2、流式来源是集合而不是个体 3、流式以疏导替代红绿灯式的堵塞 4、流式管道不可交汇,避免拥挤;流式管道可分支,缓解拥挤
================================================================
A little bit of progress every day!Come on!
相关文章推荐
- 我国医药工业自动化的特点、需求和内容究竟是什么?(二)
- 自然语言处理能够把全网内容组织到什么程度?
- 什么是 FOUC(无样式内容闪烁)?你如何来避免 FOUC?
- 看雪精华内容下载
- 你认为人性最大的「恶」是什么?(转魏则西)
- MDL 中实际包含的内容是什么
- 项目估算与计划不是一般的难!(4)——计划有什么内容?
- [python]你有一个目录,放了你一个月的日记,都是 txt,为了避免分词的问题,假设内容都是英文,请统计出你认为每篇日记最重要的词。
- 软件实施工程师是一个什么样的工作?他的具体工作内容是什么?发展前景怎样?
- 打开网上下载的CHM文件什么内容也看不到
- win10预览版10136更新了什么?win10手机预览版10136更新内容大全
- ELF文件格式;ELF文件是什么,里面包含什么内容
- Temporary ASP.NET Files 文件夹中保存的是什么内容
- (转)当别人努力的时候,你在做什么? 评论事情的一种态度 当你在抱怨的时候,为什么不想想我做了什么? 把简单的原则坚持贯彻下去 消极的心态,养成了惯性的思维,一切都是不好的。 也许这就是人性的弱点,不经意的习惯,却逐渐腐蚀了你的人生。
- 【精华】【excel VBA】 高亮显示相同内容 所在Column(列) 或 Row(行)
- 当前目录下有a和b两个文件,执行命令“ls>c”,请问文件c里面的内容是什么?
- 哎,最近都忙的什么啊,什么也没有搞,光玩了(无内容)
- 什么是做博士的目的? 读后很深
- [57] 测试技术常见的十一种问题之五:文档测试主要包含什么内容?
- 个人博客到底要提供什么内容