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毫秒。所以需要改成没有数据再进行等待操作,如果有则不进行等待。

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

  1. Tair LDB基于Prefixkey中期范围内查找性能优化项目总结

    "Tair LDB基于Prefixkey该范围内查找性能优化"该项目是仅一个月.这个月主要是熟悉项目..以下从几个方面总结下个人在该项目上所做的工作及自己的个人所得所感. 项目工作 ...

  2. 基于SSD固态硬盘的数据库性能优化

    基于SSD固态硬盘的数据库性能优化 2010-11-08 00:0051cto佚名   关键字:固态硬盘 数据库管理 SSD 企业软件热点文章 Java内存结构与模型结构分析 Oracle触发器的语法 ...

  3. MongoDB 之 Capped Collection

    MongoDB 支持 Capped Collection,一种固定大小的集合,当集合的大小达到指定大小时,新数据覆盖老数据,MongoDB Replica set 中的 oplog 就是 Capped ...

  4. Tair LDB基于Prefixkey找到如何提取一系列性能优化项目key的prefix_size

    眼下项目已快截止,编码任务也基本完毕.如今主要是性能測试. 项目是依照"Tair LDB基于Prefixkey的范围查找性能优化项目提议方案"的步骤一步步完毕的,首先先介绍第一个关 ...

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

    AngularJS作为强大的前端MVVM框架,虽然已经做了很多的性能优化,但是我们开发过程中的不当使用还是会对性能产生巨大影响. 下面提出几点优化的方法: 1. 使用单次绑定符号{{::value}} ...

  6. nRF24L01基于FIFO TX队列的发送性能优化

    RF24项目代码分析 头文件 https://github.com/nRF24/RF24/blob/master/RF24.h 源文件 https://github.com/nRF24/RF24/bl ...

  7. mongodb的capped Collection集合

    db.createCollection(name, {capped: true, autoIndexId: true, size: 1000, max :100} ) name:集合的名字 cappe ...

  8. MongoDB整理笔记のCapped Collection

    1.简单介绍 capped collections 是性能出色的有着固定大小的集合,以LRU(Least Recently Used 最近最少使用)规则和插入顺序进行age-out(老化移出)处理,自 ...

  9. Mongodb Capped Collection集合

    MongoDB 固定集合(Capped Collections)是性能出色且有着固定大小的集合,对于大小固定,我们可以想象其就像一个环形队列,当集合空间用完后,再插入的元素就会覆盖最初始的头部的元素! ...

随机推荐

  1. C#学习笔记(3)

    先理解一下方法重写和方法重载这2个概念: 1.方法重写(override):发生在父子类之间,子类重写父类中的方法,关键字是override. 2.方法重载(overload):一个类中有多个重名的方 ...

  2. Win7/Win8.1预订升级Win10失败临时解决方案

    很多Win7/Win8.1用户在今天凌晨通过微软官方推送的方式升级Win10,但这一过程中遇到了“安装失败”等问题,导致升级无法进行.鉴于这种情况,很多用户选择进入Windows10预下载安装文件夹打 ...

  3. C#创建微信自定义菜单

    string posturl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + access_to ...

  4. 搭建java开发环境

    windows 去Oracle官网下载exe文件,双击安装. 修改系统环境变量(我的电脑 -> 属性 -> 高级 -> 环境变量). JAVA_HOME: D:\Java\jdk1. ...

  5. avconv转换视频

    提取指定stream time avconv -i i.mkv -map 0:0 -map 0:1 -map 0:5 -c:v copy -c:a:0 mp3 -c:s copy o.mkv 合并 a ...

  6. YII 开启URL伪静态

    1.开启apache的mode_rewrite模块 去掉LoadModule rewrite_module modules/mod_rewrite.so前的“#”符号 确保<Directory ...

  7. CentOS6.4 使用谷歌Chromium浏览器

    那么,如果希望在CentOS/RHEL 7出来之前继续使用Chrome怎么办?使用Chrome的开源版本:Chromium. 1.切换到root: su - 或者 sudo -i 2.下载新的软件源定 ...

  8. Activity的测量(Measure)、布局(Layout)和绘制(Draw)过程分析

    一个Android应用程序窗口里面包含了很多UI元素,这些UI元素是以树形结构来组织的,即它们存在着父子关系,其中,子UI元素位于父UI元素里面,因此,在绘制一个Android应用程序窗口的UI之前, ...

  9. wampserver修改默认根目录

    1.打开wamp/scripts/config.inc.php ,修改$wwwDir = $c_installDir.’/www’; 2.打开wamp/bin/apache/apache2.4.9/c ...

  10. Educational Codeforces Round 6 D. Professor GukiZ and Two Arrays

    Professor GukiZ and Two Arrays 题意:两个长度在2000的-1e9~1e9的两个序列a,b(无序);要你最多两次交换元素,使得交换元素后两序列和的差值的绝对值最小:输出这 ...