基于mongoDB的capped collection的性能优化

MonitorLogging改造(消息接入)

改造前架构:

可以看出原来的流程中,大量业务分析,业务接入耦合在web服务层。大量操作,导致线程线性的挂起线程。

改造后:

将业务通讯抽象成为MonitorQueueManager,并将业务主题抽象放到各自的collection中。

形如:

抽象为一个结构topic,content针对业务分为若干个主题。方便以后切换到mq或者其他的队列中。

MonitorSchedule改造(消息集中处理)

原有处理流程

当时业务比较少,只有一个主处理流程,所以强耦合到main方法中,扩展基本等于0。加之之前开发比较仓促,编码注释基本没有。
现在要将monitorLoging里面的所有业务处理,放到MonitorSchedule中。业务增加,如果架构再不进行改变那即将是个灾难(维护或者业务流程新增)。

改造之后的流程:

看起来也清晰不少吧,原来的业务分成了按照业务事件进行分类。

使用监听器来处理事件本身,就有一个问题。多线程的情况下如何管理业务的处理速度。原有的瓶颈放到mongodb中了,但是,如果线程读取太快了,那么,性能的瓶颈有被移到了任务操作中了。

capped collection

这里我们先说下mongodb的capped collection:

  • 固定长度
  • LRU队列
  • 环装结构,老数据自动覆盖
  • 录入队列的数据可以与直接读写磁盘媲美
  • 基于日志形式(不可修改,不建立索引情况下速度与写磁盘相同)

其实它的最大优点也是最大缺点,

  • 建立索引效率将为普通的collection,查询效率低下
  • 不支持分片,再哪个mongo建,就只能在哪个mongo下用

所以大家可以看到,如果写到了mongoDB的collection队列之后,序列化能力使得,数据多了一个缓存方式。

代码逻辑

event

事件的结构很简单:

主要三个内容:

  • queueName 队列的名称
  • topic 消息的主题
  • source 真正消息的内容

listener

主要使用了spring的applicationMulticast事件广播,使用了模板方法的设计,降低耦合的同时,也大大的降低了业务实现的难度。

业务实现的逻辑,这里使用内部类来对业务进行分类,防止太多的command出现

命令的接口类

reader

这里将接口定义为两类:

  • 持久化层
  • 缓存层

利用修饰模式设计,共同被模板类依赖

抽象类实现

这样让代码编写量大大减少
我们来看下具体实现类:这样的设计相比之前的要好了不少

测试中遇到的问题

  • collection的大小限制

固定记录数假如是100条,那么对于collection来说就会存在被覆盖的情况。设置合理的长度很重要,目前设置为2个G单collection。保证缓存当天的数据,即使线程卡住或者有其他情况,也可以合理缓存。

  • 线程等停顿位置

之前在设置线程停顿时,会在读取过程中,进行sleep。这样就会对系统资源浪费,但是如果频繁的轮训又会出现一个问题,mongodb的链接资源浪费(频繁请求)。综上,采取的办法是读取有数据的时候就不休眠,在没有数据的时候才进行200毫秒的等待。

大家可以算一个账,如果一次执行等待200毫秒,处理时间为100豪秒/500条。那么就会出现做500条等待200毫秒,一秒钟只能处理1000 /(200+100)* 500=1500条数据,白白浪费了 400毫秒。所以需要改成没有数据再进行等待操作,如果有则不进行等待。

时间: 2024-08-10 23:18:40

基于mongoDB的capped collection的性能优化的相关文章

基于AngularJS/Ionic框架开发的性能优化

AngularJS作为强大的前端MVVM框架,虽然已经做了很多的性能优化,但是我们开发过程中的不当使用还是会对性能产生巨大影响. 下面提出几点优化的方法: 1. 使用单次绑定符号{{::value}} AngularJS的性能优化方法之一是减少双向绑定.我们知道AngularJS的双向绑定是通过为每个需要双向绑定的数据对象添加$$watchers,一旦某个scope的数据发生了更新,就触发脏检测($digest),深度优先遍历所有scope对象的$$watchers值的old/new value

Tomcat 8/9 基于APR库的高并发性能优化

一.知识点扫盲 什么是APR?Apache Portable Runtime(APR)项目的任务是创建和维护软件库,为底层平台特定的实现提供可预测且一致的接口.主要目标是提供一个API,软件开发人员可以对其进行编码,并确保可预测的行为,如果不是相同的行为,无论其软件构建的平台如何,都可以减轻他们编写特殊情况的需要,以便解决或采取行动.平台特定缺陷或功能的优势. 二.tomcat的三种模式 Tomcat的运行模式有3种,即BIO.NIO和APR.1.BIO(blocking I/O)即阻塞式I/O

mongodb的capped Collection集合

db.createCollection(name, {capped: true, autoIndexId: true, size: 1000, max :100} ) name:集合的名字 capped:true 是否启用集合限制 autoIndex:true(默认是true) 是否使用_id作为索引 size:1000000 限制集合使用的空间的大小,默认没有限制 max:100000 集合中最大条数显示,默认没有限制(max的优先级低于size) 我们创建集合 db.createCollec

【MongoDB】Mongodb数据库之Capped Collection集合

Capped Collection是性能出色的有着固定大小的集合,以LRU(least Recently Used,最近最少使用)规则和插入顺序执行age-out(老化移出)处理,自动维护集合中对象的插入顺序. 一.创建Capped Collection 创建时候要预先指定大小,如果空间用完,新添加的对象将会取代集合中最近的对象.更新如果超出了collectiond 大小,则会更新失败.虽然不允许删除,但是可以调用drop方法删除集合中所有的文档. 删除后要显示重建集合.在32机器上,一个cap

MongoDB整理笔记のCapped Collection

1.简单介绍 capped collections 是性能出色的有着固定大小的集合,以LRU(Least Recently Used 最近最少使用)规则和插入顺序进行age-out(老化移出)处理,自动维护集合中对象的插入顺序,在创建时要预先指定大小.如果空间用完,新添加的对象将会取代集合中最旧的对象. 2.功能特点 可以插入及更新,但更新不能超出collection 的大小,否则更新失败.不允许删除,但是可以调用drop() 删除集合中的所有行,但是drop 后需要显式地重建集合.在32 位机

MongoDB-固定集合 capped collection 操作 介绍

固定集合:capped collection 是性能出色的固定大小的集合,以LRU算法淘汰记录,自助维护集合中的对象的插入顺序,创建时预先制定大小,空间使用完,心对象取代旧的对象,保持最新的数据. 可以插入及更新,但更新不能超出 collection 的大小,否则更新失败.不允许删除,但是可 以调用 drop() 删除集合中的所有行,但是drop 后需要显式地重建集合.在 32 位机上,一 个 capped collection 的最大值约为 482.5M,64 位上只受系统文件大小的限制. 属

Android App 性能优化系列结语篇

关于Android App的优化, 从第一篇的计划开始, 到内存优化的系列文结束, 不知不觉近三个月的时间, 写了十五六篇相关的博文, 算是对自己的知识的一个系统化, 也希望能给大家一些帮助.在此有对此做一个总结. 路线Android App优化1, App性能优化要怎么做在系列的开篇文中, 我们聊到了本系列的一个缘由, 和当时的一个计划, 系列也基本是朝着这个这个方向走的.2, 性能分析工具在此介绍了一些惯用的性能分析工具, 包括官方, 第三方的, 内存分析的, UI分析的, 执行时间性能分析

MongoDB性能优化指南

一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引是凌驾于数据存储系统之上的另一层系统,所以各种结构迥异的存储都有相同或相似的索引实现及使用接口并不足为 奇. 1.基础索引 在字段age 上创建索引,1(升序);-1(降序): db.users.ensureIndex({age:1}) _id 是创建表的时候自动创建的索引,此索引是不能够删除的.当

MongoDB性能优化

MongoDB是一个高性能可扩展基于文档的NoSQL数据库,高性能也需要在多个关键维度的配置,包括硬件.应用模式.模式设计.索引.磁盘I/O等. 存储引擎 WiredTiger是3.0以后的默认存储引擎,细粒度的并发控制和数据压缩提供了更高的性能和存储效率.3.0以前默认的MMAPv1也提高了性能.在MongoDB复制集中可以组合多钟存储引擎,各个实例实现不同的应用需求. 硬件 MongoDB初衷是采用水平扩展构建集群,而不是价格更高的硬件升级.采用复制保证高可用,自动分片使数据均匀分布在各节点