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同步与异步之相关背景知识(六)
在之前的五篇随笔中,已经介绍了.NET 类库中实现并行的常见方式及其基本用法,当然.这些基本用法远远不能覆盖所有,也只能作为一个引子出现在这里.以下是前五篇随笔的目录: .NET 同步与异步之封装成T ...
- Dropzone.js实现文件拖拽上传
dropzone.js是一个开源的JavaScript库,提供 AJAX 异步文件上传功能,支持拖拽文件.支持最大文件大小.支持设置文件类型.支持预览上传结果,不依赖jQuery库. 使用Dropzo ...
- MongoDB学习笔记六—查询下
查询内嵌文档 数据准备 > db.blog.find().pretty() { "_id" : ObjectId("585694e4c5b0525a48a441b5 ...
- nginx安装
nginx工作模式-->1个master+n个worker进程 安装nginx的所需pcre库[用于支持rewrite模块] 下载软件方法: 搜索 pcre download 网址:http: ...
- Xamarin.Android之使用百度地图起始篇
一.前言 如今跨平台开发层出不穷,而对于.NET而言时下最流行的当然还是Xamarin,不仅仅能够让我们在熟悉的Vs下利用C#开发,在对原生态类库的支持方面也有着非常的好支持,今天我们将会以百度地图类 ...
- Mac-OSX的Python3.5虚拟环境下安装Opencv
Mac-OSX的Python3.5虚拟环境下安装Opencv 1 关键词 关键词:Mac,OSX,Python3.5,Virtualenv,Opencv 2 概述 本文是一篇 环境搭建 的基础 ...
- Integer.parseInt 引发的血案
Integer.parseInt 处理一个空字符串, 结果出错了, 程序没有注意到,搞了很久, 引发了血案啊!! 最后,终于 观察到了, 最后的部分: Caused by: java.lang.NoC ...
- 【原】关于Python中setuptools安装的问题
在生成package的时候,需要在setup.py中引入setuptools包,可是却报告如下错误: ImportError: No module named setuptools 解决办法就是下载s ...
- (转)倾力总结40条常见的移动端Web页面问题解决方案
原文链接:戳这里 1.安卓浏览器看背景图片,有些设备会模糊. 用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作怪,因为手机分辨率太 ...
- WCF学习之旅—WCF4.0中的简化配置功能(十五)
六 WCF4.0中的简化配置功能 WCF4.0为了简化服务配置,提供了默认的终结点.绑定和服务行为.也就是说,在开发WCF服务程序的时候,即使我们不提供显示的 服务终结点,WCF框架也能为我们的服务提 ...