Akka-CQRS(0)- 基于akka-cluster的读写分离框架,构建gRPC移动应用后端架构
上一篇我们讨论了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移动应用后端架构的更多相关文章
- EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录
前言 本文主要是讲解EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录 注意拦截器只有EF Core3.0+ 支持,2.1请考虑上下文工厂的形式实现. 说点题外话.. 一晃又大半年没更新技 ...
- 基于MGR+Atlas的读写分离尝试,以及MGR+Keepalived+Atlas自动故障转移+读写分离设想
目的是尝试altas的读写分离,现有一套搭建好做测试的MGR(单主),于是就腿搓绳,在MGR基础上搭建altas. 复制环境准备 读写分离理论上讲,跟复制模式没有关系,atlas负责的是重定向读写,至 ...
- 基于Mysql-Proxy 实现MariaDB 读写分离
一.Mysql-Proxy 简单介绍 MySQL-Proxy是一个处于你的client端和MySQL server端之间的简单程序,它可以监测.分析或改变它们的通信.它使用灵活,没有限制,常见的用途包 ...
- 基于Atlas实现mysql读写分离
一.实验环境 主机名IP地址 master192.168.200.111 slave192.168.200.112 atlas192.168.200.113 主从复制不再赘述,链接地址:授权Atlas ...
- 基于Spring4+SpringMVC4+Mybatis3+Hibernate4+Junit4框架构建高性能企业级的部标GPS监控平台
开发企业级的部标GPS监控平台,投入的开发力量很大,开发周期也很长,选择主流的开发语言以及成熟的开源技术框架来构建基础平台,是最恰当不过的事情,在设计之初就避免掉了技术选型的风险,避免以后在开发过程中 ...
- 基于Spring4+SpringMVC4+Mybatis3+Hibernate4+Junit4框架构建高性能企业级的部标1077视频监控平台
开发企业级的部标GPS监控平台,投入的开发力量很大,开发周期也很长,选择主流的开发语言以及成熟的开源技术框架来构建基础平台,是最恰当不过的事情,在设计之初就避免掉了技术选型的风险,避免以后在开发过程中 ...
- MySQL基于 amoeba.xml的读写分离
1.准备两台服务器 centos7 192.168.52.35 192.168.52.36 2.关闭防火墙 [root@localhost ~]# systemctl stop firewalld ...
- 基于MYCAT中间件实现MYSQL读写分离
基于mycat实现mysql读写分离 完成主从复制的配置 /* 主节点:192.168.47.101 从节点:192.168.47.102 */ /*mycat为同一网段客户端*/ /* 修改主节点基 ...
- Mysql 基于 Amoeba 的 读写分离
首先说明一下amoeba 跟 MySQL proxy在读写分离的使用上面的区别: 在MySQL proxy 6.0版本 上面如果想要读写分离并且 读集群.写集群 机器比较多情况下,用mysql pro ...
随机推荐
- 2018年 js 简易控制滚动条滚动的简单方法
首先是es2015 的新api Element.scrollIntoView() // 滚动到最上方 等同于 dom.scrollIntoView(true) Element.scrollIntoVi ...
- optional的使用
:first-child { margin-top: 0px; } .markdown-preview:not([data-use-github-style]) h1, .markdown-previ ...
- ECMA262学习笔记(二)
Property特性:特性用于定义和解释命名属性的状态. ECMAScript建立执行环境: 解释执行全局代码或使用eval函数输入的代码会创建并进入一个新的执行环境.每次调用ECMA脚本代码定义的函 ...
- java反射调用dubbo接口
需求:项目增加幂等 场景:1.三个项目:a .b.c2.a项目加幂等3.b项目dubbo调用项目a的时候超时没有获取返回结果,增加重试机制(非立即重试,3min or 5min 后重试)4.c项目是一 ...
- Linux平台生成awr报告
1.使用oracle用户登录应用服务器所使用的数据库所在的服务器 # su –oracle 2.输入env命令,查询出ORACLE_HOME 目录 3.然后进入$ORACLE_HOME/rdbms/a ...
- Vmware Workstation - linux系统下 VmTools 安装
程序版本 : VMware® Workstation 14 Pro 系统环境 : win10 64位下 ubuntu-14.04.5-desktop-amd64 问题:在运行linux系统过程中,de ...
- HttpServerUtility常用方法
//HttpServerUtility是一个工具类,为了在后台处理请求方便获取到一些常用的类型,Asp.net将很多常用的东西封装到这里. // 获取服务器的计算机名称. public string ...
- ubuntu18.04修改ssh登录欢迎信息
1.编辑文件 ll /etc/update-motd.d/* 2.修改文件 3.查询效果 run-parts /etc/update-motd.d
- Qt打包发布exe
1.首先以 release 方式编译源代码,然后将生成的a. exe 程序放到一个单独的文件夹中. 2.再从开始菜单打开 Qt 命令行工具. 3.在命令行中,进入到第一步中a. exe 程序所在的文件 ...
- 线程中的setDaemon方法
setDaemon方法必须在start方法前定义.t1.setDaemon(True),该语句的意思是:将主线程A设置为子线程t1的守护线程.也就是在执行程序时,t1会随着主线程A的退出而退出,不论t ...