上一篇我们讨论了akka-cluster的分片(sharding)技术。在提供的例子中感觉到akka这样的分布式系统工具特别适合支持大量的带有内置状态的,相对独立完整的程序在集群节点上分布运算。这里重点要关注这些程序的内部状态,它们会占用系统资源包括内存。把状态保存在内存里相对存放在数据库里能显著提高程序运算效率。在系统出现各种情况下对这些非持久化的程序状态的管理自然就成为了需要考虑的问题,此其一。在一个多用户、高并发的大型分布式系统里往往数据库数据使用会产生大量的冲突影响系统性能。如果能够把数据库的写入和读取分成互不关联的操作就可以避免很多资源占用的冲突。

CQRS(Command Query Responsibility Segregation 读写责任分离)就是解决读写分离问题的一个很好的框架。CQRS实际上应该是一种大量数据并发录入的解决方案。通过读写分离降低数据录入过程对系统响应的影响。

akka-CQRS大约是由event-sourcing、persistenceActor、persistenceQuery三个部分组成。event-sourcing+persistenceActor是一种数据库存写模式。传统数据库的数据更新一般直接更改数据表里的数据值。而event-sourcing模式是把所有更该数据的事件(events)或者说是动作都存放在一个log(journal)表里。如果把这个journal表里的所有记录都重新演算一下,任何时间都可以得出数据库表里当前的状态值。当然,这个journal表可能会存放大量的数据,但在大数据时代的分布式系统里这也算不了什么。由于journal表的写入永远是从后附加的,是一种不可变模式(immutable),所以效率很高,可以支持大数据表的写入。再就是journal表里记录的事件是严格按发生时间顺序的,所以在重新运算更新状态时发生冲突机会甚微,而且一旦真的发生异常还可以再重新演算journal里的记录恢复正确的状态。

persistenceQuery则是一套与事件存写完全分离代表CQRS Q的读取部分,主要工作是定时按批量从journal里读取记录再把event还原成为数据库更新语句然后对系统业务数据库进行更新。而业务应用软件的数据操作,如业务查询、处理、分析等都是针对业务数据库的。

最近在考虑搞一套主要以移动设备为业务工具的信息系统框架。由于移动OS相对功能较弱,加上编程困难等,最好只负责应用的前端录入和表达部分。所有业务逻辑就只能放在后端了。打比方说如果开发一套基于android的POS收银系统,所有收银操作指令都在后端执行,然后向前端返回结果。这样的POS前端只负责采集指令输入然后显示后端处理结果。根据上篇对akka-cluster-sharding应用场景分析,我们可以用一个分片shard来负责一台POS机后端。考虑到akka-cluster集群分布式运算可扩展能力特性,处理万级POS同时在线应该不成问题。当然,每个POS开单销售的过程都存放在内存作为每单销售的状态。这种资源分享的模式恰恰是akka-cluster-sharding的强项。剩下海量并发的数据库操作,就可以通过akka-CQRS框架来应对了。

另外,由于移动前端和后台系统都是企业内部应用系统,可以用gRPC模式替代传统主流的HTTP/1.0协议作为系统主要集成方式。gRPC方式是基于HTTP/2.0协议上的,可以实现点对点的持续连接,支持双向数据流操作,有效解决了request/response模式带来的效率问题。我们在前面的博客里已经构建了基于gRPC,多分布式数据库的数据流编程框架,可以直接采用。google的移动应用编程语言dart2也是支持gRPC的,从整体系统实现的可行性方面应该不会有什么问题了。

在下面跟着的几篇博客里我们会分别讨论event-sourcing,persistenceActor,persistenceQuery和gRPC。

Akka-CQRS(0)- 基于akka-cluster的读写分离框架,构建gRPC移动应用后端架构的更多相关文章

  1. EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录

    前言 本文主要是讲解EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录 注意拦截器只有EF Core3.0+ 支持,2.1请考虑上下文工厂的形式实现. 说点题外话.. 一晃又大半年没更新技 ...

  2. 基于MGR+Atlas的读写分离尝试,以及MGR+Keepalived+Atlas自动故障转移+读写分离设想

    目的是尝试altas的读写分离,现有一套搭建好做测试的MGR(单主),于是就腿搓绳,在MGR基础上搭建altas. 复制环境准备 读写分离理论上讲,跟复制模式没有关系,atlas负责的是重定向读写,至 ...

  3. 基于Mysql-Proxy 实现MariaDB 读写分离

    一.Mysql-Proxy 简单介绍 MySQL-Proxy是一个处于你的client端和MySQL server端之间的简单程序,它可以监测.分析或改变它们的通信.它使用灵活,没有限制,常见的用途包 ...

  4. 基于Atlas实现mysql读写分离

    一.实验环境 主机名IP地址 master192.168.200.111 slave192.168.200.112 atlas192.168.200.113 主从复制不再赘述,链接地址:授权Atlas ...

  5. 基于Spring4+SpringMVC4+Mybatis3+Hibernate4+Junit4框架构建高性能企业级的部标GPS监控平台

    开发企业级的部标GPS监控平台,投入的开发力量很大,开发周期也很长,选择主流的开发语言以及成熟的开源技术框架来构建基础平台,是最恰当不过的事情,在设计之初就避免掉了技术选型的风险,避免以后在开发过程中 ...

  6. 基于Spring4+SpringMVC4+Mybatis3+Hibernate4+Junit4框架构建高性能企业级的部标1077视频监控平台

    开发企业级的部标GPS监控平台,投入的开发力量很大,开发周期也很长,选择主流的开发语言以及成熟的开源技术框架来构建基础平台,是最恰当不过的事情,在设计之初就避免掉了技术选型的风险,避免以后在开发过程中 ...

  7. MySQL基于 amoeba.xml的读写分离

    1.准备两台服务器  centos7 192.168.52.35 192.168.52.36 2.关闭防火墙 [root@localhost ~]# systemctl stop firewalld ...

  8. 基于MYCAT中间件实现MYSQL读写分离

    基于mycat实现mysql读写分离 完成主从复制的配置 /* 主节点:192.168.47.101 从节点:192.168.47.102 */ /*mycat为同一网段客户端*/ /* 修改主节点基 ...

  9. Mysql 基于 Amoeba 的 读写分离

    首先说明一下amoeba 跟 MySQL proxy在读写分离的使用上面的区别: 在MySQL proxy 6.0版本 上面如果想要读写分离并且 读集群.写集群 机器比较多情况下,用mysql pro ...

随机推荐

  1. JavaSE基础知识(5)—面向对象(5.7 final关键字)

    一.说明 final属于一种修饰符,可以用于修饰类和属性.方法.局部变量 二.特点 1.修饰类 该类不能被继承,如String.Integer等 2.修饰方法 该方法不能被重写 3.修饰变量(属性和局 ...

  2. leetcode5:最长回文子串

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...

  3. Python语言学习之Python入门到进阶

    人们常说Python语言简单,编写简单程序时好像也确实如此.但实际上Python绝不简单,它也是一种很复杂的语言,其功能特征非常丰富,能支持多种编程风格,在几乎所有方面都能深度定制.要想用好Pytho ...

  4. EasyPR源码剖析(7):车牌判断之SVM

    前面的文章中我们主要介绍了车牌定位的相关技术,但是定位出来的相关区域可能并非是真实的车牌区域,EasyPR通过SVM支持向量机,一种机器学习算法来判定截取的图块是否是真的“车牌”,本节主要对相关的技术 ...

  5. java分布式电子商务云平台b2b b2c o2o需要准备哪些技术??

    技术解决方案 开发语言: java.j2ee 数据库:mysql JDK支持版本: JDK1.6.JDK1.7.JDK1.8版本 核心技术:分布式.云服务.微服务.服务编排等. 核心架构: 使用Spr ...

  6. 一年web网站测试总结

    1. 页面链接检查 每一个链接是否都有对应的页面,并且页面之间切换正确.可以使用一些工具,如LinkBotPro.File-AIDCS.HTML Link Validater.Xenu等工具.Link ...

  7. Unity - Photon PUN 本地与网络同步的逻辑分离 (一)

    服务器大家可以使用Photon官网提供的,这样会变得很简单,直接搭建下就好.或者下载到本地开启本地端Photon服务器 (大家也可以使用和我一样方式有时间做了个winform 程序用来管理本地服务器开 ...

  8. C++标准库第二版笔记 2.1

    C++标准库第二版笔记 2.1 1 Range-Based for 循环 for ( decl : coll ) { statements; } // collaborate 类似C# foreach ...

  9. INTERVAL YEAR TO MONTH数据类型

    INTERVAL YEAR TO MONTH数据类型 Oracle语法: INTERVAL 'integer [- integer]' {YEAR | MONTH} [(precision)][TO ...

  10. java中接口和继承的区别

    实际概念区别:区别1:不同的修饰符修饰(interface),(extends)区别2:在面向对象编程中可以有多继承!但是只支持接口的多继承,不支持'继承'的多继承哦而继承在java中具有单根性,子类 ...