盛大汽车门店服务的框架优化

By 雷准富@盛大汽车

近几年来,互联网技术的突破,使很多走传统商业模式的公司有了新的发展方向,盛世大联汽车服务有限公司依托自身的商业合作模式,通过互联网平台的优势和高效的框架体系,为客户提供了优质的服务。

门店服务的初期数据支撑服务为盛世大联汽车服务有限公司首款O2O产品,依据公司原有业务合理开发,采用的是struts2+hibernate的集成框架,使用oracle数据库,app 或web通过接口数据引擎来影响数据,这个简单的架构体系虽然暂时满足了当时业务的需要,但是随着公司业务需求的增多,和单日订单量的猛增,这种简单的框架显现出来它的弊端,从请求到响应耗时时间长,单服务无法支撑大量的数据订单操作。如图1

1 图1

在增加了数据服务器使用软件进行负载暂时解决了高并发的问题后,随之而来的是业务量的增加,接口的开发和定制化业务使得开发业务耦合度太高,代码的重用性降低,同时也增加了后期的维护难度。因此调整一个高效的很有必要。综合分析Spring分层架构, 7 个良好的模块。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean,而且是面向接口。不用业务数据源的动态管理使得我们优先考虑主要使用了Spring。在SSH框假中spring充当了管理容器的角色。Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书写大量的SQL语句。Struts是用来做应用层的,他它负责调用业务逻辑serivce层。所以SSH框架的流程大致是:Jsp页面----Struts------Service(业务逻辑处理类)---Hibernate(左到右)

struts负责控制Service(业务逻辑处理类),从而控制了Service的生命周期,这样层与层之间的依赖很强,属于耦合。这时,使用spring框架就起到了控制Action对象(Strus中的)和Service类的作用,两者之间的关系就松散了,Spring的Ioc机制(控制反转和依赖注入)正是用在此处。 Spring的Ioc(控制反转和依赖注入) 控制反转:就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控 依赖注入:组件之间的依赖关系由容器在运行期决定 ,由容器动态的将某种依赖关系注入到组件之中 。

图2

Spring

Spring的优势不言而喻:

  • Spring能有效地组织你的中间层对象。
  • Spring能消除在许多工程中常见的对Singleton的过多使用。
  • Spring能消除各种各样自定义格式的属性文件的需要,使配置信息一元化。
  • Spring能够帮助我们真正意义上实现针对接口编程。
  • 在Spring应用中的大多数业务对象没有依赖于Spring。
  • 使用Spring构建的应用程序易于单元测试。
  • Spring支持JDBC和O/R Mapping产品(Hibernate)
  • MVC Web框架,提供一种清晰,无侵略性的MVC实现方式。
  • JNDI抽象层,便于改变实现细节,可以方便地在远程服务和本地服务间切换。
  • 简化访问数据库时的例外处理。
  • Spring能使用AOP提供声明性事务管理,可以不直接操作JTA也能够对事务进行管理。
  • 提供JavaMail或其他邮件系统的支持。

Nginx

Nginx是一个高性能的HTTP 和反向代理服务器也是一个IMAP/POP3/SMTP(邮件)代理服务器 。

  • 热部署

在master管理进程与worker工作进程的分离设计,使的Nginx具有热部署的功能,在7×24小时不间断服务的前提下,升级Nginx的可执行文件。也可以在不停止服务的情况下修改配置文件,更换日志文件等功能。

  • 可以高并发连接

这是一个很重要的一个特性!在这一个互联网快速发展,互联网用户数量不断增加,一些大公司、网站都需要面对高并发请求,如果有一个能够在峰值顶住10万以上并发请求的Server,肯定会得到大家的青睐。理论上,Nginx支持的并发连接上限取决于你的内存。

  • 低的内存消耗

在一般的情况下,10000个非活跃的HTTP Keep-Alive 连接在Nginx中仅消耗2.5M的内存,这也是Nginx支持高并发连接的基础。

  • 处理响应请求很快

在正常的情况下,单次请求会得到更快的响应。在高峰期,Nginx可以比其他的Web服务器更快的响应请求。

  • 具有很高的可靠性

Nginx是一个高可靠性的Web服务器,这也是我们为什么选择Nginx的基本条件,现在很多的网站都在使用Nginx,足以说明Nginx的可靠性。高可靠性来自其核心框架代码的优秀设计、模块设计的简单性;并且这些模块都非常的稳定。 Nginx Web服务器优点

Nginx 是一个高性能Web和反向代理服务器, 它具有有很多非常优越的特性: 在高连接并发的情况下,Nginx是Apache服务器不错的替代品: Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一. 能够支持高达 50,000 个并发连接数的响应,

Nginx作为负载均衡服务器: Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务, 也可以支持作为 HTTP代理服务器对外进行服务. Nginx采用C进行编写, 不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多.

Nginx Web服务器是一个 安装非常的简单 , 配置文件 非常简洁(还能够支持perl语法), Bugs非常少的服务器: Nginx 启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动. 你还能够 不间断服务的情况下进行软件版本的升级.

在后期数据达到一定量时,所有的性能都浪费在了IO(输入输出)的处理,因此在后边的框架改造时,我们考虑到了缓存服务的使用Redis缓存,MongoDB文件数据库和solr检索服务。

Redis

如果熟悉关系数据库,那么肯定了解用来关联两个表的数据的SQL查询。而Redis则属于人们常说的NoSQL数据库或者非关系数据库:Redis不使用表,它的数据也不会预定义或者强制去要求用户对Redis存储的不同数据进行关联。性能键值缓存服务器memcached也经常被拿来与Redis进行比较:这两者都可用于存储键值映射,彼此的性能也相差无几,但是Redis能够自动以两种不同的方式将数据写入硬盘,并且Redis除了能存储普通的字符串键之外,还可以存储其他5种数据结构,而memcached只能存储普通的字符串键。这些不同之处使得Redis可以用于解决更为广泛的问题,并且既可以用作主数据集(primary database)使用,又可以作为其他存储系统的辅助数据库(auxiliary database)使用。但是也有缺点,就是容易受到服务器内存的限制。

特性细节:

  • 内存式: Redis将键值存储在主存中,用于快速地读写访问。
  • 复制: Redis支持主从复制。数据读取在 slave 完成,而数据写入在 master 完成。复制提供可伸缩性和可用性。任何一个slave宕机,其他的slave还可以提供数据访问。
  • 数据结构: Redis不仅存储字符串,还支持列表,集合,哈希和有序集合。虚 拟
  • 内存: Redis使用RAM作为内存式存储。但是,在内存不足的情况下,它使用虚拟内存来保存数据。
  • 发布/订阅模型: Redis 支持创建发布和订阅通道,这样 Redis 客户端可以订阅任意的通道来进行数据消费,并且任何已订阅该通道的客户端可以发布数据。
  • 数据持久性: Redis 将内存中的数据定期保存到文件系统中。当Redis节点故障时,数据可以从Redis数据文件恢复。

有很多高流量网站已经使用了Redis,下面给出了其中一些。

  • 1.Stack Overflow
  • 2.Craigslist
  • 3.Rackspace
  • 4.Plugin support for Magento
  • 5.GitHub

MongoDB

MongoDB的主要特点:

  • 文件存储格式为Bson,使用易于掌握和理解的Json风格语法。相对Json来说,Bson拥有更好的性能,主要表现为更快的遍历速度、操作更简易、增加了额外的数据类型。
  • 模式自由,支持嵌入子文档和数组,无需事先创建数据结构,属于逆规范化的数据模型,有利于提高查询速度。
  • 动态查询,支持丰富的查询表达式,使用Json形式的标记,可轻易查询文档中内嵌的对象和数组及子文档。
  • 完整的索引支持,包括文档内嵌对象和数据,同时还提供了全文索引方式,MongoDB的查询优化器会分析查询表达式,并生成一个高效的查询计划。
  • 使用高效的二进制数据存储,适合存储大型对象(如高清图片、视频等)。
  • 支持多种复制模式,提供冗余及自动故障转移。支持Master-Slave、Replica Pairs/Replica Sets、有限Master-Master模式。
  • 支持服务端脚本和Map/Reduce,可以实现海量数据计算,即实现云计算功能。
  • 性能高、速度快。在多数场合,其查询速度对于MySQL要快的多,对于CPU占用非常小。部署很简单,几乎是零配置。
  • 自动处理碎片,支持自动分片功能实现水平扩展的数据库集群,可以动态添加或移除节点。
  • 内置GridFS,支持海量存储。
  • 通过网络访问,采用高效的MongoDB网络协议,在性能方面要优于http或Rest协议。
  • 第三方支持丰富,MongoDB社区活跃,越来越多的公司和网站在生产环境中使用MongoDB进行技术架构优化,同时由10gen公司官方提供强大技术支持。

MongoDB的适用场景:

MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集两者的优势于一身。

  • 网站数据:MongoDB非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
  • 缓存:由于性能很高,MongoDB也适合作为信息基础设施的缓存层。在系统重启之后,由MongoDB搭建的持久化缓存层可以避免下层的数据源过载。
  • 大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
  • 高伸缩性的场景:MongoDB非常适合由数十或数百台服务器组成的数据库。MongoDB的路线图中已经包含对MapReduce引擎的内置支持。
  • 用于对象及JSON数据的存储:MongoDB的Bson数据格式非常适合文档化格式的存储及查询。 MongoDB的体系结构

MongoDB是由一系列物理文件(数据文件,日志文件等)的集合与之对应的逻辑结构(集合、文档等)构成的数据库。

MongoDB的逻辑结构实际是一种层次结构,由文档(document,相当于关系数据库中的row)、集合(collection,相当于关系数据库中的table)、数据库(database,相当于关系数据库中的database)这三部分组成。

一个MongoDB实例支持多个数据库。在MongoDB内部,每个数据库都包含一个.ns文件和一些数据文件,采用预分配空间的机制,始终保持额外的空间和空余的数据文件,从而有效避免了由于数据暴增带来的磁盘压力过大问题。每个预分配的文件都用0进行填充,数据文件每新分配一次,他的大小都会是上一个数据文件大小的2倍,每个数据文件最大为2G。

Solr

Solr它是一种开放源码的、基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中。Solr 提供了层面搜索(就是统计)、命中醒目显示并且支持多种输出格式(包括XML/XSLT 和JSON等格式)。它易于安装和配置,而且附带了一个基于HTTP 的管理界面。可以使用 Solr 的表现优异的基本搜索功能,也可以对它进行扩展从而满足企业的需要。Solr的特性包括:

  • 高级的全文搜索功能

  • 专为高通量的网络流量进行的优化

  • 基于开放接口(XML和HTTP)的标准

  • 综合的HTML管理界面

  • 可伸缩性-能够有效地复制到另外一个Solr搜索服务器

  • 使用XML配置达到灵活性和适配性

  • 可扩展的插件体系

一些数据库和缓存服务器的特性与功能

MySQL

MySQL Proxy最强大的一项功能是实现“读写分离(Read/Write Splitting)”。基本的原理是让主数据库处理事务性查询,而从数据库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库。 当然,主服务器也可以提供查询服务。使用读写分离最大的作用无非是环境服务器压力。

读写分离提高性能之原因:

  • 物理服务器增加,负荷增加
  • 主从只负责各自的写和读,极大程度的缓解X锁和S锁争用
  • 从库可配置myisam引擎,提升查询性能以及节约系统开销
  • 从库同步主库的数据和主库直接写还是有区别的,通过主库发送来的binlog恢复数据,但是,最重要区别在于主库向从库发送binlog是异步的,从库恢复数据也是异步的
  • 读写分离适用与读远大于写的场景,如果只有一台服务器,当select很多时,update和delete会被这些select访问中的数据堵塞,等待select结束,并发性能不高。 对于写和读比例相近的应用,应该部署双主相互复制
  • 可以在从库启动是增加一些参数来提高其读的性能
  • 分摊读取。
  • MySQL复制另外一大功能是增加冗余。

在合理的构建新的框架体系之后,在目前公司复杂的业务场景下,服务仍然能够更好的提供支持。为公司的所有客户提供快捷的优质服务。

results matching ""

    No results matching ""