출처: http://tech.cygames.co.jp/archives/3241/
[GitHub - Cysharp / MicroBatchFramework]
.NET Core로 Windows/Mac/Linux 불문하고 크로스 플랫폼 애플리케이션 개발 환경으로 기능하게 된 C#이지만, 그리고 기능적으로 충분히 갖추어져 있는데, 조금 멋진 프레임 워크가 의외로 부족한 곳이 있다.
배치 명령 줄 응용 프로그램 라고하면 수수한 항목이지만, 그 때문에 기본 기능 이상의 지원이 없는 것 같다. 그러나 "C #의 가능성을 개척해 나간다'라는 이념으로 Cy #에서는 화려 · 수수를 불문하고, 현재 C#에서 부족한 것을 채워가는 것으로, C# 응용 프로그램을 만드는 환경에서 더 나은 것들을 되도록 하고 싶다고 생각한다.
이미 C# 명령 줄 인수의 분석 도구는 많이 있다. 하지만 원래 이런 도구를 사용할 때는 "명령 줄 인수의 해석”이 원하는 것은 아니라 "매개 변수 바인딩"을 하고 싶은 것이라고 일반적으로 생각한다. "MicroBatchFramework"는 웹 프레임워크 처럼 메소드를 호출 해주는 사양으로 했다.
class Program |
이것은`SampleApp.exe -name "foo"-repeat 5`로 호출 할 수 있는 사양이다.
// 인수에 별명이나 설명을 붙일수도 |
번거로운 일상적인 인수 해석에 고생하지 않고 메소드만 정의하면 나머지는 알아서 해준다.
.NET Core에서 만든 응용 프로그램은 런타임의 설치도 필요 없이 실행 파일을 Windows/Linux/Mac 용으로 만들 수 있다. 또한 CI에 대해서도 CircleCI 같은 컨테이너 기반의 CI를 다른 언어와 손색 없이 사용할 수 있다. 예를 들어 다음과 같은 기술로 실행 파일 생성을 CI에 맡길 수 있다.
version: 2.1
executors:
dotnet:
docker:
- image: mcr.microsoft.com/dotnet/core/sdk:2.2
environment:
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
NUGET_XMLDOC_MODE: skip
jobs:
publish-all:
executor: dotnet
steps:
- checkout
- run: dotnet publish -c Release --self-contained -r win-x64 -o ./MicroBatchSample/win-x64
- run: dotnet publish -c Release --self-contained -r linux-x64 -o ./MicroBatchSample/linux-x64
- run: dotnet publish -c Release --self-contained -r osx-x64 -o ./MicroBatchSample/osx-x64
- run: apt update && apt install zip -y
- run: zip -r MicroBatchSample.zip ./MicroBatchSample
- store_artifacts:
path: MicroBatchSample.zip
destination: MicroBatchSample.zip
workflows:
version: 2
publish:
jobs:
- publish-all
또한 배포에 관해서는 .NET Core 글로벌 도구는 NPM Global Tools와 같은 구조도 준비되어 있다. 예를 들어 다음과 같은 Ulid 생성을 위한 도구를 MicroBatchFramework 및 .NET Core 글로벌 도구로 만들어 보았다.
이러면 dotnet 명령을 사용할 수 있는 환경에 대한 CLI 도구의 배포, 관리가 용이하게 된다.
C# 과 배치는 꽤 궁합이 좋다고 생각한다. 가장 좋은 부분은 병렬 처리로 우선 실행 시간 걸릴 것 같은 것은 Parallel로 하는 것만으로 배치의 단점을 큰 폭으로 줄일 수 있다.
// 이것을 |
라는 것은 몰라도, 실제로 제품에 사용하는 일괄 처리는 복수 등의 산처럼 많은 것을 준비하는 것이 대부분이라고 생각한다. 이들을 하나의 콘솔 응용 프로그램에서 효율적으로 관리 할 수 있도록 클래스와 메소드를 정의하는 것만으로나눌 수 있는 시스템을 준비했다.
class Program |
이와 같이, 제 1 인수에 의해 실행하는 방법을 전환 할 수 있다.
그런데, 이렇게 만든 응용 프로그램은 컨테이너화 하는 것을 추천한다. .NET Core 라면 C#도 컨테이너화는 쉽다.
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS sdk
WORKDIR /workspace
COPY . .
RUN dotnet publish ./MicroBatchFrameworkSample.csproj -c Release -o /app
FROM mcr.microsoft.com/dotnet/core/runtime:2.2
COPY --from=sdk /app .
ENTRYPOINT ["dotnet", "MicroBatchFrameworkSample.dll"]
예를 들어 이것을 AWS ECR에 CircleCI에 올린다면 다음과 같은 구성이 될 것이다.
매우 간단하게 쓸 수 있고, C#이라고 해서 특별한 것은 없고, 일반적인 생태계를 타고있는 것이다.
이렇게 오른 컨테이너는, 뒤는 보통의 컨테이너이므로 원하는대로 실행하면 좋지만, 예를 들면 AWS Batch 를 사용하면 비교적 간단하게 실행도 스케줄링 (CloudWatch에서 이벤트 트리거를 설정 가능)도 정의 할 수 있다. 그리고 로그는 CloudWatch에서 표준 출력을 확인할 수 있다.
복잡한 워크 플로우를 정의하려면 별도 Luigi 와 Apache Airflow 를 사용해야 할 것이다.
개발 시 등 일일이 명령을 치고 확인하는 것도 번거로울 수 있으므로 웹에서 호스팅 하는 기능을 붙였다. 시작으로`RunBatchEngineAsync` 대신`RunBatchEngineWebHosting`을 사용할 뿐이다.
public class Program |
이것은 Swagger에서 호스팅 되므로 실행 확인 등이 쉬워진다.
.NET Generic Host 상에 콘솔 응용 프로그램을 구축하는 것이 MicroBatchFramework의 새로움이다.
.NET Generic Host는 표준적인 구조로 로깅/구성 읽기/DI를 지원하고 있다. 따라서 구성 매핑, 로깅 등을 표준적인 작법으로 완벽하게 지원하고 있다.
// appconfig.json |
이것을 사용하는 프레임워크가 의외로 없다 (왜냐하면 .NET Generic Host 자체가 최근 생긴 구조이므로). 이것 역시 "현재 C#에 부족한 것을 채워간다 '라는 것이다.
C#에서도 의외로 CLI 도구를 쓰기 쉽다,라고 생각 해주면 기쁘다! 제대로 모든 플랫폼에서 움직이기 때문에 C#으로 CLI 쓰는 것은 매우 쉽다다. 또한 C#이라도 특별한 것은 없고 CircleCI과 Docker 등의 일반 생태계를 탈 수 있다는 점을 상기하면 더욱 기쁘다.
개인적으로는 서버리스 (FaaS)는 묶여버리므로 자유로운 응용 프로그램 개발이 되지 않기 때문에 별로 좋아하지 않는다. 인프라를 귀찮게 하고 싶지 않은 것은 사실이지만, 불필요한 SDK 로컬 개발의 에뮬레이터와 런타임에서 시작 지연 등 단점이 많다고 느끼고 있다.
이상은 간단한 콘솔 응용 프로그램으로 쓰고 컨테이너화 하여 이것이 인프라를 신경 쓰지 않고 움직여 준다는 것이며, 그리고 이 안에서 내가 응용 프로그램 개발자로서 무엇보다 우선하고 싶은 것이 "간단한 콘솔 응용 프로그램 "일 것. 인프라면에서는 AWS Batch 같은 풀 관리 할 수도 있고 조금 학습도 필요하지만 관리 Kubernetes이 주요 클라우드 서비스에서 사용할 수 있으며, 이상적인 이미지에 가까워지고 있는 인상이 있다.
FaaS에 관해서는 FaaS이므로 간단하게 실현 될 수 있는 것 이상은 하고 싶지 않으며, 그렇지 않은 방식에 대한 MicroBatchFramework가 도움이 될 수 있다면 라고 생각하고 있기 때문에, 꼭 시험하기 바란다!
또한 Cy#에서는 이러한 차세대 C#의 연구를 ".NET Core ' 와 'Unity '를 주축으로 하고 있다.
참고
[일어] True Cloud Native Batch Workflow for .NET with MicroBatchFramework
https://www.slideshare.net/neuecc/true-cloud-native-batch-workflow-for-net-with-microbatchframework