Polyglot 마이크로서비스 구축: Golang, Rust, Node.js로 연합 구독 구현하기
2025-03-07 06:14:28Polyglot 마이크로서비스: Federated Subscriptions 소개
오늘날의 IT 환경은 점점 더 복잡하게 변하고 있으며, 다양한 프로그래밍 언어와 프레임워크를 활용해 이질적인 시스템을 통합하는 것이 중요해졌습니다. 이 글에서는 Golang, Rust, Node.js를 이용한 Polyglot 마이크로서비스 환경에서의 Federated Subscriptions (연합 구독) 구현 방법에 대해 살펴보겠습니다. 특히 GraphQL을 활용한 Nest.js 기반의 Player 서비스 구축 과정을 자세히 설명합니다.
목차
- Polyglot 마이크로서비스란?
- Node.js를 이용한 Player 서브 그래프 구축
- GraphQL Subscriptions 설정
- Entity 및 Resolver 설정
- 전체 마이크로서비스와의 통합
- Hive Gateway를 통한 최종 통합
- 결론 및 추가 자료
Polyglot 마이크로서비스란?
Polyglot 마이크로서비스는 각 서비스가 독립적인 언어와 환경에서 운영될 수 있도록 하여 전체 시스템의 유연성과 확장성을 높이는 아키텍처 방식입니다. 이 방식은 특정 언어의 한계에 구속받지 않으며, 각 언어의 강점을 극대화할 수 있습니다. 우리가 다룰 예제에서는 Golang, Rust, Node.js를 사용하여 서로 다른 역할을 하는 세 개의 서비스를 구축합니다.
Node.js를 이용한 Player 서브 그래프 구축
이번 포스트에서는 Node.js 기반의 Player 서비스에 집중합니다. 이를 위해 Nest.js를 사용하여 GraphQL 서브 그래프를 설정합니다. 이 과정에서는 다음과 같은 명령어를 통해 초기 설정을 수행합니다:
nx add @nx/nest
nx g @nx/nest:app apps/player-service
GraphQL Subscriptions 설정
GraphQL Subscriptions는 클라이언트가 실시간으로 데이터를 수신할 수 있도록 해줍니다. 여기서는 GraphQL Yoga 서버를 사용하여 이를 구현합니다. Apollo의 경우 유료 기능이지만, GraphQL Yoga를 통해 무료로 연합 구독을 설정할 수 있습니다.
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { YogaFederationDriver, YogaFederationDriverConfig } from '@graphql-yoga/nestjs-federation';
@Module({
imports: [
GraphQLModule.forRoot<YogaFederationDriverConfig>({
driver: YogaFederationDriver,
autoSchemaFile: {
federation: {
version: 2,
importUrl: 'https://specs.apollo.dev/federation/v2.4',
},
},
subscriptions: true,
}),
],
})
export class AppModule {}
Entity 및 Resolver 설정
Player 서비스를 설정하기 위해, 우리는 엔티티 Player와 그에 대한 Resolver를 정의합니다. 이를 통해 특정 구역의 플레이어 데이터를 구독할 수 있게 됩니다.
import { Args, Mutation, Resolver, Subscription } from '@nestjs/graphql';
import { Player } from './player.model';
import { createPubSub, Repeater } from 'graphql-yoga';
const pubSub = createPubSub();
@Resolver(() => Player)
export class PlayerResolver {
@Mutation(() => Player)
enterArea(@Args('playerId') playerId: string, @Args('area') area: string): Player {
pubSub.publish(`${area}`, { id: playerId });
return { id: playerId };
}
@Subscription(() => Player, {
nullable: true,
resolve: (value: Player) => value,
})
nearbyPlayers(@Args('area') area: string): Repeater<Player> {
return pubSub.subscribe(`${area}`);
}
}
전체 마이크로서비스와의 통합
이제 Player 서비스를 다른 마이크로서비스와 결합하여 더욱 복합적인 시스템을 구축할 차례입니다. 이를 위해서는 적절한 연합 스키마 설계가 필요하며, 각 마이크로서비스의 역할과 데이터를 명확히 구분해야 합니다.
Hive Gateway를 통한 최종 통합
최종적으로, Hive Gateway를 사용하여 각 서비스의 GraphQL API를 통합합니다. Hive Gateway는 무료이며, 복잡한 라우팅을 지원하여 각 서비스의 기능을 중앙에서 쉽게 조율할 수 있도록 합니다.
결론 및 추가 자료
이번 글에서는 Polyglot 환경에서의 마이크로서비스 구축과 연합 구독 구현에 대해 살펴보았습니다. 이러한 통합 방법은 여러 언어의 강점을 활용할 수 있는 강력한 솔루션입니다. 다음 포스트에서는 Hive Gateway를 통해 모든 서비스를 통합하는 방법을 더 자세히 다룰 것입니다.