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 ...
随机推荐
- php 通过扫描二维码关注公众号
class Wxfollow { protected $appid = 'wxf1d959b99f33b156'; protected $secret = '248f3a5606045 ...
- VS code 代码格式整理的配置
{ "workbench.iconTheme": "material-icon-theme", "vetur.validation.template& ...
- Flask-Session 简单使用
一 知识点 1. 安装 flask 1.0.2 使用Flask-Session,其实必须需要配置的只有这几个地方: 注意!!!!!!: 1. 需要配置的地方1 # flask_session 中的S ...
- stm32-arduino-f103
希望给工作中偶尔要用的一些辅助板卡(例如运行信息现场记录)找一个快速开发的手段,Arduino作为流行的开源嵌入硬件框架,组件丰富,资料众多,所以想以Arduino作为平台.但是Arduino板子基本 ...
- openstack系列文章(2)dashboard
玩转dashboard之前,考虑一些事情:(1)安全问题:网络访问策略(2)镜像的密码管理:windows或者linux,root或者administrator密码怎么管理(3)怎样创建自己的镜像:w ...
- 初学html,任务1:一个简单html页面,要求:内容页面装一篇文章 用html来分段
这是主要内容部分,用html实现版块分布. 接下来是样式部分. 让页面所有元素的padding和margin都设置为0 : 否则加入一张大的覆盖的背景图片后,会由于浏览器的缘故,图片周边有白边: 设置 ...
- ORB-SLAM2的安装和运行流程
一.ORB-SLAM2安装 1.在https://github.com/raulmur/ORB_SLAM2上git clone到当前文件夹内,若想下载到指定文件夹内,就需要cd进入指定文件内,然后再g ...
- homework1-201521410029
姓名:孙浩学号: 201521410029指导教师:高见 实验日期:2018年8月9日 1. 虚拟机安装与调试 安装好xp和kali虚拟机之后,查看这三者(包括主机)的i ...
- s6-9 TCP 定时器
TCP 定时器管理 重传定时器(retransmission timer,Positive ackn. with retransmit) 最重要的定时器 TCP 定时器管理 持续定时器(per ...
- mysql的like子句
直接上例子 查询字段以 php 开头的信息. SELECT * FROM position WHERE name LIKE 'php%'; 查询字段包含 php 的信息. SELECT * FROM ...