AppHarbor 로 .NET Application 테스트/서비스하기

아오 썅 AppHarbor 쓰는 한국인들 없나? 닷넷이 이렇게 죽었어? 엉? 구글 검색으로도 안나와 어떻게 된게.

그래서 내가 열받아서 쓴다. 참고로 AppHarbor 는 웹 어플리케이션 및 백그라운드 어플리케이션 (걍 콘솔)을 지원한다.

여기서는 웹 어플리케이션을 만들고, 올리고, 보여주는 식으로 강좌를 올리겠다.

AppHarborHeroku 의 .NET 버전이라고 보면 된다고 한다. (어느 외쿡님이)

AppHarbor 는 PaaS 서비스로, 어플리케이션을 올려서 서비스 한다고 보면 되며, 야는 .NET 만 지원한다.

.NET 버전은 csproj 파일에 있는 버전으로 알아채기 때문에 버전이 어떤 거든 상관은 없는데 최신 기술인 4.5 도 지원된다고 한다.

일단 .NET 클라우드 플랫폼에서 웹 서비스만 할거라면.. 무료다. 표를 통해 확인해봅세.

구분 

Azure 웹 무료

 AppHarbor 무료

 앱 개수

사이트 10개

제한 없음

 사이트 개수

 1

1

 저장소 용량

1GB (사이트 공유 총용량)

딱히 없는듯

 트래픽 제한

 일 165MB

월 100GB (작은 Worker) 

 사용자 지정 도메인

지원 안함

추가 요금 (제한없이 10$/월)

 SSL

지원 안함

기본 SSL 지원, 개별 별도 요금

 DB

MSSQL 전용 20MB 제공

 확장을 통해 무료 MSSQL 공유 20MB

MySQL 및 MongoDB도 있음.

 협업

불가능 (웹 게시 방식)

Git 를 통해 가능

 비고

 90일 무료 체험 가입해야함

그냥 가입하고 쓰면 됨

구분 

Azure 웹 서비스 표준

AppHarbor CATAMARAN

월 가격 (최소 인프라)

75$

49$

사이트 개수

100

1

 인스턴스 개수

 10

2

 사용자 지정 도메인

 지원

지원

 SSL

 별도 추가 요금

지원

 DB

 마찬가지이며 추가시 별도과금

마찬가지이며 추가시 별도과금

 협업

 불가 (웹 게시 방식)

Git 를 통해 가능

 저장소

10GB (사이트 공유 총용량)

 제한 없음

요금제 분석

 작은 여러 사이트 운영시 유리한 요금

큰 단일 사이트 운영시 유리한 요금

딱히 놓고 보면 AppHarbor 가 가격 면에서 비싸보인다. (솔직히 비싼것 같다.) 하지만 무료 환경이 좋다. 그래서 소개하는 것이다.

유료 요금제 분석 내가 가격과 스펙을 봤을 때 아무래도 이렇게 쓸 때 좋겠다는 주관적 입장일 뿐이며, 자세한 사항은 직접 가서 비교하기 바란다.

AppHarbor 는 Worker Scale 에 자세한 스펙을 표시하지 않았다. 그래서 한번 찾아봤더니 다음과 같이 나온다.

One worker is currently limited to roughly 50% of an AWS Elastic
Compute Unit (ECU) which is equivalent to 500-600 MHz. The worker
is allowed to consume up to 512MB of RAM (soft limit) and there’s a
1GB hard RAM limit. You might also want to check out the limits
section of our program policy which
specifies other limits of interest.

Limits

AppHarbor has soft and hard limits for the use of its services. Hard
limits are automatically enforced and soft limits are consumable
resources that you agree not to exceed.

  • Network Bandwidth per Worker Unit: 100GB/month – Soft
  • Shared DB processing: Max 200msec per second CPU time – Soft
  • Request timeout: 30 seconds – Soft; 120 seconds – Hard
  • RAM usage per Worker Unit: 512 MB – Hard (if you only have a single
    worker unit per worker the limit is: 512MB – Soft; 1024MB – Hard).
    Workers are restarted/recycled when exceeding this value).
  • CPU resources per Worker Unit: ~600MHz – Hard
  • Requests Queue limit per Worker Unit: 500 Requests – Hard

Worker 하나당 500MHz, 반기가헤르츠의 처리 속도와 512기가의 RAM을 제공받는다고 보면 된다. (물론 기본 Worker 당 스케일 늘리면 당연히 늘어나겠지만)

그리고 트래픽 100기가, 공유 DB의 경우 처리 속도가 200밀리초 미만, 최대 요청 시간 30포, 500개의 요청 대기를 지원한다.

그리고 RAM 의 경우 허용 크기를 넘어버리면 Worker 가 다시 시작된다. 사이트를 다시 시작한다는 뜻이다. 그렇게 되면 세션같은 메모리에 적재된 데이터는 날라간다. 무분별하게 메모리 내에 객체를 담는 것은 지양해야 할 것이다.

하지만 이정도 사양이면 사이트 테스트및 개인 연습 사이트 운영 등에 지장이 없다. 대국민 서비스는 젭알.

자. 이제 AppHarbor 로 어플리케이션을 어떻게 배포하는지 알려주도록 하겠다.

필자는 Nancy 로 만든 ASP.NET 웹 프로젝트를 만들었다. ASP.NET MVC 써도 되고 걍 ASP.NET 써도 되고

여의치 않는 사용자는 WebMatrix 로 만든 웹 사이트도 가능하다.

비주얼 스튜디오에서 웹개발 하는 사람이라면 알겠지만, 폴더 단위 프로젝트가 웹 사이트며, WebMatrix 는 웹 사이트 프로젝트만 지원하기 때문에 sln 파일이 따로 없다. 없어도 된다. 그래서 AppHarbor 에 올릴 때 솔루션 파일 (sln)이 없으면 웹 사이트 프로젝트로 취급되어 빌드되고 실행된다.

프로젝트 개수에 상관없이 sln 파일이 있고, 그 하위에 프로젝트 있는 구조로 올리면 된다.

어떤 프로젝트는 sln 이 별도 폴더에 있고 실제 프로젝트는 다른 경로에 있는데 그렇게 하면 잘못 판단하여 빌드 안되므로 유의.

즉, 이렇게 하라는 거다. 올바른 앱 폴더 구조는 다음과 같다.

AppHarbor_Test (앱 최상위 폴더)

└ Project1 (클래스 라이브러리 폴더)

└ ASPNETMVC (웹 프로젝트 폴더)

└ MyApp.sln (솔루션 파일)

또는

AppHarbor_Test (앱 최상위 폴더)

└ App_Data (폴더)

└ Index.aspx (페이지 파일)

└ Global.asax (웹 설정)

└ MyClass.cs (임의 클래스)

└ Web.config (웹 설정)

└ MyApp.csproj (프로젝트 파일)

└ MyApp.sln (솔루션 파일)

아래와 같은 앱 폴더 구조는 올바르지 않다. (웹사이트로 인식되어 올바르게 사이트 뜨지 않는다)

AppHarbor_Test (앱 최상위 폴더)

└ Sln (솔루션 폴더)

    └ MyApp.sln (솔루션 파일)

└ Project1 (클래스 라이브러리 폴더)

└ ASPNETMVC (웹 프로젝트 폴더)

<

p>

이렇게 해서 프로젝트를 만들거나, 기존 웹 되는 프로젝트를 먼저 준비한다.

그리고 아래 프로그램이 있어야 한다.

  • Git for Windows (Github for Windows 는 Github 연동일 때만 해당) (필수)
  • TortoiseGit 또는 Git Extensions (마우스 클릭으로 하고 싶으면 설치, 콘솔로 하겠다면 비설치)
  • Git Source Control Provider for VS2012 (있으면 편하고 없어도 무방)

Git 쓰는 방법은 귀찮아서 패스. 구글 검색하면 흔하디 흔하게 나온다.

AppHarbor 가입하는 방법은 간단하다. 메인 페이지에서 GET STARTED NOT 버튼을 클릭하여 이메일, 아이디, 비번 세가지만 쓰면 된다. 그럼 인증메일이 오는데 인증메일 링크를 클릭하고 로긴하면 가입절차가 끝난다.

그러면 Create New Application 나오는데, 원하는 이름을 입력하고, 서버 위치 선택 후 만들면 된다.

서버 위치가 미국, 유럽, 미국베타가 있는데 걍 미국 선택 후 만든다.

그런 다음, 왼쪽 메뉴 하단에 REPOSITORY URL 버튼이 보일 것이다. 클릭하면 URL이 복사된다.

Git 원격 URL을 복사된 URL로 쓰면 된다.

특이한 점은 비밀키 생성된 파일을 요구하지 않고, 비밀번호만 요구할 것이다. 원체 윈도우다 보니 HTTPS 프로토콜만 제공하나보다. 물론 비밀키파일 생성하고 원격에 등록하면 매번 비번 입력하는 귀차니즘 없이 쓸 수는 있는데.. 안타깝소.

그리고 메뉴에 Hostnames 가보면 생성된 URL이 뜨는데 이게 당신이 만든 웹 사이트를 접근할 URL 이다.

안타깝게도 사용자 지정 도메인은 유료이기 때문에 운영할 맘이 없다면 그냥 기본 제공 도메인을 쓰도록 한다.

다음으로, DB를 쓰도록 하자. AppHarbor 사이트 위에 대메뉴에서 Add-ons 가면 되는데, MySQL, PostgreSQL, MSSQL 등의 SQL DB가 지원되고, MongoDB, Redis, CouchDB 등의 No-SQL 디스크 기반 또는 메모리 DB를 사용할 수 있다.

무료 플랜도 찾아보면 나오며, 테스트로 쓸수 있고, 경우에 따라 원격 접속도 가능하여 확인도 가능하다.

MSSQL 쓰려면 맨 아래로 스크롤 이동하면 나오는데, Yocto 가 무료다. 공유된 SQL 환경에서 20MB 무료로 제공한다.

주저없이 테스트 해주자. 당신의 컴터에 매니지먼트 스튜디오 등의 DB 클라이언트 있으면 거기서도 접속 가능하므로 참고.

composite / 2013년 10월 7일 / 미분류 / 2 Comments

지연된 객체 (Deferred Object) 만들기 – .NET 편

이번엔 닷넷편을 해보도록 하겠다.

일단 자바좀 해본 닷넷 개발자라면 눈치챘겠지만…

닷넷 3.5 이상이라면 실행해볼 수 있는 방법 되시겠다. 특징이 있다면 대리자를 만들어놨는데.

사실 4에서는 Action, Func 라는 내장 대리자가 있는데, 3.5에는 없기 때문에 대리자를 달아줬다.

4 이상이라면 Action 으로 대체해도 무방하다고 보면 되는데, 지연된 객체에 쓰는 대리자라는 명시를 할 때 도움이 되기 위해 대리자를 썼다.

자바하고 방식은 동일하다. 닷넷에서 제공하는 쓰레드를 이용하는 방식이다.

    using System;
    using System.Threading;
 
    public delegate void DefferedEvent();
 
    internal class DeferredObjectSample
    {
        private DefferedEvent evt;
 
        public DeferredObjectSample(int second)
        {
            Console.WriteLine("작업을 시작했다!");
            Console.WriteLine(second + "초 후면 작업이 끝난다!");
 
            new Thread(() =>
            {
                Thread.Sleep(second * 1000);
                Done();
            }).Start();
        }
 
        private void Done()
        {
            if (evt != null) evt.Invoke();
        }
 
        public DeferredObjectSample Done(DefferedEvent evt)
        {
            this.evt = evt;
            return this;
        }
 
        private static void Main(string[] args)
        {
            new DeferredObjectSample(5).Done(() =>
            {
                Console.WriteLine("작업이 끝나부렀어!");
            });
        }
    }

<

p>

닷넷은 이벤트 프로그래밍이 지원되다 보니, 람다식으로 작성했다. 익명함수. 자바에서는 익명 클래스가 있다면, 닷넷은 익명 함수가 있다고 보면 된다.

각기 장단점이 있는데, 그것은 범주에 벗어나므로 패스.

이 방식에 대한 자세한 설명은 자바편을 참조하기 바란다. 자바편과 토시하나 안틀리고 똑같은 방식으로 프로그래밍 했다.

여담으로 4.5 에서 비동기 개발이 지원되는데, 굳이 그거 없어도 지연된 객체 작성하는데 문제 없으므로 패스하도록 하겠다.

composite / 2013년 9월 16일 / 미분류 / 0 Comments