计算密集型分布式内存存储和运算平台架构

1. 相关概念

1.1 内存数据库

关系型数据库处理永久、稳定的数据,内存数据库就是将其数据放在内存中,活动事务只与内存数据打交道,重新设计了体系结构并且在数据缓存、快速算法、并行操作方面也进行了相应的改进,所以数据处理速度比磁盘数据库要快很多,一般都在10倍以上。但它不容易恢复,可能暂时不一致或非绝对正确的,要求较大的内存量,而64位操作系统可以支持更大的地址(2T),为内存数据库的实现提供了可能。

1.2 计算密集型

计算密集型是指,每个请求的命令中,大都包含不同的参数值,很难重用前一次计算的结果,所以要按照约定的业务逻辑重新计算,并按照约定的格式返回数据,且计算在总耗时中占比较大。

2. 数据存储

2.1 DB

数据存储在DB中,直接访问数据库。但数据库压力太大,系统瓶颈明显。

 

2.2 DB + All In One Cache

将DB中的数据加载到节点的内存中,并定时从数据更新日志库中读取来更新内存的数据,极大减轻数据库的压力。

但随着数据的膨胀,节点启动加载慢,升级时间长,宕机恢复难等。

2.3 DB + File + All In One Cache

每天晚上从DB读取数据,生成带有数据同步标识的数据文件,分发到各个服务器节点。节点启动时,直接从本地数据文件加载,大大提高了启动速度。

但随着DB中数据的更新,实例间数据不一致性严重。

2.4 DB + File + All In One Cache + AMQ Sync

通过DP服务定时监控数据更新日志库中的记录,通过AMQ发布给订阅的每个节点,节点根据当前同步的标识决定是否处理消息记录,根据消息记录的属性执行具体的增删改操作,使得数据的一致性较好。

但单个节点内存过大,大数据量时仍会变慢,卡顿现象频繁且耗时较长。

2.5 DB + File + Distributed Cache + AMQ Sync

按照业务将数据拆分到不同的节点上,通过管理节点分配任务,使得内存大小可控,卡顿频率和耗时明显减少。

但生产bug、业务逻辑变更或新增需求时,只能重启服务,不够灵敏,可维护性差。

 2.6 DB + File + Distributed Cache + AMQ Sync +CodeDom

利用CodeDom实现动态编译,在运行时增加或修改业务逻辑。

另外,可以为每个节点对应一个独立的DataProcess。

3. 数据运算

3.1 存储过程

将业务逻辑写到存储过程中,难以维护,请求排队现象严重。

3.2 内存运算

通过缓存节点的中间层对外提供服务,在缓存数据的基础上,提供:获取单个运算结果的API(对外),获取数据集合的Enumerator(对内),获取数据运算结果集合的Report(对外),内存读取速度较快。

但很难有效的负载均衡,无法高效并行。

3.3 负载均衡+并行

通过Master节点,将请求分给对应的若干工作节点并行处理,再对结果进行合并和归纳,返回给客户端,实现高效并行处理。

延伸:数据运算的耗时,大都在查找、比较、排序、序列化、压缩、加密处理等,根据性能分析逐个调优。

4. 系统调优

4.1 GC

当内存越大时,二代回收耗费几秒甚至十几秒,会挂起所有线程而使节点在这段时间内不能正常工作。

1.可设置多核并发的Server GC模式,为每个核创建单独的大小堆和GC线程,减少回收的粒度和影响。

2.监控将要发生回收的工作节点,通知Mater并暂停该工作节点提供服务,直至GC完成。

4.2 Cache

1.运行时内存的增加,主要是因为创建了很多临时对象。所以,要尽量少用Linq,尽量避免创建不必要的对象。
2.频繁使用的字符串可尝试采用驻留机制。
3.将不常用的历史数据以文件方式存储和更新而不放入内存。
4.业务拆分减少每个节点要加载的数据。
5.尽量避免创建大对象,必要时通过弱引用+延迟加载处理大对象。

原文地址:http://www.cnblogs.com/LoveOfPrince/p/6336472.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中将Fri Feb 19 17:32:34 CST 2021时间格式转为yyyy-MM-dd HH:mm:ss时间格式

java中将Fri Feb 19 17:32:34 CST 2021时间格式转为yyyy-MM-dd HH:mm:ss时间格式 哈斗 2021-02-20 10:03:36 2034 收藏 6 分类专栏: java 文章标签: java 时间格式转换 版权 由于在项目中遇到此时间格式需要转换的问题,所以在此记录下转换…

java实现人脸识别源码【含测试效果图】——ServiceImpl层(UserServiceImpl)

/** * Title: BaseServiceImpl.java * Package org.service.impl * Description: TODO该方法的主要作用: * author A18ccms A18ccms_gmail_com * date 2017-9-22 下午8:50:26 * version V1.0 */ package org.service.impl;import org.dao.IUserDao; import or…

如何解决线程安全问题

如何解决线程安全问题 怎么解决线程的安全问题呢? 基本上所有解决线程安全问题的方式都是采用“序列化临界资源访问”的方式,即在同一时刻只有一个线程操作临界资源,操作完了才能让其他线程进行操作,也称作同步互斥访问。 在Ja…

【深入Java虚拟机】之四:类加载机制

转载自 【深入Java虚拟机】之四:类加载机制 类加载过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。它们开始的顺序如下图所示: 其中…

给职场新人的建议

给职场新人的建议 这里给职场新人的10点建议 1.不要有为老板工作的心态 这个和为了老师或者为了父母学习一样搞笑,你是为了自己工作,学到的本事,得到的经验,你离开公司你就带走了,老板留不下你的肉体,也…

违反ClassLoader双亲委派机制三部曲第二部——Tomcat类加载机制

转载自 违反ClassLoader双亲委派机制三部曲第二部——Tomcat类加载机制 前言: 本文是基于 ClassLoader双亲委派机制源码分析 了解过正统JDK类加载机制及其实现原理的基础上,进而分析这种思想如何应用到Tomcat这个web容器中,从源码的角度对 违…

Lock

lock接口 Lock lock ...; lock.lock(); try{//处理任务 }catch(Exception ex){ }finally{lock.unlock(); //释放锁 }经常这样使用 Lock lock ...; if(lock.tryLock()) {try{//处理任务}catch(Exception ex){}finally{lock.unlock(); //释放锁} }else {//如果不能获取锁…

红包的技术升级之旅

鸡年春节,红包再次成为年味儿最重要的催化剂。先是腾讯QQ钱包推出“LBSAR天降红包”等三种创新有趣的玩法,支付宝上线AR实景红包,微博亦推出视频红包等形式。虽然微信退出红包营销让人稍有意外,但用户对红包的热情仍未消减。 事实…

java中生成1000~10000之间的随机数

要生成在[min,max]之间的随机整数,可使用Random类进行相关运算: Random random new Random(); int s random.nextInt(max)%(max-min1) min; random.nextInt(max)表示生成[0,max]之间的随机数,然后对(max-min1)取模。 以生成[1000,10000]…

破坏双亲委派模型

转载自 破坏双亲委派模型 1.第一次破坏 由于双亲委派模型是在JDK1.2之后才被引入的,而类加载器和抽象类java.lang.ClassLoader则在JDK1.0时代就已经存在,面对已经存在的用户自定义类加载器的实现代码,Java设计者引入双亲委派模型时不得不做出…

volatile可以保证原子性吗

在之前我们了解到了线程的三大特性:原子性,可见性,有序性。 前面的例子我们知道了volatile可以保证共享变量的可见性,但是volatile可以保证原子性吗? 我们来看看: public class Test {public volatile i…

C# 7.0新功能

下面是对C#7.0 版本所有语言功能的描述。随着 Visual Studio “15” preview 4 的发布,大部分功能可以被更灵活的应用。现在正是时候将这些功能介绍给大家,你也可以借此让我们知道你的想法。 C#7.0 增加了很多新的功能,更专注于数据的消费&am…

MybatisPlus学习(四)条件构造器Wrapper方法详解

https://www.cnblogs.com/xianz666/p/13857733.html MybatisPlus学习(四)条件构造器Wrapper方法详解 文章目录 1、条件构造器2、QueryWrapper 2.1、eq、ne2.2、gt、ge、lt、le2.3、between、notBetween2.4、like、notLike、likeLeft、likeRight2.4、isN…

使用ueditor实现多图片上传案例

UEditor是由百度WEB前端研发部开发的所见即所得的开源富文本编辑器,具有轻量、可定制、用户体验优秀等特点。开源基于BSD协议,所有源代码在协议允许范围内可自由修改和使用。百度UEditor的推出,可以帮助不少网站开发者在开发富文本编辑器所遇…

自定义ClassLoader和双亲委派机制

转载自 自定义ClassLoader和双亲委派机制 ClassLoader ClassLoad:类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码&#xff0…

ASP.NET Core 1.0 开发记录

ASP.NET Core 1.0 更新比较快(可能后面更新就不大了),阅读注意时间节点,这篇博文主要记录用 ASP.NET Core 1.0 开发简单应用项目的一些记录,以备查阅。 ASP.NET Core 1.0 相关 Nuget 程序包源:https://api.…

volatile 关键字

volatile是干啥用的,有什么含义和特点呢? 当一个共享变量被volatile修饰时,它就具备了“可见性”,即这个变量被一个线程修改时,这个改变会立即被其他线程知道。当一个共享变量被volatile修饰时,会禁止“指…

使用ueditor实现多图片上传案例——实体类(Shopping.java)

/** * Title: Shopping.java * Package org.entity * Description: TODO该方法的主要作用: * author A18ccms A18ccms_gmail_com * date 2017-9-30 下午9:37:33 * version V1.0 */ package org.entity;/** * * 项目名称:test_fuwenben * 类…

深入浅出ClassLoader

转载自 深入浅出ClassLoader 你真的了解ClassLoader吗? 这篇文章翻译自zeroturnaround.com的 Do You Really Get Classloaders? ,融入和补充了笔者的一些实践、经验和样例。本文的例子比原文更加具有实际意义,文字内容也更充沛一些&#xf…

三种获取Class类型的实例的方法

通过Object类中的getClass()方法;通过静态方法Class.forName("全类名");通过类字面常量Class.class。 三种获取Class类型的实例的方法 方法1:通过Object类中的getClass()方法返回一个Class类型的实例 示例如下: Per…