Header

  1. View current page

    재선아빠님의 노트

Profile_image?t=1224119607&type=big
21

session6-scenario

 

 

실제 프로젝트 적용 사례 : 스프링노트 2

  • 완소 RSpec with BDD - (debugger vs puts) (설치,사용방법,픽스처구성,테스팅기법,rcov)
  • 디플로이 및 운영 - 멈추지 않는 서비스 (구성,배포방법,로깅)
  • 캐시만이 살길이다 - 성능향상 방법 팁
  • 손쉬운 어드민 서비스 및 기타 이슈별 대안제시

 

어떻게 했다 위주로 하는게 더 좋을 듯 - 처음 듣는 사람들이 더 많으리란 생각.)

 

테스트

RSpec 실행화면 실제로 보여줌.

rcov 결과를 보여주고, 테스트 커버리지에 대한 얘기도 함.

레일스 테스팅 환경(spec/spec_helper.rb 로 잠깐 환경설정 얘기도)

완소 RSpec

RSpec
  Behaviour Driven Development Framework for Ruby
  어플리케이션의 implementation/code 보다는 behaviour 의 관점에서 테스팅 하는 방법
BDD
  Specification rather than Verification

디버깅은 어떻게 하시나요? -> 테스트 코드를 먼저 작성한다. 실제로 디버깅을 하는 경우가 드물다?

버그가 있는 코드로 잦은 배포 한다는 것이 부담스럽진 않은가요? --> 테스트로 안심하기.

리그레션 테스트. 테스트 커버리지가 말해준다. 완벽 Q/A 조직. 품질보장.

설치/설정

기본적인 사용방법 및 스프링노트에서 실제로 사용중인 내용을 보여줌. / rcov 도 보여주면 좋겠다.

링크1, rspec home, rspec_on_rails,

raisconf2007 (rspec) : http://aslakhellesoy.com/s5/rspec_bof_railsconf_2007.html

캐시만이 살길이다
MemCached => Slashdot, Wikipedia, Facebook, 그리고 Digg같은 대용량 사이트에 사용되는 분산 메모리 캐싱서버(in-memory caching daemon)

 

적극적인 캐시의 사용 memcached (캐싱기법). 캐시 설정/적용 방법. 사용방법.

 

ias : http://me2day.net/ias/2007/05/20

배포

 

운영 - 중단없는 서비스

현재 스프링노트의 운영 환경/구성. (서버2대 몽그레일 20마리씩, 아파치 mod_proxy)

운영체계 - 모니터링 (spade - django 24시간 관제실에서 모니터링 할 수 있는 툴을 제공함)

 

Apache + ProxyBalancer + Mongrel

 

monit 은 유닉스 시스템에서 프로세스, 파일, 디렉토리를 감시하고 관리하는 유틸리티이다. monit 은 자동 관리 및 복구를 가능하게 하므로 오류가 발생했을 때 시기 적절한 처방을 내릴 수 있다.

 

문제점

Mongrel 프로세스들을 재시작하는 경우. Production 환경에서는 모든 모듈이 리로드 되지 않기 때문에 재시작이 반드시 필요하다. 그리고 mongrel에 시그널을 보내 전부 리로드 하는 기능이 있다고 나와있지만, 전혀 되지 않는다(잘 안될 거라고 써있기도 하다).

아파치를 가만 두고, mongrel 프로세스들을 모두 재시작하면, ProxyBalancer들은 이 프로세스들을 모두 에러가 난 것으로 간주하여, 한동안 ‘503 Service unavailable’ 에러가 난다.

 

해법

balancer_manager라는 아파치 핸들러가 있어서, 이를 이용하면 ProxyBalancer를 좀 더 세밀하게 제어할 수 있다. 현재 ProxyBalancer의 상태를 보는 것은 물론, 작업자 각각의 가중치를 제어하고, 개별적으로 켜고 끌 수도 있다.

 

mongrel_rails의 클러스터 기능을 사용하지 않고, 각각을 하나씩 재시작하는데, 이 때마다 balancer_manager를 통해 직접 해당 작업자를 잠시 껐다가 켜주는 것이다. 그렇게 하면 사용자는 재시작 프로세스가 진행되는 동안에도 에러 메시지나, 끊어짐 없이 서비스를 사용할 수 있다.

 

deploy : 효율적인 배포 및 운영관련내용

  • mongrel 관리 / 모니터링 ... 잘 죽이기 (도움이 될 것 같음)
  • monit 을 이용한 mongrel 재시작하기
  • (TODO) monit 관리툴 캡춰
  • 로깅기법 - 레일즈의 로그 로테이터는 사용하지 않는다. 쓰레드 세이프 하지 않아서 문제가 발생함. 실제로 겪었던 문제임.
  • 몽그레일FAQ

 

최신의 경향 언급 (미래를 위해서 준비하는 차원?)

엔터프라이즈 환경에 준비가 되어있는가? --> 엔터프라이즈는 레일즈를 위해 준비가 되어있는가 라는 반문.

살짝 최신의 운영환경 예를 언급? (RailsConf2007)

 

이슈별 대안제시

성능을 높이는 팁들 (railscasts)

 

인스턴스 변수를 활용한 쿼리 줄이기
  1. 일반적인 형태의 컨트롤러에서 쿼리해오는 코드 셈플을 보여준다 (caching_with_instanc_variable.rb)
  2. 레일스 콘솔에서 User.find(1) 을 호출할때마다 쿼리가 날라가는 것을 보여준다.
  3. 레일스 콘솔에서 @user ||= User.find(1) 을 호출하면 매번 쿼리가 날라가지 않는 것을 보여준다.

Eager loading : fetching performance 관련 내용 (모델의 관계를 이용한 find (:include) 로 쿼리 줄이기)
  1. 콘솔에서 user = User.find(1) 를 수행해서 유저를 가져온다.
  2. 콘솔에서 pages = user.pages.find(:all) 를 수행해서 유저의 모든 페이지를 가져온다.
  3. pages.each do |page| page.revision_ids end 를 수행해보면 페이지마다 revision_id들을 가져오기 위해서 매번 쿼리가 수행된다.
  4. pages = @user.pages.find(:all, :include => :revisions)  이런형태로 하게되면 처음 한번에 관계를 이용해서 데이타를 가져오기 때문에, pages.each do |page| page.revision_ids end 와 같이 수행해봐도 추가로 쿼리가 수행되지 않는 것을 볼 수 있다.

 

로그 필터링 - JSON 객체의 경우. 레일즈의 필터가 적용되지 않기 때문에 주의.

rescue 와 rescue Exception 의 차이
  1. exception catch ==> rescue 의 경우에는 Exception 트리중에서 StandardError 들만 rescue 하기 때문에 Timeout 같은 오류는 캐치하지 않음. 따라서 명시적으로 모든 Exception 을 처리해주기위해서는 rescue Exception 이라고 해주어야함.

 

 

etc

awesome_way.rb

awesome_ruby.png

History

Last edited on 05/31/2007 01:29 by JasonPA

Comments (0)

You must log in to leave a comment. Please sign in.