'Exceptional'에 해당되는 글 2건

  1. 2017.08.17 Mail 오픈 소스 검토
  2. 2017.07.17 모니터링 시스템 시작

메일 발송 서비스를 개발하기 위해서 검토를 진행하였습니다.

메일 발송과 같은 도메인(비지니스) 로직이 없고 복잡한 기술 중심의 기능이 아니면 우선순위가 낮아 일단 안전하게 실행만 된다는 생각으로 별도의 검토 없이 개발을 진행했습니다. 최근에는 마음의 여유가 생겨 우선순위가 낮은 부분에 대해서도 의미를 부여하고 부여된 의미만큼 결과에 만족하는 긍정적인 사이클이 형성되고 있는 것 같습니다.

기존에 해왔던 방식은 System.Net.Mail.SmtpClient을 사용하던 방식입니다. 사용방식이 어려운건 아니라 그냥 사용해도 무방합니다. 다른 방법이나 아이디어를 얻기 위해서 오픈 소스를 검색해보았습니다.


1번째로 살펴볼 FluentEmail의 사용하는 코드는 아래와 같습니다.

 // Using Razor templating package

Email.DefaultRenderer = new RazorRenderer();

var template = "Dear @Model.Name, You are totally @Model.Compliment.";

var email = Email
    .From("bob@hotmail.com")
    .To("somedude@gmail.com")
    .Subject("woo nuget")
    .UsingTemplate(template, new { Name = "Luke", Compliment = "Awesome" });

=> 사용이 편리해 보이지만 String.Format이나 $"{}"을 사용하면 동일하게 템플릿이 작성되는거 같아 잔기술 느낌이 납니다.

=> Fluent라는 이름이 붙으면 Method Chaining(.을 붙여서 연결하는 것)과 기존 클래스들을 랩핑하는 느낌인데 코드의 양이 엄청 줄거나 사용을 쉽게 하는 것외에 다른 핵심적인 내용이 없어 보입니다.


2번째로 살펴볼 오픈 소스는 PreMailer.Net 입니다. stylesheets에 선언된 내용이 inline style attribute로 추가해주는 라이브러리입니다. 일단 제가 원하는 것은 메일 발송이였기 때문에 거리는 있지만 이메일 양식과 관련된 내용이라 좀 더 살펴보았습니다.


[TestMethod]

public void MoveCssInline_RespectExistingStyleElement()

{

string input = "<html><head><style type=\"text/css\">.test { height: 100px; }</style></head><body><div class=\"test\" style=\"width: 100px;\">test</div></body></html>";


var premailedOutput = PreMailer.MoveCssInline(input, false);


Assert.IsTrue(premailedOutput.Html.Contains("<div class=\"test\" style=\"height: 100px;width: 100px"));

}

=> 해당 라이브러리의 기본 기능은 head 사이에 style이 div 태그 사이에 style에 적용되는 것입니다. 그 외에도 HTML태그에 대한 대문자 -> 소문자로 변경해준다던지 유효하지 않은 문법도 확인 할 수 있습니다. 그렇다면 이런 라이브러리는 왜 필요한 것일까요? 앞에 기능을 중심으로 생각해보면 외부 링크로 설정된 스타일이 포함된 경우 메일로 전송을 하게 되면 보안상(메일을 열었을 때 외부 링크에서 스타일을 받아와야 하므로) 좋지 않기 때문으로 추측됩니다.


3번째로 살펴볼 오픈 소스는 MailKit 입니다. 기존에 SmtpClient을 사용한 것이 아니라 RFC(표준)를 준수하며 크로스 플랫폼에서 사용이 가능하도록 구현한 라이브러리입니다. .NET에서 크로스 플랫폼 이야기가 나오면 .NET Core를 떠올리게 되는데 SmtpClient은 .NET Core에 포함되어 있지 않기 때문에 리눅스 환경에서는 MailKit을 사용하면 메일 발송을 할 수가 있습니다. 

MailKit에는 추가적으로 더 의미가 있는 점이 있는데 바로 성능이 우수하다는 것입니다. 성능이 우수한 이유를 PIPELINING 기술을 통해서 설명하고 있습니다.

https://tools.ietf.org/html/rfc2920


아래는 그림은 HTTP PIPELINING에 해당하는 그림으로 해당 용어에 대한 개념을 이해하기가 더 쉽습니다.


=> 왼쪽 그림은 요청에 대한 응답이 오기 전까지 다른 요청을 할 수 없는 구조이지만 오른쪽 그림은 요청과 응답에 대한 병렬처리가 가능하다는 것이 핵심입니다. HTTP PIPELINING은 HTTP 1.1부터 지원이 된다고 하며 자세한 내용은 아래 위키를 참고 하시면 됩니다.

https://en.wikipedia.org/wiki/HTTP_pipelining


결론적으로 크로스플랫폼 지원과 성능이 우수한 MailKit 을 사용하려고 하였는데 StackExchange.Exceptional에 예외 로그를 저장하면서 메일을 전송해주는 부분이 함께 있어 해당 부분을 사용하기로 결정하였습니다. 해당 부분은 예외 로그에 대한 메일 전송이고 메일 발송 서비스만을 위해서는 MailKit과 PreMailer.NET까지 고려해서 차후에 개발해볼 예정입니다.

P.S : 7월22일에 처음 썼던 글인데 게으름이 생겨 이제야 마무리를 했네요 ^^;


Posted by resisa
,

서비스 시점이 다가오면서 열심히 개발한 서비스에 대한 관리는 어떻게 할것인가에 대한 고민이 생겼습니다. 일단 어떤 항목을 우선순위로 관리를 할 것인지에 대한 고민부터 시작하였습니다. Feedly에서 아래 글을 보게 되어 참고하였습니다.


https://indexoutofrange.com/Choosing-centralized-logging-and-monitoring-system/

=> 대부분 상용 서비스(Saas)를 비교하였고 글쓴이의 요구사항에 맞춰서 선택기준을 제시하고 있습니다.


Google Analytics vs. ELK +Graphite/Grafana vs. NewRelic vs. Retrace vs. Application Insights vs. Raygun vs. Datadog


저의 요구사항 우선순위는 아래와 같습니다.

1. 커스터마이징

2. 중앙에서 로그 관리

3. 알람

4. 서버의 성능 카운터

5. 실시간 모니터링

=> 아무래도 모니터링과 관련된 부분이다 보니 성능보다는 기능이나 수정이 용이한지가 더 중요하게 생각됩니다.


그러던 중에 아래의 OneTrueError라는 오픈 소스를 알게 되었고 대부분 제가 생각하는 요구사항을 만족하였습니다.


https://www.codeproject.com/Articles/1126297/OneTrueError-Automated-exception-handling


기술검토를 하기 전에 혹시 더 좋은 건 없나 찾아보던 중에 Opserver라는 Stack Exchange에서 사용하는 모니터링 시스템을 보게 되었습니다.


https://github.com/opserver/Opserver


 Opserver is a monitoring system by the team at Stack Exchange, home of Stack Overflow. It is a tool for monitoring:

  • Servers/Switches & anything supported by Bosun, Orion, or direct WMI monitoring
  • SQL Clusters & Single Instances
  • Redis
  • Elasticsearch
  • Exception Logs (from StackExchange.Exceptional)
  • HAproxy
  • PagerDuty
  • CloudFlare DNS
  • ... and more as we go

=> DB 서버에 대한 모니터링도 제공해주고 차후에 적용할 Redis, HAProxy, Elasticsearch에 대한 모니터링 기능도 지원이 가능하며 .NET으로 만든 오픈소스라 커스터마이징도 유용할 것으로 보였습니다.


Opserver에서 사용한 오픈소스 리스트는 아래와 같습니다.

StackExchange.Redis by Marc Gravell

Dapper by Stack Exchange

JSON.Net by James Newton-King

MiniProfiler by Stack Exchange

StackExchange.Exceptional by Nick Craver

TeamCitySharp by Paul Stack

d3.js by Michael Bostock

ColorBrewer by Cynthia Brewer and Mark Harrower

HTML Query Plan by Justin Pealing

isotope by Metafizzy

jQuery by The jQuery Foundation

jQuery cookie plugin by Klaus Hartl

jQuery autocomplete by Jörn Zaefferer

prettify by Google

TableSorter by Christian Bach

Toastr by John Papa and Hans Fjällemark

=> 저희 프로젝트에서 사용하고 있는 오픈소스인 Dapper, StackExchange.Redis, JSON.NET 등등이 보이고 HTML Query Plan이 보이는 것으로 봐서는 SQL Server에서 제공해주는 쿼리 플랜까지 제공해주는 것으로 보입니다.

=> Exceptional을 통해서 DB에 로그 데이터를 쌓고 해당 로그를 화면에서 보여주는 방식입니다.


Opserver SQL탭에 대한 화면은 아래와 같습니다.


추가적으로 아래와 같은 기능이 필요할 것으로 보입니다.

1. WMI를 활용하여 프로세스 단위로 모니터링

2. 알람 => 실시간 모니터링이 가능하지만 계속 화면을 보고 있을수는 없으므로 중요한 내용에 대한 알람이 필요해보이는데 알람 기능은 없는 것으로 보입니다.

Opserver에서 참조 중인 StackExchange.Exceptional에 메일 발송 기능이 있습니다. 다만 CPU가 Warning, Critical 상태일 경우의 발송이 되는 것은 아니고 Exceptional을 통해서 로그를 남기는 부분에 대한 메일 발송 기능입니다. (2017-08-19)


검토 단계여서 기능 위주로 확인해보았으며 소스 분석을 통해서 구조나 추가 기능을 구현해보려고 합니다. 혹시 비슷한 고민을 하고 계시는 분들이 있으시다면 Opserver 한번 검토해보세요. ㅎㅎ

Posted by resisa
,