背景
前几个月,使用Vertx重构了公司的一个子系统,该系统负责公司核心数据subscriber的采集、处理、存储和搜索。这里介绍下重构该系统时的一些关键点。
架构
重构前系统部署图:
重构前系统主要有2部分组成,这2部分都会对Subscriber数据操作:
Java APP: 是个定时任务触发的APP,每2小时跑一次,每次启动后做以下的事情:
- 从MongoDB里加载已有的数据到内存。
- 读取准备好的Data文件,处理文件中的数据,和已加载的数据做合并,这个处理的过程会导致Subscriber数据有添加、删除和更新操作。
- 处理完Data文件后,将数据持久化到MongoDB和Elasticsearch。
JBoss服务:
- 从Kafka中来的消息数据,批量处理Kafka消息,会添加和更新Subscriber数据到MongoDB和Elasticsearch中。
- 从其他系统触发的API调用,接收一些API请求,这些请求也会增加、删除和更新Subscriber数据。在更新的时候,因为查询条件的多样性,为了提高查询Subscriber的速度,对MongoDB的Subscriber Collection建了各种索引。
重构原因
- 对同一种的数据的操作在2个不同的服务中,一种是war一种是jar,不利于维护。代码在不同的Rep和Project下,维护也不方便。
- Jboss现在是单实例部署,Jboss中还部署有其他的服务,Jboss的稳定性直接影响了该服务。为了提高查询速度,对数据建立了多种不同的索引,更新数据增加了数据库的负担。
- 定时任务JavaAPP每次在处理某个客户的Subscriber数据时候,都要从MongoDB加载数据到内存,耗时没有效率。因为是定时任务,对数据更新不够及时,会影响其他依赖Subscriber数据的服务。
- 数据更新冲突:在定时任务把数据加载到内存,正在处理时,此时如果Jboss也在更新数据会导致数据更新冲突(现在采用了一个很tricky的方式解决)。
重构后系统部署图
重构后,系统组件介绍和说明:
Adapter服务:
- 数据适配服务,统一接收来自文件、Kafka和API调用的数据,对数据进行预处理,发送相应的业务消息到Event Bus。
- 因为对Adapter的触发方式只有2种,一种是REST API,另一种是连接Kafka读取消息,所以Adapter服务可以通过部署多个实例来增加可用性,也顺便提高了整体性能。
Mapper服务:
- 数据处理服务,按数据分片进行部署,分片规则可以按客户大小来分,比如把10个大客户的数据部署在一个实例上,200个小客户的数据部署在另一个实例上,也可以按数据量平均分。
- 初始启动时候加载所属该实例的所有Subscriber数据到内存,从EventBus上接收来自Adapter的业务请求,处理请求并对数据进行更新。
- 数据更新策略:
- 来自API的请求都会实时的更新到MongoDB和Elasticsearch中。
- 来自文件和Kafka的数据更新量比较大,为了避免每次对数据更新的时候都去操作DB和ES,通过一个队列缓存所有的更新。触发队列持久化条件:一种是当缓存Size达到阈值时候触发,另一种是定时触发,触发后批量更新数据到MongoDB和Elasticsearch中。
- 内存、MongoDB和Elasticsearch中数据一致性:因为现在数据在内存中,使用了Vertx的MongoClient的异步回调机制,保证只有更新到MongoDB成功后才去更新Elasticsearch,保证MongoDB里数据的准确性是第一位的。而ElasticSearch中数据的准确性是通过“定时补偿机制”去保证:有其他定时执行的脚本去定时检查,并决定是否重新对某个客户的数据重建索引。
重构之后的可改进项:
- 耗内存,所有的Subscriber数据都分片加载到了JVM里。这部分可以把数据放到其他的存储中,比如redis,但就算是放到redis,也是耗内存。
- 如果系统出错,会导致数据在MongoDB和ElasticSearch之间不一致,需要其他方式去做“数据一致性补偿”。如果资源允许,可以把数据更新同步单独拿出来实现,使用类似处理“分布式系统数据一致性”的方式来改善这一点。
小结
一些技术关键点
1 异步非阻塞
Vertx的异步非阻塞机制有很好的并发性能。网络IO依赖了Netty,Java NIO的特性。
2 Vert.x-Web
Vertx-web可以很方便的去实现一个web app,很容易实现一些REST APIs。
3 Data access client
Vertx提供了访问各种存储的Client,这些client的API都是异步的,可以很方便的去访问MongoDB,JDBC,Redis等。
4 Event Bus
Vertx的一个核心功能,重构这个子系统时也很依赖这个功能。Event Bus可用于不同Verticle之间的通信,也可以用于Vertx cluster之间的通信。
5 功能解耦
系统中各个子功能可以按不同的Verticle去实现,不同的Verticle可以通过EventBus去通信解耦。Vertx支持动态的加载和卸载Verticle,也就可以实现在运行时动态的加载卸载某些功能。
6 集群模式
Adapter服务和Mapper服务是通过Vertx的Cluster模式组成了集群,集群中节点发现和通信通过Hazelcast管理。使用Vertx实现的服务,可以单实例部署,也可以组成集群提供服务。
参考
- https://vertx.io/docs/vertx-core/java/
- https://vertx.io/docs/vertx-web/java/
- A gentle guide to asynchronous programming with Eclipse Vert.x for Java developers
使用Vertx重构系统小结的更多相关文章
-
Diskpart命令安装系统小结
<diskpart命令安装系统小结> 今天给同学安装系统,win8改win7.同学是预装了win8的联想y480,分区表采用的是GPT格式,捣鼓了半天才知道.GPT格式是新式的分区格式,相 ...
-
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(28)-系统小结
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(28)-系统小结 我们从第一节搭建框架开始直到二十七节,权限管理已经告一段落,相信很多有跟上来的园友,已经 ...
-
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(14)-系统小结
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(14)-系统小结 不知不觉已经过了13讲,(本来还要讲多一讲是,数据验证之自定义验证,基于园友还是对权限这 ...
-
一次业务网关用ASP.NET Core 2.1重构的小结
目录 前言 统一鉴权 服务限流 路由转发 参数重组 链路跟踪 熔断降级 服务计次 业务指标监控 日志记录 迭代更新 总结 前言 对于API网关,业界貌似对它进行下划分,有下面几个分类/场景. 面向We ...
-
ASP.NET MVC5+EF6+EasyUI 后台管理系统(28)-系统小结
系列目录 我们从第一节搭建框架开始直到二十七节,权限管理已经告一段落,相信很多有跟上来的园友,已经搭配完成了,并能从模块创建授权分配和开发功能了 我没有发布所有源代码,但在14节发布了最后的一次源代码 ...
-
安装win7 64位和win10 64位双系统小结
1.gpt比mbr更先进.与主启动记录 (MBR) 分区方法相比,GPT 具有更多的优点,因为它允许每个磁盘有多达 128 个分区(mbr只支持4个分区),支持高达 18 千兆兆字节的卷大小,允许将主 ...
-
远程控制Ubuntu系统小结
一.在远程控制的Ubuntu上,按shift键总会出现中文字符 因为在Ubuntu中,默认启动搜狗输入法,导致在按shift键时,不停出现中文字符 一开始以为是因为远程控制,在主控机和被控机的输入法之 ...
-
从零开始,搭建博客系统MVC5+EF6搭建框架(5),博客详情页、留言、轮播图管理、右侧统计博文
一.博客系统进度回顾 上一遍博客介绍到,系统已经实现到了发布以及前台布局展示,接下来就是实现一些,详情页,留言.轮播图管理.右侧博文统计信息实现. 二.博客系统详情页实现 2.1先来看看详情页展示的效 ...
-
新闻公布系统 (Asp.net 三层架构 )
2012年度课程设计---新闻公布系统(小结) ...
随机推荐
-
servlet使用入门
创建web工程servlet,然后新建TestServlet.java package com.xmyself.servlet; import java.io.IOException; import ...
-
A、B、C、D和E类IP地址
IP地址分为A,B,C,D,E五类. 网络号:用于识别主机所在的网络:主机号:用于识别该网络中的主机. 其中A类分配给*机关使用,B类地址给大中型企业使用,C类地址给个人使用.这三种是主要的. IP ...
-
Silverlight C1.Silverlight.FlexGrid 表格动态列
很多时候,我们对于表格展示的数据,需要根据条件不停的变化,这就需要表格列能动态生成,即没有Model的概念(万物始于无形).先上主要代码: 一.根据参数绑定列定义 二.根据数据动态创建数据对象,并添加 ...
-
MongoDB数据库的主从配对与迁移示例
数据中心在运行中有可能遇到各种硬件.电力.网络故障等问题,需要设计良好的系统来隔离,尽量减少对上层应用的影响,持续对外提供服务:一旦发生业务中断,也应尽快恢复.通过主从备份设计,在主应用系统发生故障时 ...
-
Javaweb程序服务器部署
话说从接触web后就想着写一个自己的站点然后别人都可以访问,这也是一个小目标吧,从之前在使用校园网的时候把自己的电脑当成服务器然后部署使用同学的电脑访问,现在想让所有人都可以访问,于是就花重金租了腾讯 ...
-
原生 table css实现操作按钮固定右侧及底部滚动 IE不会卡死
需求的表格比较复杂(各种合并新增删除),elementUi的table组件无法满足需求,故而写了原生table,且与其他用了table组件的表格保持一致. 贴一下简单的代码,只实现操作按钮固定右侧以及 ...
-
cucumber测试项目报错
[INFO] Scanning for projects... [WARNING] [WARNING] Some problems were encountered while building th ...
-
Imcash科普:没有网络也可以转账比特币?你可能有些误解
近日,据Bitcoinist消息,比特币解决方案开发商CoinKite联合创始人Rodolfo Novak和OpenBazaar联合创始人Sam Patterson在推特上宣布,两人不借助互联网和卫星 ...
-
Oracle总结二
1 where子句 Where子句的作用:用where子句来指定查询条件 1.1 用法示例 select * from emp where deptno=10; select * from emp w ...
-
《Linux-基础篇笔记》 Vim编辑器(二)
Linux图形化界面下的文本编辑器 gedit . libre office . evince PDF阅读器 ①gedit是一个GNOME桌面环境下兼容UTF-8的文本编辑器.它使用GTK+编写而成, ...