真正的低代码平台

低代码的定义

低代码是一种只需用很少甚至不需要代码即可快速开发系统,并将其快速配置和部署的技术和工具。

根据这个定义,我们就会发现很多工具都是低代码工具。例如:C# 程序员比较熟悉的 CodeSmith。就是一个典型的低代码工具。它有效的减少了重复代码的编写,提高了开发效率。我以前也用 python 写了一些类似工具,并且让其支持一些简单的逻辑让它变成 DSL。

大家熟悉的 SQL(结构化查询语言)就是 DSL。SQL 就是优秀的低代码工具。
所以我们得出一个结论:二次开发绝对不是低代码!

国内低代码平台的现状

国内低代码平台,基本都包含一个可视化的设计器,通过可视化定义UI,工作流和数据模型。通过拖拉来编程。然而项目本身的复杂性是无法通过拖拉来避免的。有过 Delphi 开发经验的人肯定有其深刻的印象。拖拉编程不能解决业务的复杂性问题,反而会带来开发效率变慢,工作量变大的问题。举个简单的例子:需要分布式事务这种拖拉编程,怎么解决?如果真的要用 UI 来设置的话估计整个工程都会变的非常复杂!需要分布式缓存和数据库一致性的又该怎么解决?而这些还不涉及到非常复杂的业务问题!所以拖拉编程最后的结果只是低能和弱智的表现。还有一种拖拉编程拖拉的是业务组件,这个更扯,如果对于非标的业务,那么这个组件就要适配所有非标的情况,这个组件的学习成本,维护成本该多高啊!如果这种组件在项目中是普遍存在的,那么整个项目的学习成本和维护成本又该是个什么量级的喃?

结论:目前国内号称的低代码平台的现状,其实就是封装的很差的框架。用这个框架来进行二次开发!这种产品非但不能降低开发的难度,提升产能。反而处处掣肘,不仅仅要学习这个框架的用法,还要考虑自己的业务和这个框架的匹配度,如果自己的业务需要实现的功能框架本身支持差怎么办?调试错误难怎么办?所以吃过太多苦的业内人士,一提到低代码,就认为这就是低能弱智的东西,骗老板钱还给自己工作量翻倍的垃圾玩意儿!

什么才是真正的低代码平台

真正的低代码平台,必须符合两个条件:

1、必须有完整的基础设施包括、缓存、NoSql、数据库等

2、必须要有一个自己实现的脚本语言。该语言还要满足如下特征:

  1. 简单学习成本低。即使不会编程的人也可以在一两天内完全掌握。
  2. 完善,能简洁、快速、完美的描述业务场景
  3. 扩展性强,必须能进兼容当前架构和系统

DawnSql对低代码平台的支持

案例:为现有的登录模块添加缓存,让应用程序先读取缓存中的数据,如果缓存中的数据不存在,才读取数据库中的数据!同时,在修改或删除数据的时候,必须同步将缓存中的数据也一起修改或删除

需求的分析:

  1. 在用户登录时,先读取缓存,缓存不存在,在读取数据库。
  2. 要实现一个缓存和数据库双写一致性的程序,换句话说,缓存和数据库是事务性的。

通常情况下的解决方案

缓存和数据库双写一致性方案:

  1. 先更新数据库,在更新缓存
    这种情况有可能会有脏数据。
    例如:
    请求 A 要更新数据库
    请求 B 也要更新数据库
    请求 B 更新缓存
    请求 A 更新缓存
    然而应该网络传输和其它原因,请求 B 在更新缓存的时候,有可能比请求 A 快,那么缓存中的数据就是 A 请求修改的,而正确的应该是 B 修改后的结果!这里数据就出现了不一致的情况!
  2. 先删缓存,再更新数据库
    这种情况也有可能会有脏数据。
    例如:
    请求 A 删除缓存
    请求 B 要读取缓存失败
    请求 B 更读取数据库中的旧值
    请求 B 将旧值写入缓存
    请求 A 将新值更新到数据库
    在这种情况下,缓存中的数据就和数据库中的不一致了!
  3. 先更新数据库,在删除缓存
    这种情况也有可能会有脏数据。
    例如:
    当请求 A 读取数据时,缓存恰好被删除,A 只能读取数据库
    请求 B 更新数据库
    请求 B 更新数据库
    请求 A 将查询的旧值写入缓存
    在这种情况下,缓存中的数据就和数据库中的不一致了!

此外还有缓存更新失败、删除失败、数据库保存失败,都有可能影响到缓存数据和数据库不一致的问题

结论:即使是通过编程来实现上面的业务需求,都是非常复杂的事情!通过拖拉来实现这种业务是绝对不可能的事!

DawnSql 的解决方案

  1. 添加缓存
  2. 在读取的时候先读取缓存,缓存不存在,就读取数据库,并将读取的信息放入缓存
  3. 对数据库中的修改或删除后,就删除缓存。让对数据库的修改、删除和删除缓存在一个事务中,保证数据的一致性。

因为 DawnSql 支持如下特性:

  1. DawnSql 支持分布式缓存,不需要引入其它分布式缓存
  2. DawnSql 支持 sql 和 缓存的混合事务

DawnSql 的实例

1、表的定义
CREATE TABLE IF NOT EXISTS public.my_users (
     -- 用户ID
    UserID INTEGER NOT NULL auto,
    -- 用户名
    UserName VARCHAR(15) NOT NULL,
    -- 密码
    Password VARCHAR,
    PRIMARY KEY (UserID)
) WITH "template=manage";

INSERT INTO public.my_users (UserName, Password) VALUES('张三', 'zhangsan');
INSERT INTO public.my_users (UserName, Password) VALUES('李四', 'lishi');
2、添加缓存
noSqlCreate({"table_name": "public.my_users_cache", "mode": "partitioned"});
3、获取 user id
function get_user(user_name:string, password:string)
{
    let vs = noSqlGet({"table_name": "public.my_users_cache", "key": concat(user_name, password)});
    match {
        notNullOrEmpty?(vs): vs;
        else let rs = query_sql("select g.UserID from public.my_users as g where g.UserName = ? and g.Password = ?", [user_name, password]);
             let result;
             for (r in rs)
             {
                -- 如果存在就保存在缓存中,并且返回
                noSqlInsert({"table_name": "public.my_users_cache", "key": concat(user_name, password), "value": r.first()});
                result = r.first();
             }
             result;
    }
}

-- 查询
get_user('张三', 'zhangsan');
4、通过 User ID 获取 user name 和 password
function get_user_obj(user_id:int)
{
   let rs = query_sql("select g.UserName, g.Password from public.my_users as g where g.UserID = ?", [user_id]);
   rs.next();
}
5、更新 user 的时候,删除缓存
function update_user(user_id:int, password:string)
{
    let user_password = get_user_obj(user_id);
    let my_key = concat(user_password.first(), user_password.nth(1));
    let lst = [['update public.my_users set Password = ? where UserID = ?', [password, user_id]]];
    lst.add(noSqlDeleteTran({"table_name": "public.my_users_cache", "key": my_key}));
    trans(lst);
}
6、删除 user 的时候,删除缓存
function delete_user(user_id:int)
{
    let user_password = get_user_obj(user_id);
    let my_key = concat(user_password.first(), user_password.nth(1));
    let lst = [['delete from public.my_users where UserID = ?', [user_id]]];
    lst.add(noSqlDeleteTran({"table_name": "public.my_users_cache", "key": my_key}));
    trans(lst);
}

结论
DawnSql 本身就是一个低代码平台,它不仅仅有完善的基础设施,还有自己的脚本语言,用户只需要通过脚本语言就可以描述完成整个业务!

DawnSql开源分布式数据库的作者

0 声望
0 粉丝
0 条评论
推荐阅读
H2存储内核分析一
现在做数据库一般都才有 C/C++ 获取其它编译型的语言,为什么会选择 h2 这种基于 java 的语言?会不会影响效率?其实回答这个问题很简单,无论是用什么语言来实现数据库,其实都是在调用操作系统 IO 的函数。因此...

monk0123456阅读 286

编译 PyTorch 模型
本篇文章译自英文文档 Compile PyTorch Models。作者是 Alex Wong。更多 TVM 中文文档可访问 →TVM 中文站。本文介绍了如何用 Relay 部署 PyTorch 模型。首先应安装 PyTorch。此外,还应安装 TorchVision,并将其...

超神经HyperAI1阅读 92.9k

编译 MXNet 模型
本篇文章译自英文文档 Compile MXNet Models。作者是 Joshua Z. Zhang,Kazutaka Morita。更多 TVM 中文文档可访问 →TVM 中文站。本文将介绍如何用 Relay 部署 MXNet 模型。首先安装 mxnet 模块,可通过 pip 快速...

超神经HyperAI1阅读 42k

横向对比 11 种算法,多伦多大学推出机器学习模型,加速长效注射剂新药研发
内容一览:长效注射剂是解决慢性病的有效药物之一,不过,该药物制剂的研发耗时、费力,颇具挑战。对此,多伦多大学研究人员开发了一个基于机器学习的模型,该模型能预测长效注射剂药物释放速率,从而提速药物整...

超神经HyperAI1阅读 31k

封面图
科罗拉多州立大学发布CSU-MLP模型,用随机森林预测中期恶劣天气
内容一览:近期,来自美国科罗拉多州立大学与 SPC 的相关学者联合发布了一个基于随机森林的机器学习模型 CSU-MLP,该模型能够对中期 (4-8天) 范围内恶劣天气进行准确预报。目前该成果刊已发表在《Weather and For...

超神经HyperAI阅读 48.9k

封面图
利用 UMA 使硬件加速器可直接用于 TVM
本篇文章译自英文文档 Making your Hardware Accelerator TVM-ready with UMA作者是 Michael J. Klaiber,Christoph Gerum,Paul Palomero Bernardo。更多 TVM 中文文档可访问 →TVM 中文站本节介绍通用模块化加速器...

超神经HyperAI阅读 94.1k

借助计算机建模及 eBird 数据集,马萨诸塞大学成功预测鸟类迁徙
本文首发自 HyperAI超神经微信公众号~内容一览:近日,英国生态学会期刊《Methods in Ecology and Evolution》上发布了一个新的预测模型 BirdFlow,其能够解决生物学目前最困难的挑战之一:准确预测候鸟的运动轨...

超神经HyperAI阅读 89.6k

封面图

DawnSql开源分布式数据库的作者

0 声望
0 粉丝
宣传栏