部署的考虑

终于到达上线的这一天了。我要提醒各位看官的是,不管代码多么糟糕,到上线时也得上线。这说明部署也是一个逐渐摸索的过程。前端

 

准备数据库

随着开发的深刻,数据会常常变化。尤为是对于MongoDB这样的无模式数据库,修改它的数据模式更是简单。当Model层改变时,不可避免地要作数据迁移。通常来说,这是一个很繁琐的工做,并且很容易出错。数据库

我在项目中使用一个名叫'mongoid_rails_migrations'的gem来处理MongoDB数据库的数据迁移工做。它是与db:migration兼容的。它还有其余的好处,【待摸索】。json

 

数据库的索引也是常常变化的。使用命令服务器

bin/rake db:setup RAILS_ENV=production

能够自动帮助创建索引,这些索引的创建是基于Model层的代码里的相关配置。另外,此命令还会为数据库作一些其余的准备工做。工具

 

因为数据库常常变化,数据迁移常常出错,因此作好数据库备份就尤其重要了。【待补充】性能

 

集中配置项

配置项要集中在一个配置文件里,或者config目录下的若干配置文件下面,而不能分散在代码各处。这样才便于集体修改。还要为开发环境和生产环境准备不一样的配置文件。网站

 

线上运行监控

线上监控是必须的,不然就像盲人同样摸不着方向,不能预判,也不能很快处理突发状况。线上运行出现情况是必然的,重点是出现情况咱们要可以知道问题所在。编码

线上监控的范围很宽泛,包括服务器性能监控,服务器异常监控等。spa

我目前只作了监控项目代码中抛出的未知异常,作到这些是经过rescue_from顶层Exception对象,而后向前端抛出500错误并将当前异常情况写入磁盘文件中。我想要判断是否有异常发生,是经过查看磁盘上是否有错误日志生成来肯定。日志

    rescue_from Exception do |ex|
      render status: 500, json: {message: '服务器内部错误'}

      now = Time.new.strftime '%y%m%d-%H%M%S'
      open "log/errors/#{now}.log", 'w' do |f|
        f.puts "#{request.method} #{request.fullpath} for #{request.remote_ip}"
        f.puts "Access-Token: #{request.headers['Access-Token']}" if request.headers.include? 'Access-Token'
        f.puts "#{request.parameters}"
        f.puts
        f.puts "#{ex.class}:"
        f.puts ex.message
        f.puts ex.backtrace
      end
    end

上面的异常捕获代码也可能会发生异常的。有如下可能:

1. render status: 500, json: {message: '服务器内部错误'} 以前已经被render过了,就会抛出AbstractController::DoubleRenderError

2. 读写文件的过程当中发生异常

3. 文件编码默认是utf8,代码 f.puts "#{request.method} #{request.fullpath} for #{request.remote_ip}" 写入request.fullpath过程当中可能出现Encoding::UndefinedConversionError。这是由于URL路径中出现了不能被转化为utf8编码的字符。这是我亟待解决的问题,不能让它出现。

若是上面的rescue Exception的异常捕获代码出现了异常,这时就会发邮件给我了。这是经过名为exception_notification的gem来实现的。

 

实际上,监测异常是不够的,并且个人实现方式不便于检索。当异常出现状况较少的时候是可取的,但常常出现异常,就极不可取了。一个能检索、能分类的异常监测系统在项目变大时就很须要了。另外,当访问量激增,数据量变大,项目变复杂,也须要性能监控系统。网上已经流行了一些监控工具,有些甚至是跨语言的。不过大部分收费,并且不能部署到本地,须要申请帐号链接到国外的网站,不方便。

相关文章
相关标签/搜索