FunDA(0)- Functional Data Access accessible to all
大数据、多核CPU驱动了函数式编程模式的兴起。因为函数式编程更适合多线程、复杂、安全的大型软件编程。但是,对许多有应用软件开发经验的编程者来说,函数式编程模式是一种全新的、甚至抽象的概念,可能需要很长时间的学习、积累才能完全掌握和适应。对一些不算FP编程专家的人来说,如何用他们习惯的方式来使用现成的函数式软件如Slick,Spark等可能就变得是件很迫切的事情了。设计FunDA的想法就是希望那些惯用ORM(Object Relational Mapper)开发MIS系统的编程人员们能快速轻松地使用像Slick这样的FRM(Functional Relation Mapper)。更重要的是能通过FunDA来进入数据库编程的最新境界:并行数据运算(Parallel Data Access),这就代表FunDA必须具备至少两条特性:简单通用的API和对并行运算的支持。
可以说,FunDA是从零开始设计的。而且最终它应该是某种中间件:在FRM和应用软件中间的一层工具库。由于FunDA是基于函数式编程模式的,通过函数组合可以实现某种安全可维护的大型软件工具库。但设计主题又要求必须屏蔽这个库的复杂函数式编程特性,使传统的数据库应用软件编程人员很容易掌握使用。
FunDA包括两项重大功能:
一、提供按行处理数据功能的支持:FRM最强大的功能之一就是能够实现Query的函数组合,然后产生SQL语句来对后台数据库进行操作,返回结果是一个集合。这样编程人员就可以像使用普通的函数式集合一样用现成的集合操作函数来操作返回结果。首先,SQL语言是一种批次型的数据处理语言,如果用来逐行处理数据会严重影响效率,甚至无法实现对于某些特定数据的处理功能,如图像处理。再者函数式的集合操作函数对于不熟悉函数式编程模式的编程人员来说比较抽象,使用起来不顺手,会影响用户使用体验。如果把FRM产生的Query结果集合变成如同JDBC的resultset,可以把resultset的每行(row)在内存中进行处理,就能解决FRM逐行处理功能缺失的问题,而且传统的数据库编程人员都比较熟悉JDBC的这种逐行处理数据模式。实际上这项功能的主题思想就是提供一种数据格式转换函数实现:StoreData -> MemoryRow -> DataStore 这样的转换。StoreData -> MemoryRow转换是指把从数据库选出的数据逐条record载入内存进行处理。MemoryRow -> DataStore转换则是把内存中record内容转换成SQL语句再发送给后台数据库处理。
二、提供并行数据处理功能:对于大数据和多核CPU风行的时代,如何能充分利用多核CPU硬件技术来应对大数据应该是一种迫切的想法。可以说,并行运算应该是一种核心的解决方案。在传统数据库编程模式中实现并行运算很困难,或者说是很难做好做对。通过函数式编程模式来解决并行运算是可行解决方法之一。希望FunDA所提供的并行运算功能能让传统数据库编程人员无需太高的函数式编程模式门槛就可以让他们能快速熟悉并掌握,实现数据库程序的并行运算。
FunDA的总体开发方式是:先实现功能要求,然后再进行代码重新组织、优化、开源、维护。功能开发过程框架如下:
一、数据行操作:读取数据后进行数据格式转换,结果为强类型数据行(Strong Typed DataRow),即带字段名称的数据行。数据行基础操作代表对后台数据库的更新,包括:append、update、delete。用数据行的状态来代表对后台数据库的具体操作。数据行状态变化属于不可变模式操作(immutable operations)。
二、数据流动管理:moveNext,载入下一数据行直到完成所有数据源读取、moveLast,强行终止数据读取。
三、运算管理:运算可以分成两大类:一是数据源产生loadData,包括从后台数据库读取或者直接产生形成数据源头。二是按每条数据行要求进行状态处理函数的运算run(func)或者并行运算runPar(func)。产生数据源同样可以实现并行运算,比如通过构建一个多任务计算对象后进行运算。模拟了个应用场景可能是如下这样的:
buildPar(loadData(age.between(,)) //构建并行运算对象
.with(loadData(age.between(,))
.with(loadData(age.between(,))
.runPar //开始并行读取,产生数据源
.runPar(updateRow) //对源头产生的数据行进行并行处理
数据流动管理和运算管理功能可以通过某种流库(stream library)如scalar-streams-fs2、aka-stream等提供的现有运算功能实现。
大体的开发计划可以分成下面几个阶段:
一、scalaz-streams-fs2+slick:先直接绑定slick作为FRM部分与后台数据库发生关系、fs2作为在内存中数据流和运算管理工具来实现FunDA的功能组成部分
二、scalaz-streams-fs2+freemonad-FRM-DSL:用freemonad模拟一套数据库数据操作DSL(domain-specific-language)。通过freemonad的多种功能实现模式(separation of concern)来实现FunDA数据库具体操作与各种FRM、ORM的松散耦合(loose coupling),最终能同时支持slick、doobie直至jdbc等数据库操作api。
三、freemonad stream+FRM DSL:用freemonad来抽象FunDA全部操作,全面实现与下层软件工具库的松散耦合,同时提供scalaz-streams-fs2、akka-stream、slick、doobie、jdbc这些工具库的功能实现。创建相关DSL形成一套完整的泛型api。
四、把FunDA推上开源平台GitHub
好了,思路整理完毕后下面应该是一系列编程过程的描述了。
FunDA(0)- Functional Data Access accessible to all的更多相关文章
- FunDA(2)- Streaming Data Operation:流式数据操作
在上一集的讨论里我们介绍并实现了强类型返回结果行.使用强类型主要的目的是当我们把后端数据库SQL批次操作搬到内存里转变成数据流式按行操作时能更方便.准确.高效地选定数据字段.在上集讨论示范里我们用集合 ...
- FunDA(12)- 示范:强类型数据源 - strong typed data sources
FunDA设计的主要目的是解决FRM(Functional Relation Mapping)如Slick这样的批次型操作工具库数据源行间游动操作的缺失问题.FRM产生的结果集就是一种静态集合,缺乏动 ...
- FunDA(4)- 数据流内容控制:Stream data element control
上节我们探讨了通过scalaz-stream-fs2来驱动一套数据处理流程,用fs2的Pipe类型来实现对数据流的逐行操作.本篇讨论准备在上节讨论的基础上对数据流的流动和元素操作进行优化完善.如数据流 ...
- FunDA(14)- 示范:并行运算,并行数据库读取 - parallel data loading
FunDA的并行数据库读取功能是指在多个线程中同时对多个独立的数据源进行读取.这些独立的数据源可以是在不同服务器上的数据库表,又或者把一个数据库表分成几个独立部分形成的独立数据源.当然,并行读取的最终 ...
- FunDA(11)- 数据库操作的并行运算:Parallel data processing
FunDA最重要的设计目标之一就是能够实现数据库操作的并行运算.我们先重温一下fs2是如何实现并行运算的.我们用interleave.merge.either这几种方式来同时处理两个Stream里的元 ...
- FunDA(9)- Stream Source:reactive data streams
上篇我们讨论了静态数据源(Static Source, snapshot).这种方式只能在预知数据规模有限的情况下使用,对于超大型的数据库表也可以说是不安全的资源使用方式.Slick3.x已经增加了支 ...
- FunDA(13)- 示范:用户自定义操作函数 - user defined tasks
FunDA是一种函数式的编程工具,它所产生的程序是由许多功能单一的细小函数组合而成,这些函数就是用户自定义操作函数了.我们在前面曾经提过FunDA的运作原理模拟了数据流管道.流元素在管道流动的过程中被 ...
- FunDA(5)- Reactive Streams:Play with Iteratees
FunDA的设计目标就是把后台数据库中的数据搬到内存里,然后进行包括并行运算的数据处理,最后可能再对后台数据库进行更新.如果需要把数据搬到内存的话,那我们就必须考虑内存是否能一次性容纳所有的数据,有必 ...
- FunDA(17)- 示范:异常处理与事后处理 - Exceptions handling and Finalizers
作为一个能安全运行的工具库,为了保证占用资源的安全性,对异常处理(exception handling)和事后处理(final clean-up)的支持是不可或缺的.FunDA的数据流FDAPipeL ...
随机推荐
- .NET应用和AEAI CAS集成详解
1 概述 数通畅联某综合SOA集成项目的统一身份认证工作,需要第三方系统配合进行单点登录的配置改造,在项目中有需要进行单点登录配置的.NET应用系统,本文专门记录.NET应用和AEAI CAS的集成过 ...
- Visual Studio:error MSB8020(搬运)
状况如下: error MSB8020: The builds tools for v120 (Platform Toolset = 'v120') cannot be found. To build ...
- 为什么很多SaaS企业级产品都熬不过第一年
因工作缘由,笔者与周边数位SaaS企业级应用的创始人.运营负责人有过深入接触,发现一个有趣的现象:刚起步时,蓝图远志.规划清晰,但是一路下来,却异常艰难,有些甚至熬不过第一年,就关门歇业. 2015年 ...
- Android中的多线程断点下载
首先来看一下多线程下载的原理.多线程下载就是将同一个网络上的原始文件根据线程个数分成均等份,然后每个单独的线程下载对应的一部分,然后再将下载好的文件按照原始文件的顺序"拼接"起来就 ...
- 转:MSSQL还原单mdf文件报1813错误
原文地址:http://www.cnblogs.com/clownkings/p/4950865.html 解决办法: 1.首先要备份好mdf文件,如果他没了经理非吃了你不可.都不吐骨头的. 2.在数 ...
- firebug不能加载JS文件 ,无法进行JS脚本调试
提示: 本页面不包含 Javascript 如果 <script> 标签有 "type" 属性,其值应为 "text/javascript" 或者& ...
- nginx代理https站点(亲测)
nginx代理https站点(亲测) 首先,我相信大家已经搞定了nginx正常代理http站点的方法,下面重点介绍代理https站点的配置方法,以及注意事项,因为目前大部分站点有转换https的需要所 ...
- 自制文件上传JS控件,支持IE、chrome、firefox etc.
(function() { if (window.FileUpload) { return; } window.FileUpload = function (id, url) { this.id = ...
- CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator
CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator 我还没有用过Compute Shader,所以现在把红宝书里的例子拿来了,加入CSharpGL中. ...
- ABP源码分析二十八:ABP.MemoryDB
这个模块简单,且无实际作用.一般实际项目中都有用数据库做持久化,用了数据库就无法用这个MemoryDB 模块了.原因在于ABP限制了UnitOfWork的类型只能有一个(前文以作介绍),一般用了数据库 ...