大数据、多核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的更多相关文章

  1. FunDA(2)- Streaming Data Operation:流式数据操作

    在上一集的讨论里我们介绍并实现了强类型返回结果行.使用强类型主要的目的是当我们把后端数据库SQL批次操作搬到内存里转变成数据流式按行操作时能更方便.准确.高效地选定数据字段.在上集讨论示范里我们用集合 ...

  2. FunDA(12)- 示范:强类型数据源 - strong typed data sources

    FunDA设计的主要目的是解决FRM(Functional Relation Mapping)如Slick这样的批次型操作工具库数据源行间游动操作的缺失问题.FRM产生的结果集就是一种静态集合,缺乏动 ...

  3. FunDA(4)- 数据流内容控制:Stream data element control

    上节我们探讨了通过scalaz-stream-fs2来驱动一套数据处理流程,用fs2的Pipe类型来实现对数据流的逐行操作.本篇讨论准备在上节讨论的基础上对数据流的流动和元素操作进行优化完善.如数据流 ...

  4. FunDA(14)- 示范:并行运算,并行数据库读取 - parallel data loading

    FunDA的并行数据库读取功能是指在多个线程中同时对多个独立的数据源进行读取.这些独立的数据源可以是在不同服务器上的数据库表,又或者把一个数据库表分成几个独立部分形成的独立数据源.当然,并行读取的最终 ...

  5. FunDA(11)- 数据库操作的并行运算:Parallel data processing

    FunDA最重要的设计目标之一就是能够实现数据库操作的并行运算.我们先重温一下fs2是如何实现并行运算的.我们用interleave.merge.either这几种方式来同时处理两个Stream里的元 ...

  6. FunDA(9)- Stream Source:reactive data streams

    上篇我们讨论了静态数据源(Static Source, snapshot).这种方式只能在预知数据规模有限的情况下使用,对于超大型的数据库表也可以说是不安全的资源使用方式.Slick3.x已经增加了支 ...

  7. FunDA(13)- 示范:用户自定义操作函数 - user defined tasks

    FunDA是一种函数式的编程工具,它所产生的程序是由许多功能单一的细小函数组合而成,这些函数就是用户自定义操作函数了.我们在前面曾经提过FunDA的运作原理模拟了数据流管道.流元素在管道流动的过程中被 ...

  8. FunDA(5)- Reactive Streams:Play with Iteratees

    FunDA的设计目标就是把后台数据库中的数据搬到内存里,然后进行包括并行运算的数据处理,最后可能再对后台数据库进行更新.如果需要把数据搬到内存的话,那我们就必须考虑内存是否能一次性容纳所有的数据,有必 ...

  9. FunDA(17)- 示范:异常处理与事后处理 - Exceptions handling and Finalizers

    作为一个能安全运行的工具库,为了保证占用资源的安全性,对异常处理(exception handling)和事后处理(final clean-up)的支持是不可或缺的.FunDA的数据流FDAPipeL ...

随机推荐

  1. 手把手教你写一个RN小程序!

    时间过得真快,眨眼已经快3年了! 1.我的第一个App 还记得我14年初写的第一个iOS小程序,当时是给别人写的一个单机的相册,也是我开发的第一个完整的app,虽然功能挺少,但是耐不住心中的激动啊,现 ...

  2. c# 基础 object ,new操作符,类型转换

    参考页面: http://www.yuanjiaocheng.net/webapi/config-webapi.html http://www.yuanjiaocheng.net/webapi/web ...

  3. 关于CSS inline-block、BFC以及外边距合并的几个小问题

    CSS inline-block和BCF对于初学者来说,总是弄不太明白,下面记录下我在学习这块知识的过程中遇到的几个问题,供大家参考,有不足的地方,欢迎大家批评指正. 一.在什么场景下会出现外边距合并 ...

  4. 开源 iOS 项目分类索引大全 - 待整理

    开源 iOS 项目分类索引大全 GitHub 上大概600个开源 iOS 项目的分类和介绍,对于你挑选和使用开源项目应该有帮助 系统基础库 Category/Util sstoolkit 一套Cate ...

  5. java.IO输入输出流:过滤流:buffer流和data流

    java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...

  6. JS高级前端开发群加群说明及如何晋级

    JS高级前端开发群加群说明 一.文章背景: 二. 高级群: 三. 加入方式: 四. 说明:   一.文章背景: 去年年初建了几个群,在不经意间火了,一直排在“前端开发”关键字搜索结果第一名.当然取得这 ...

  7. SQLSERVER中NULL位图的作用

    SQLSERVER中NULL位图的作用 首先感谢宋沄剑提供的文章和sqlskill网站:www.sqlskills.com,看下面文章之前请先看一下下面两篇文章 SQL Server误区30日谈-Da ...

  8. 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具

    上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...

  9. Git入门资料汇总

    Git是一个非常好用的版本控制工具,同时,它也是一个相对比较复杂的工具,想要掌握它还是需要花一番功夫的.网络上关于Git的入门资料已经很多了,我就不再重复了,直接把我学习的文章放在这里. Git详解 ...

  10. ASP.NET Web API 过滤器创建、执行过程(一)

    ASP.NET Web API 过滤器创建.执行过程(一) 前言 在上一篇中我们讲到控制器的执行过程系列,这个系列要搁置一段时间了,因为在控制器执行的过程中包含的信息都是要单独的用一个系列来描述的,就 ...