FunDA的设计目标就是把后台数据库中的数据搬到内存里,然后进行包括并行运算的数据处理,最后可能再对后台数据库进行更新.如果需要把数据搬到内存的话,那我们就必须考虑内存是否能一次性容纳所有的数据,有必要配合数据处理分部逐步读入,这就是Reactive Stream规范主要目的之一.所以在设计FunDA的数据源(Source)之前必须要考虑实现reacive-data-stream.Slick 3.x版在功能上的突破之一就是实现了对Reactive-Stream API的支持.遗憾的是新版的Sli…
在上一节我们介绍了Iteratee.它的功能是消耗从一些数据源推送过来的数据元素,不同的数据消耗方式代表了不同功能的Iteratee.所谓的数据源就是我们这节要讨论的Enumerator.Enumerator是一种数据源:它会根据下游数据消耗方(Iteratee)的具体状态主动向下推送数据元素.我们已经讨论过Iteratee的状态Step类型: trait Step[E,+A] case class Done[+A,E](a: A, remain: Input[E]) extends Step[…
Reactive-Stream不只是简单的push-model-stream, 它还带有“拖式”(pull-model)性质.这是因为在Iteratee模式里虽然理论上由Enumerator负责主动推送数据,实现了push-model功能.但实际上Iteratee也会根据自身情况,通过提供callback函数通知Enumerator可以开始推送数据,这从某种程度上也算是一种pull-model.换句话讲Reactive-Streams是通过push-pull-model来实现上下游Enumera…
上篇我们讨论了静态数据源(Static Source, snapshot).这种方式只能在预知数据规模有限的情况下使用,对于超大型的数据库表也可以说是不安全的资源使用方式.Slick3.x已经增加了支持Reactive-Streams功能,可以通过Reactive-Streams API来实现有限内存空间内的无限规模数据读取,这正符合了FunDA的设计理念:高效.便捷.安全的后台数据处理工具库.我们在前面几篇讨论里介绍了Iteratee模式,play-iteratees支持Reactive-St…
FunDA的并行数据库读取功能是指在多个线程中同时对多个独立的数据源进行读取.这些独立的数据源可以是在不同服务器上的数据库表,又或者把一个数据库表分成几个独立部分形成的独立数据源.当然,并行读取的最终目的是提高程序的运算效率.在FunDA中具体的实现方式是对多个独立的数据流进行并行读取形成一个统一综合的数据流.我们还是用上次示范所产生的表AQMRPT作为样板数据.在这次示范里我们需要把AQMRPT表中的STATENAME,COUNTYNAME字段抽取出来形成两个独立的表STATE和COUNTY.…
我们在前面用了许多章节来讨论如何把数据从后台数据库中搬到内存,然后进行逐行操作运算.我们选定的解决方案是把后台数据转换成内存中的数据流.无论在打开数据库表或从数据库读取数据等环节都涉及到对数据库表这项资源的安全使用:我们最起码要保证在完成使用或者使用中途出现错误异常退出时能释放占用的资源.谈到资源使用安全,不得不想到函数式编程通用的那个bracket函数,fs2同样提供了这个函数: def bracket[F[_],R,A](r: F[R])(use: R => Stream[F,A], rel…
大数据.多核CPU驱动了函数式编程模式的兴起.因为函数式编程更适合多线程.复杂.安全的大型软件编程.但是,对许多有应用软件开发经验的编程者来说,函数式编程模式是一种全新的.甚至抽象的概念,可能需要很长时间的学习.积累才能完全掌握和适应.对一些不算FP编程专家的人来说,如何用他们习惯的方式来使用现成的函数式软件如Slick,Spark等可能就变得是件很迫切的事情了.设计FunDA的想法就是希望那些惯用ORM(Object Relational Mapper)开发MIS系统的编程人员们能快速轻松地使…
在上节讨论里我们介绍了数据行流式操作的设想,主要目的是把后台数据库的数据载入前端内存再拆分为强类型的数据行,这样我们可以对每行数据进行使用和处理.形象点描述就是对内存里的一个数据流(data-stream)进行逐行操作.我们在上节用foreach模拟了一个流控来示范数据行的操作处理.在这节我们讨论一下用scalaz-stream-fs2作为数据流管理工具来实现FunDA的数据行流动管理功能.fs2的Stream是一种自然的拖动型(pull-model)数据流.而fs2的Pipe类型则像是管道的阀…
作为一个能安全运行的工具库,为了保证占用资源的安全性,对异常处理(exception handling)和事后处理(final clean-up)的支持是不可或缺的.FunDA的数据流FDAPipeLine一般是通过读取数据库数据形成数据源开始的.为了保证每个数据源都能被安全的使用,FunDA提供了事后处理finalizing程序接口来实现数据流使用完毕后的清理及异常处理(error-handling)程序接口来捕获和处理使用过程中出现的异常情况.首先,事后处理程序(finalizer)保证了在…
FunDA的并行运算施用就是对用户自定义函数的并行运算.原理上就是把一个输入流截分成多个输入流并行地输入到一个自定义函数的多个运行实例.这些函数运行实例同时在各自不同的线程里同步运算直至耗尽所有输入.并行运算的具体函数实例数是用fs2-nondeterminism的算法根据CPU内核数.线程池配置和用户指定的最大运算实例数来决定的.我们在这次示范里可以对比一下同样工作内容的并行运算和串形运算效率.在前面示范里我们获取了一个AQMRPT表.但这个表不够合理化(normalized):state和c…