Nyno: n8n과 유사한 기능을 제공하는, YAML 기반의 고성능 워크플로우 엔진

Nyno 소개

Nyno는 "Nine", "YAML", "No-code", "Automation"의 약자로, 개발자가 선호하는 프로그래밍 언어(Python, PHP, JavaScript, Ruby)를 사용하여 고성능 자동화 워크플로우를 구축할 수 있게 해주는 오픈소스 엔진입니다. 기존의 워크플로우 툴들이 GUI 중심의 노코드(No-Code) 방식에 치중했다면, Nyno는 YAML 파일을 통한 직관적인 정의와 TCP 기반의 고속 통신을 결합하여 개발 친화적인 환경을 제공합니다.

최근 n8n과 같은 워크플로우 자동화 도구가 큰 인기를 끌고 있지만, 라이선스 제약이나 GUI 기반의 복잡성, 그리고 단일 언어(주로 Node.js) 런타임의 한계로 인해 대규모 상용 서비스나 고성능이 요구되는 백엔드 로직에 통합하기 어려운 경우가 있었습니다. Nyno는 이러한 문제를 해결하기 위해 Apache 2.0 라이선스로 완전히 개방되어 있으며, 각 언어별로 독립된 워크 프로세스를 생성하여 CPU 코어를 최대한 활용하는 아키텍처를 채택했습니다.

Nyno는 대표적인 워크플로우 자동화 도구인 n8n과 자주 비교되지만, 기술적 접근 방식과 타겟 사용자층에서 뚜렷한 차이가 있습니다. 먼저, n8n은 드래그 앤 드롭 방식의 GUI 에디터가 핵심이지만, Nyno는 사람이 읽기 쉬운 YAML 파일(.nyno) 로 로직을 정의합니다. 이는 Git을 통한 버전 관리와 코드 리뷰(Code Review)가 필수적인 개발 팀에게 큰 장점입니다.

또한, n8n은 일반적으로 Node.js 단일 프로세스 위에서 동작하지만, Nyno는 멀티 프로세스 워커 엔진(Multi-process worker engines) 을 사용한다는 차이점도 있습니다. 개발 모드에서는 언어당 2개의 워커를, 프로덕션 모드에서는 CPU 코어당 3개의 워커를 생성하여 병렬 처리 성능을 극대화합니다.

특히, Nyro는 Javascript 뿐만 아니라, Python, PHP, Ruby와 같이 다양한 언어로 작성된 스크립트를 기본적으로 지원하며, 각 스크립트는 독립된 엔진에서 실행됩니다.

Nyno 3.0의 핵심: The Engine

Nyno 3.0의 핵심은 "The Engine"이라 불리는 런타임 환경입니다. 이 엔진은 TCP를 통해 각 컴포넌트와 통신하며, Python3, PHP8(+Swoole), JavaScript(+NodeJS), Ruby 환경을 모두 지원합니다.

또한, (가능한 경우) 멀티 프로세스 워커를 사용하여 요청을 처리합니다. 예를 들어 4코어 CPU 환경이라면 약 12개의 워커(Worker)를 미리 준비하여 워크플로우 단계를 즉시 실행할 수 있도록 합니다.

Nyno 설치 방법 (Docker/Podman)

가장 권장되는 설치 방법은 컨테이너를 사용하는 것입니다. 소스 코드를 클론하고 빌드 스크립트를 실행하면 됩니다.

# 1. 저장소 복제(Clone)
git clone https://github.com/empowerd-cms/nyno
cd nyno

# 2. 컨테이너 빌드 
# ; Podman 기준, Docker 사용 시 인자를 "docker"로 변경
./build-container.sh "podman"

# 3. 컨테이너 실행 (프로덕션 모드)
./run-container-prod.sh "podman"

위와 같이 컨테이너를 실행한 뒤, http://localhost:9057 에서 Nyno GUI를 확인할 수 있습니다.

컨테이너를 사용하지 않고 리눅스 기반의 호스트 머신에 직접 설치할 수도 있지만, Best.JS 등 의존성 설치가 복잡하므로 전문가 외에는 권장하지 않습니다.

워크플로우 확장 (Extensions)

Nyno의 강력함은 간단한 스크립트를 재사용 가능한 커맨드로 변환하는 데 있습니다. 각 함수는 argscontext를 인자로 받습니다.

먼저, 아래는 Python으로 작성한 Nyno 확장 예시(extensions/hello-py/command.py)입니다:

def hello_py(args, context):
    name = args[0] if args else "World"
    # 다음 단계를 위해 context에 결과 저장
    context["hello-py"] = f"Hello, {name} from Python!"
    return 0

동일한 내용을 Javascript로 작성하면 다음 예시 (extensions/hello/command.js)와 같습니다.

export function hello(args, context) {
    const name = args[0] || "World";
    context['hello'] = `Hello, ${name}!`;
    return 0;
}

Nyno 프로젝트 GitHub 저장소에서 동일한 확장RubyPHP로 작성한 코드도 함께 확인해볼 수 있습니다.


이렇게 작성한 확장(extension)은 .nyno 파일 내에서 일반 텍스트 커맨드처럼 호출할 수 있습니다:

# 워크플로우 예시
hello:
  - "${name}"

Nyno 실행 및 테스트 (TCP)

워크플로우 파일(flow.json 등)을 workflows-enabled/ 폴더에 저장하고 Nyno를 재시작하면, TCP를 통해 즉시 호출할 수 있습니다:

# TCP를 통한 워크플로우 호출 예시
tcpman localhost:9024/test_nyno 'c{"apiKey":"changeme"}' 'q{"name":"Alice"}'

라이선스

Nyno 프로젝트는 Apache-2.0 license로 배포되고 있습니다. 상업적 이용 및 수정, 배포가 자유로운 편입니다.

:github: Nyno Workflow 파일 실행을 위한 단독 런타임 (Standalone Runtime)

:github: Nyno 프로젝트 GitHub 저장소




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck:

1개의 좋아요