RabbitMQの統合
NestJSマイクロサービス間の堅牢な非同期通信を実現するメッセージブローカーとしてRabbitMQを統合します。
「RabbitMQの統合」はCoddyKit上の無料NestJS Enterprise Backend APIsレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはNestJS Enterprise Backend APIs学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 NestJS Enterprise Backend APIsコースには全3レッスンが含まれています。
このレッスンの一部はまだ翻訳されておらず、英語で表示されています。
Meet RabbitMQ
Welcome to integrating RabbitMQ with NestJS! RabbitMQ is a popular message broker that helps different parts of your application communicate reliably.
Think of it as a post office for your application's messages. Services can drop off messages, and other services can pick them up when they're ready.
Why Use Message Queues?
In a microservices architecture, direct communication can lead to tight coupling. Message queues solve this by enabling asynchronous communication.
- Decoupling: Services don't need to know about each other directly.
- Resilience: If a service is down, messages wait in the queue.
- Scalability: Easily add more consumers to process messages faster.
- Load Balancing: Distribute tasks among multiple workers.
Key RabbitMQ Concepts
Let's quickly define the essential terms:
- Producer: An application that sends messages to the queue.
- Consumer: An application that receives and processes messages from the queue.
- Queue: A buffer that stores messages. Messages wait here until a consumer picks them up.
- Message: The data payload sent by a producer and consumed by a consumer.
NestJS & RabbitMQ Transporter
NestJS provides excellent support for microservices using various transporters. RabbitMQ is one such transporter, enabling robust inter-service communication.
You'll configure your NestJS applications as either a client (producer) that sends messages, or a microservice (consumer) that listens for and processes messages.
Running RabbitMQ Locally
Before integrating, you need a running RabbitMQ instance. The easiest way for local development is using Docker:
docker run -d --hostname my-rabbit --name some-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3-managementThis command starts a RabbitMQ server on port 5672 (for AMQP) and 15672 (for management UI).
Producer App Entry Point
This main.ts file is the entry point for a NestJS application configured to act as a producer. It starts an HTTP server that can trigger message sending.
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
console.log('Producer HTTP Gateway running on port 3000');
}
bootstrap();Producer Client Configuration
To send messages, the producer NestJS app needs a client proxy. Configure the ClientsModule in your AppModule to define this RabbitMQ client.
The name ('MESSAGE_SERVICE') is a token used for dependency injection.
import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { AppController } from './app.controller';
@Module({
imports: [
ClientsModule.register([
{
name: 'MESSAGE_SERVICE',
transport: Transport.RMQ,
options: {
urls: ['amqp://localhost:5672'],
queue: 'my_nest_queue',
queueOptions: { durable: false },
},
},
]),
],
controllers: [AppController],
})
export class AppModule {}Sending an Event Message
Now, inject the configured ClientProxy into a controller or service. Use client.emit() to send an event message to the RabbitMQ queue.
emit() is used for event-based communication where no response is expected.
import { Controller, Get, Inject } from '@nestjs/common';
import { ClientProxy } from '@nestjs/microservices';
@Controller('events')
export class AppController {
constructor(@Inject('MESSAGE_SERVICE') private client: ClientProxy) {}
@Get('publish')
async publishEvent() {
const payload = { id: 101, text: 'Hello from producer!' };
this.client.emit('message_event', payload);
return 'Event sent to RabbitMQ!';
}
}Consumer Microservice Entry
This main.ts bootstraps a NestJS application as a microservice. It listens for messages from the specified RabbitMQ queue, acting as a consumer.
Notice NestFactory.createMicroservice instead of create.
import { NestFactory } from '@nestjs/core';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.createMicroservice<MicroserviceOptions>(
AppModule,
{
transport: Transport.RMQ,
options: {
urls: ['amqp://localhost:5672'],
queue: 'my_nest_queue',
queueOptions: { durable: false },
},
},
);
await app.listen();
console.log('Consumer Microservice is listening on RabbitMQ queue!');
}
bootstrap();Processing Incoming Messages
In your consumer service, use the @MessagePattern() decorator to define methods that will handle specific messages from the queue.
It's crucial to acknowledge (ack()) messages to inform RabbitMQ they've been processed successfully.
import { Injectable } from '@nestjs/common';
import { MessagePattern, RmqContext, Ctx, Payload } from '@nestjs/microservices';
@Injectable()
export class AppService {
@MessagePattern('message_event')
handleMessage(@Payload() data: any, @Ctx() context: RmqContext) {
console.log('Received message:', data);
const channel = context.getChannelRef();
const originalMsg = context.getMessage();
channel.ack(originalMsg);
return { status: 'success', data: data };
}
}RabbitMQ Quick Check
You've learned how to set up producers and consumers. Let's test your understanding!
Recap: RMQ Integration
You've successfully learned the basics of integrating RabbitMQ with NestJS!
- RabbitMQ enables asynchronous, decoupled communication.
- NestJS uses transporters like RabbitMQ for microservices.
- You configured a NestJS app as a producer (client) to send messages using
client.emit(). - You configured another NestJS app as a consumer (microservice) to receive messages using
@MessagePattern(). - Remember to acknowledge messages for reliability.
This is a powerful pattern for building scalable and robust microservices!
よくある質問
「RabbitMQの統合」レッスンは無料ですか?
はい。「RabbitMQの統合」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、NestJS Enterprise Backend APIsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 NestJS Enterprise Backend APIsコースには全3レッスンが含まれています。
「RabbitMQの統合」で何を学びますか?
NestJSマイクロサービス間の堅牢な非同期通信を実現するメッセージブローカーとしてRabbitMQを統合します。 ブラウザで直接実行するハンズオンコードでNestJS Enterprise Backend APIsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
NestJS Enterprise Backend APIsを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのNestJS Enterprise Backend APIsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。
「RabbitMQの統合」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このNestJS Enterprise Backend APIsレッスンでコードを書いて実行できますか?
はい。すべてのNestJS Enterprise Backend APIsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- NestJSマイクロサービスの概要
- RabbitMQの統合
- サービス間通信