zoukankan      html  css  js  c++  java
  • Adhesive问答之Mongodb数据服务

    Q:Mongodb数据服务有什么用?

    A:首先,Mongodb适合保存大量的非业务数据,因此,Adhesive框架提倡把不是非常重要的非业务数据(比如应用程序信息中心的日志、异常、状态数据,又比如WCF扩展模块的WCF调用数据,或者其它的各种业务日志、监控日志)保存在Mongodb中。虽然Mongodb的非结构化模式适合保存各种类型的数据,但是我们不得不针对各种类型的数据进行重复开发来解决一些问题:

    1)往往大量的数据希望是后台队列异步提交的,并且还需要容忍服务端和数据库的短时间不可用,因此需要开发一套客户端和服务端的双队列。

    2)在数据保存到数据库的时候需要考虑分表和分库,数据保存后需要考虑索引的建立、历史数据的删除。

    3)最重要的是,数据不是保存就了事了,我们还需要针对不同的数据开发一套后台,涉及到权限、各种方式的浏览。

    在以前,我们针对每一个业务都需要进行短则一周,长则一个月的开发,开发一套客户端收集数据的程序、开发一套服务端提交数据的程序、再开发一套后台程序。

    而现在,Mongodb数据服务负责搞定这所有的一切,可以这么说,如果希望把自定义的任何数据通过Mongodb数据服务保存到Mongodb中去的话,您只需要

    1)花10分钟左右来涉及自定义类,并且为属性应用一些特性来告诉Mongodb数据服务如何保存和呈现这些数据。

    2)花5分钟左右来配置权限、客户端、服务端等等。

    3)花10秒的时间,调用一行语句进行入库。

    不管是什么程序日志、业务日志,不到20分钟时间的开发,您就可以在Mongdb数据服务的后台以各种方式看到数据。

    Q:Mongodb数据服务的亮点在哪里?

    A:除了上面说的,可以节省开发时间之外,其它亮点如下:

    1)可以进行简单的配置来完成相对比较复杂的组合查询,比如要实现类型这样的搜索:

    image

    只需要定义元数据即可:

            [MongodbPersistenceItem(MongodbIndexOption = MongodbIndexOption.Ascending)]
            [MongodbPresentationItem(DisplayName = "借书者",  ShowInTableView = true, MongodbFilterOption = MongodbFilterOption.TextBoxFilter)]
            public string UserName { get; set; }
    
            [MongodbPersistenceItem(MongodbIndexOption = MongodbIndexOption.Ascending)]
            [MongodbPresentationItem(DisplayName = "状态变化", ShowInTableView = true, MongodbFilterOption = MongodbFilterOption.DropDownListFilter)]
            public Status Status { get; set; }
    
            [MongodbPersistenceItem(MongodbIndexOption = MongodbIndexOption.Ascending)]
            [MongodbPresentationItem(DisplayName = "书籍分类", ShowInTableView = true, MongodbFilterOption = MongodbFilterOption.CheckBoxListFilter)]
            public string Category { get; set; }

    又比如我们希望记录一个操作日志:

    image

    元数据定义如下:

            [MongodbPersistenceItem(ColumnName = "A", MongodbIndexOption = MongodbIndexOption.Ascending)]
            [MongodbPresentationItem(DisplayName = "行为", ShowInTableView = true, MongodbFilterOption = MongodbFilterOption.DropDownListFilter)]
            public string Action { get; set; }
    
            [MongodbPersistenceItem(ColumnName = "C", MongodbIndexOption = MongodbIndexOption.Ascending)]
            [MongodbPresentationItem(DisplayName = "分类", ShowInTableView = true, MongodbCascadeFilterOption = MongodbCascadeFilterOption.LevelOne)]
            public string CategoryName { get; set; }
    
            [MongodbPersistenceItem(ColumnName = "D", MongodbIndexOption = MongodbIndexOption.Ascending)]
            [MongodbPresentationItem(DisplayName = "数据库", ShowInTableView = true, MongodbCascadeFilterOption = MongodbCascadeFilterOption.LevelTwo)]
            public string DatabaseName { get; set; }
    
            [MongodbPersistenceItem(ColumnName = "TN", MongodbIndexOption = MongodbIndexOption.Ascending)]
            [MongodbPresentationItem(DisplayName = "表", ShowInTableView = true, MongodbCascadeFilterOption = MongodbCascadeFilterOption.LevelThree)]
            public string TableName { get; set; }

    这里可以看到,在后台不但呈现出了这些搜索控件,并且也填充了内容。由于考虑到性能,这些Distinct的数据不是通过Mongodb的Distinct功能完成的,而是在插入数据的时候统计这些数据,定时双向同步到Mongodb中的元数据表:

    image

    2)丰富的查询方式:

    image

    列表:

    image

    数据量统计:

    image

    分组统计:

    image

    详细:

    image

    不管是希望看列表、看数据量统计、看数据分组统计还是详细数据都可以满足要求,不许开发一行代码。

    3)系统自己会处理分表、分库、过期数据、索引、缓存、队列等等。。。

    Q:Mongodb数据服务的应用范围在哪里?

    A:一般Mongodb适合保存非业务数据,由于Mongodb数据服务模块使用的是客户端和服务端的双队列,因此即使数据量再大也不会影响正常业务的进行,但数据可能会在服务不可用并且队列满的时候丢失。因此保存程序日志、业务日志、操作日志、监控数据、异常信息、反馈信息等等数据非常适合。需要说明的是,Adhesive框架的应用程序信息中心模块以及WCF分布式服务模块的所有日志都采用Mongodb数据服务进行保存。

    Q:如何自定义对象以及使用Mongodb数据服务?

    A:参见文章http://www.cnblogs.com/lovecindywang/archive/2011/10/28/2227808.html

    Q:在自定义对象上配置的元数据改动了会怎么样?

    A:从客户端方面来说每一种类型的元数据元数据会随着第一条数据提交到服务端,并且只会提交一次,因此如果你改了元数据,肯定是需要重新启动系统的,在启动后新的元数据会保存到数据库中,从服务端方面来说,元数据不会每次都从数据库获取,只是在“维护”的时候同步一次,默认的维护时间是1分钟,因此元数据修改后1分钟后可以在后台看到效果。

    1)如果删除了列,那么列的元数据也会丢失,在后台可能就不会看到这个列了,但是老的数据不会丢失。

    2)如果增加了以及列的元数据,那么相关列的值对于老的数据可能就是空,只会在新数据出现新的列。

    3)如果要对既有列修改元数据的话,不能修改MongodbPersistenceItem的ColumnName也就是数据库中的列名,否则老的数据都会显示不出来。

    Q:Mongodb数据服务的结构是怎么样的?

    A:Mongodb数据服务写入数据的流程如下:插入数据到客户端队列-客户端队列取出数据提取元数据进行数据重组-客户端队列通过WCF分布式服务模块提交数据到服务端队列-服务端队列-服务端队列取出数据进行索引项更新-服务端队列把数据提交到数据库

    Mongodb数据服务读取数据的流程如下:通过WCF分布式服务模块连接服务端读取数据-服务端从数据库取出实际的数据-服务端从内存中获取元数据-服务端把实际数据和元数据进行合并并返回客户端

    Mongodb数据服务的服务端有一个很重要的维护服务,它的工作如下:

    1)同步元数据

    2)同步列的索引数据(比如高级数据筛选下拉框和多选框的内容)

    3)清空历史数据(如果设置了过期天数的话)

    4)从数据库获取数据库服务器、数据库、表、索引四个层次的实际状态

    5)建立索引

    Q:Mongodb数据服务的配置需要注意哪些地方?

    A:注意点如下:

    1)在新定义自定义类型之后需要在配置服务中配置数据项,否则数据无法提交到服务端也无法提交到数据库

    2)定义在列上的特性注意冲突和一些约束,尽量

    3)适当清空下修改默认的参数(比如队列提交批次、最大数据条数)来改善性能

    Q:Mongodb数据服务需要怎么配置Mongodb?

    A:我们的每一个类型可以配置不同的服务器集群,因此在一定程度上可以实现方便的扩容:

    image

    考虑到分担压力,系统默认支持读(后台查询)写(提交数据以及维护)分离,因此可以配置MASTER-SALVE的Mongodb

    image

    需要注意的是,在理论情况下,后台进行的所有操作都不会进行表扫描,在索引未创建完成的情况下,是不会出现相关的搜索控件的,因此可以配置Mongodb为不允许表扫描:

    image

    Q:Mongodb数据服务可以使用老的Mongodb集群吗?

    A:可以,Mongodb数据服务通过Metadata数据库来知道哪些是自己的数据库,其它数据库不会去管理,后台也看不到。

    欢迎大家阅读我的极客时间专栏《Java业务开发常见错误100例》【全面避坑+最佳实践=健壮代码】
  • 相关阅读:
    windowswindows/windowslinux间文件远程传输
    GNUstep ObjectC Ubuntu
    Linux日常问题处理集
    上网实用技巧
    ubuntu host VirtualBox xp guest networking
    平衡组/递归匹配
    Linux在线词典
    正则表达式的构造摘要
    Microsoft .NET Pet Shop 4 架构与技术分析
    ASP.net 2.0资料吐血收藏(^_^) (转)
  • 原文地址:https://www.cnblogs.com/lovecindywang/p/2290511.html
Copyright © 2011-2022 走看看