MSA(Micro Service Architecture) 대한 관심이 날로 높아지고 있는 가운데, Chris Richardson 2015 5 19일에 오픈소스 웹서버인 nginx blog 올린 MSA관련 Article 정리해 보고자 합니다. 전체 7가지 에피소드로 구성되어 있습니다. 그 첫번째 이야기입니다. (www.nginx.com/blog/introduction-to-microservices)


<Introduction to Microservices>

Nginx Plus(오픈소스 웹서버 nginx 이용하여 Enterprise Version으로 개발한 버전) 사용하여 microservice 구현하는 article information으로 이루어진 E-Book Microservices: From Design to Deployment 다운로드 받을 있다.


Microservices article, blog, 소셜 미디어에서의 토론, 컨퍼런스 설명회 등을 통해서 오늘날 많은 주목을 받고 있다. Microservices 가트너의 하이퍼 사이클 상에서 inflated expectation peak 지점을 향해 빠르게 진입하고 있다. 동시에 소프트웨어 커뮤니티 상에서는 Microservices 전혀 새로운 것이 아니라는 시큰둥한 반응도 있다. Microservices 반대론자들은 단지 SOA 다른 이름에 불과하다고 불평하기도 한다. 그러나, 옹호론자이건 회의론자이건 간에 Microservice Architecture Pattern 특히 agile 개발 방법론과 복잡한 enterprise application delivery하는 경우에 굉장한 이점을 가지고 있다.


블로그에서 먼저 microservices design하고 building, deploying하는 7가지 article 통해, microservices 대한 접근법과 전통적인 Monolithic Architecture Pattern Microservices Architecture Pattern 어떻게 다른지 배울 것이다.


7가지 시리즈에서는 microservices architecture 다양한 요소들을 설명할 것이다. Microservices Architecture Pattern 여러분의 프로젝트에 적합한지 아닌지와 상관없이 MSA 장단점에 대해서, MSA 어떻게 적용할 있는지를 배울 것이다.


먼저 첫번째로 Microservice 사용해야 하는지를 살펴보자.


Building Monolithic Applications (통짜 Application 개발)


Uber Hailo 같은 새로운 택시 호출 서비스 브랜드를 구축하고자 하는 경우를 생각해 보자. 사전 미팅을 통해 요구사항들을 수집한 후에, 수동으로 신규 프로젝트를 생성하거나 Rails Spring Boot, Play, Maven 통해서 자동으로 신규 프로젝트를 생성할 것이다. Application 다음 그림에서 보는 것처럼 6각형의 모듈 아키텍처를 가지고 있다.


사용자 삽입 이미지

Application Core에는 서비스, 도메인 오브젝트, 이벤트를 정의하고 있는 모듈로 구현된 비즈니스 로직이 있다. Core 주변에는 외부 세상과 연동할 있는 adapter들이 있다. 예를 들어 adapter 중에는 database 연결할 있는 adapter, 메시지를 처리할 있는 message 컴포넌트 adapter, API 제공하거나 UI 구현한 Web 컴포넌트들과 연동하는 adapter들이 있다.


논리적으로는 모듈화된 아키텍처이지만, Application 하나(monolith) 패키지되어 배포된다. 실제 포맷은 application 개발언어나 framework 달려 있다. 예를 들어 많은 Java Application들은 WAR 파일로 패키지되고, Tomcat이나 Jetty 같은 Application Server 배포된다. 다른 Java Application들은 독립적으로 실행가능한 JAR파일로 패키지된다. 유사하게 Rails Node.js Application들은 디렉토리 계층 구조(directory hierarchy) 패키지된다.


이런 형태로 개발된 Application 거의 대부분이다. 왜냐하면 하나의 Application 개발하는데 특화된 IDE 다른 Tool 이용하여 간단하게 개발할 있기 때문이다. 이러한 Application들은 또한 테스트하는 것도 간단하다. 간단히 Application 실행하여 End-to-End 테스트를 있다. 그리고 Selenium 이용하여 UI 테스트도 있다. Monolithic Application(하나로 만들어진 Application) 또한 간단하게 배포할 있다. 단순히 Application 복사하여 Server 옮기기만 하면 된다. 또한 로드밸런서 뒤에 Application 복사하여 여러 개를 실행함으로 Application 확장할 수도 있다. 프로젝트 초창기에는 동작할 것이다.

받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/745

(Chapter 3) 17. Actions

Spark 2016/03/21 17:15 용비

그동안 서로간의 변형을 통해서 어떻게 RDD 생성하는지를 알아보았다. 하지만, 어떤 경우에는 Dataset 가지고 직접적으로 어떤 일을 하고 싶을 수도 있다. Action RDD operation 번째 형태이다. Action driver program 마지막 값을 되돌려 주거나 외부 storage system 데이터를 쓰는 작업을 수행한다. Action RDD 호출하는 곳에서 필요로 하는 변형에 대해서 평가하기 때문에 실제적인 ouput 만들어낼 필요가 있다.


앞의 섹션의 log example에서 계속해서 살펴보자면 badLinesRDD 대해 어떤 정보를 출력하고 싶을 수도 있다. 그렇게 하기 위해서는 2가지 action 사용할 있다. count() 숫자를 값을 리턴하고, take() RDD element collection 리턴한다. 샘플코드는 3-15, 3-17에서 있다.


Example 3-15. Python error count using actions

print "Input had " + badLinesRDD.count() + " concerning lines"

print "Here are 10 examples: "

for line in badLinesRDD.take(10):

     print line


Example 3-16. Scala rror count using actions

println("Input had " + badLinesRDD.count() + " concerning lines")

println("Here are 10 examples:")

badLinesRDD.take(10).foreach(println)


Example 3-17. Java error count using actions

System.out.println("Input had " + badLinesRDD.count() + " concerning lines")

System.out.println("Here are 10 examples:")

for (String line : badLinesRDD.take(10)) {

     System.out.println(line);

}


위의 예제에서, driver program에서 작은 숫자의 RDD element 추출하기 위해서 take() 사용했다. Driver 정보를 출력하기 위해서 반복하여 출력했다. RDD 전체 RDD 추출하기 위해서 collect() 함수를 가지고 있다. 만약 프로그램 필터에서 RDD 아주 작은 크기로 줄여서 내부적으로 다루고자 하는 경우에 유용하게 사용할 있다. 다만, 전체 dataset collect() 사용하여 하나의 machine 메모리 크기에 적합해야 한다는 것을 유념해야 한다. 따라서 collect() large dataset 대상으로는 사용하지 않아야 한다.


대부분의 경우, RDD driver 직접적으로 collect()함수를 사용하여 데이터를 추출할 없다. 왜냐하면 dataset 너무 크기 때문이다. 이러한 경우에는 HDFS Amazon S3 같은 분산 저장환경에 데이터를 쓰는 경우가 일반적이다. 또한 saveAsTextFile() action, saveAsSequenceFile()이나 다양한 내장된 형태로 다른 많은 action 사용하여 RDD 내용을 저장할 있다. 데이터를 추출하는 다른 option 대해서는 Chapter 5에서 다룰 것이다.


새로운 action 매번 호출할 때마다 전체 RDD " 처음부터"(from scratch) 계산되어야 한다는 것을 아는 것이 중요하다. 이러한 비효율성을 피하기 위해서 44페이지에서 "Persistence (Caching)"으로 다루는 중간 결과를 유지할 있다.

받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/743

Getting Started

1) Prerequisites


Akka 컴퓨터에 Java 8 이상 버전이 설치되어 있어야 한다.

Typesafe(www.typesafe.com) Akka 상용버전을 제공한다. 그리고 Java 8 업데이트 없는 프로젝트를 위해서 Java 6 이용할 있도록 Reactive Platform 일부로써 Scala Play 같은 관련된 프로젝트를 지원한다. 또한 상용 버전에서는 다양한 기능들과 라이브러리들을 제공한다.


2) Getting Started Guides and Template Projects


Akka 배울 있는 가장 좋은 방법은 Typesafe Activator(www.typesafe.com/platform/getstarted) 다운로드 받아서 Akka Template Project 중에 하나를 테스트해 보는 것이다.


3) Download


Akka 다운로드 받을 있는 방법은 여러 가지가 있다. Typesafe Platform 일부분으로 Akka 다운로드 받을 있다. (위에서 언급된 방법이다.) 모든 모듈이 포함되어 있는 전체 배포 버전을 다운로드 받을 수도 있다. Maven이나 SBT(Simple Build Tool) 같은 빌드 툴을 사용하여 Akka Maven Repository로부터 의존성 있는 모듈들을 다운로드 받을 수도 있다.


4) Modules


Akka 굉장히 모듈화가 되어 있다. 서로 다른 기능들을 포함하고 있는 여러 개의 JAR 구성되어 있다.

  • Akka-actor : Classic Actors, Typed Actors, IO Actor etc.
  • Akka-agent : Agents, Scala STM
  • Akka-camel : Apache Camel integration
  • Akka-cluster : Cluster membership management, elastic routers
  • Akka-osgi : OSGi container에서 Akka 사용하는 utilities
  • Akka-osgi-aries : Aries blueprint for provisioning actor systems
  • Akka-remote : Remote Actors
  • Akka-slf4j : SLF4J Logger (event bus listener)
  • Akka-testkit : Toolkit for testing Actor systems

게다가 이렇게 stable module들이 여러 개가 있기 때문에, 각자의 방식으로는 stable core이지만 여전히 "experimental" 마킹되어 있다. 그것은 의도한대로 기능을 수행하지만, API code freezing할만큼 충분히 굳건하지 않다는 것을 의미한다. Mailing list 이러한 모듈들에 대한 피드백을 제공함으로 도움을 있다.

  • Akka-contrib : core module 옮겨질 수도 있는 공헌에 대한 모음. 자세한 내용은 External Contributions(9) 참고하라.

실제 JAR 파일 명은 예를 들면 다음과 같다.

akka-actor_2.11-2.4.0.jar (다른 모듈들도 유사하다.)


5) Using a release distribution


http://akka.io/downloads 에서 필요한 버전을 다운로드 받고, 압축해제 하면 된다.


6) Using a snapshot version


Akka 밤마다 하는 snapshot http://repo.akka.io/snapshots/ 있고, SNAPSHOT timestamp 버전이 매겨져 있다. Timestamp 버전을 선택하여 작업을 하고, 언제 새로운 버전으로 업데이트하는지를 결정할 있다.


Warning : 매일 밤마다 배포되거나 milestone release(전환점이 되는 배포) Akka SNAPSHOT 사용하는 것은  무엇을 하고 있는지를 알지 못하면 나중에 어려움에 처할 있다.


7) Using a build tool


Akka Maven repositories 지원하는 build tool들을 사용할 있다.


8) Maven Repositories


Akka version 2.1-M2 이후 버전 : https://repo1.maven.org/maven2/

이전 Akka version : http://repo.akka.io/releases/


9) Using Akka with Maven


Maven 이용하여 Akka 가장 간단하게 시작하는 방법은 Akka Main in Java라고 이름 붙여진 Typesafe Activator Tutorial check out하는 것이다.

(http://www.typesafe.com/activator/template/akka-sample-main-java)

Akka Maven Central 배포되어 있기 때문에 (2.1-M2 이후 버전) POM Akka dependencies 추가하는 것으로 충분하다. 예를 들어 akka-actor 대한 의존성은 다음과 같다.


<dependency>

<groupId>com.typesafe.akka</groupId>

<artifactId>akka-actor_2.11</artifactId>

<version>2.4.0</version>

</dependency>


Snapshot 버전에 대해서는 다음과 같은 repository 추가가 필요하다.


<repositories>

<repository>

<id>akka-snapshots</id>

<snapshots>

<enabled>true</enabled>

</snapshots>

<url>http://repo.akka.io/snapshots/</url>

</repository>

</repositories>


Note : Snapshot 버전에는 SNAPSHOT timestamp 버전이 포함되어 배포되어 있다.


10) Using Akka with SBT


SBT 사용하여 Akka 시작하는 가장 간단한 방법은 Akka/SBT Template 프로젝트를 check out하는 것이다.

SBT에서 Akka 사용하는 기본적인 부분을 요약하면 다음과 같다.

https://github.com/harrah/xsbt/wiki/Setup 지시대로 SBT 설치한다.

build.sbt file 다음과 같이 수정한다.


name := "My Project"

version := "1.0"

scalaVersion := "2.11.7"

libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.4.0"


Note : 위에 언급된 libraryDependencies SBT v0.12.x 이후에 특화된 부분이다. 이전 SBT 버전을 사용한다면 libraryDependencies 다음과 같다.


libraryDependencies += "com.typesafe.akka" % "akka-actor_2.11" % "2.4.0"


Snapshot 버전을 위해서는 다음 항목이 추가되어야 한다.


resolvers += "Akka Snapshot Repository" at "http://repo.akka.io/snapshots/"


11) Using Akka with Gradle


최소한 Gradle 1.4 이상 버전이 필요하다. Scala Plugin 사용하려면 다음과 같이 설정한다.


apply plugin: ’scala’

repositories {

mavenCentral()

}

dependencies {

compile ’org.scala-lang:scala-library:2.11.7’

}

tasks.withType(ScalaCompile) {

scalaCompileOptions.useAnt = false

}

dependencies {

compile group: ’com.typesafe.akka’, name: ’akka-actor_2.11’, version: ’2.4.0’

compile group: ’org.scala-lang’, name: ’scala-library’, version: ’2.11.7’

}

Snapshot 버전을 위해서는 다음 Repository 추가한다.

repositories {

mavenCentral()

maven {

url "http://repo.akka.io/snapshots/"

}

}


12) Using Akka with Eclipse


SBT 프로젝트를 만들고 Eclipse 프로젝트 생성을 위해서 sbteclipse(https://github.com/typesafehub/sbteclipse) 사용한다.


13) Using Akka with IntelliJ IDEA


SBT 프로젝트를 만들고 IntelliJ IDEA 프로젝트 생성을 위해서 sbt-idea(https://github.com/mpeltonen/sbt-idea) 사용한다.


14) Using Akka with NetBeans


SBT 프로젝트를 만들고 NetBeans 프로젝트 생성을 위해서 nbsbt(https://github.com/dcaoyuan/nbsbt) 사용한다.

IDE에서 일반적인 scala 지원을 위해서 nbscala(https://github.com/dcaoyuan/nbscala) 사용할 수도 있다.


15) -optimize Scala compiler flag 사용하지 말라


Warning : Akka -optimize Scala compiler flag 컴파일하거나 테스트하면 된다. 이상 동작하는 경우가 있음이 리포트 되었다.


16) Build from sources


Akka Git 사용하여 Github 호스팅되어 있다.

다음 repository에서 clone 있다. https://github.com/akka/akka

Building Akka(10)에서 계속해서 관련 내용이 정리되어 있다.


17) Need Help?


질문이 있다면, Akka Mailing List에서 도움을 얻을 있다. https://groups.google.com/forum/#!forum/akka-user

상용 버전 지원에 대해서도 질문할 있다. https://www.typesafe.com/

Akka community 참여하는 것에 대해서 감사를 드린다.

TAG
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/739