Khi user ΔΔng kΓ½ (register), hα» thα»ng tα»± Δα»ng push thΓ΄ng tin user lΓͺn RabbitMQ queue.
1. User POST /auth/register
β
2. Server tαΊ‘o user mα»i
β
3. Hash password vα»i bcrypt
β
4. LΖ°u user vΓ o database (in-memory)
β
5. π° PUSH DATA TO RABBITMQ
β
6. Generate JWT token
β
7. Return response to user
async register(registerDto: RegisterDto): Promise<AuthResponseDto> {
this.logger.log(`New user registration: ${registerDto.email}`);
// 1. Create user
const user = await this.usersService.create(
registerDto.email,
registerDto.username,
registerDto.password,
);
// 2. π° PUSH USER INFO TO RABBITMQ
try {
const exchange = this.configService.get<string>(
'rabbitmq.exchange.validateJson',
);
const routingKey = this.configService.get<string>(
'rabbitmq.routing.topicValidateJson',
);
await this.rabbitmqProducerService.publish(exchange, routingKey, {
event: 'user.registered',
data: {
id: user.id,
email: user.email,
username: user.username,
createdAt: user.createdAt,
},
timestamp: new Date(),
});
this.logger.log(`User registration sent to RabbitMQ: ${user.email}`);
} catch (error) {
this.logger.error(
`Failed to send registration to RabbitMQ: ${error.message}`,
);
// Continue even if RabbitMQ fails - khΓ΄ng block user registration
}
// 3. Generate JWT token and return
const payload = { sub: user.id, email: user.email, username: user.username };
const accessToken = this.jwtService.sign(payload);
return {
accessToken,
user: {
id: user.id,
email: user.email,
username: user.username,
},
};
}Khi user ΔΔng kΓ½, message Δược push lΓͺn RabbitMQ cΓ³ format:
{
"event": "user.registered",
"data": {
"id": "user_1729363200000_abc123",
"email": "user@example.com",
"username": "johndoe",
"createdAt": "2025-10-19T23:00:00.000Z"
},
"timestamp": "2025-10-19T23:00:00.000Z"
}| Field | Type | Description |
|---|---|---|
event |
string | Event type: "user.registered" |
data.id |
string | User ID (unique) |
data.email |
string | User email |
data.username |
string | Username |
data.createdAt |
Date | Account creation timestamp |
timestamp |
Date | Event timestamp |
RABBITMQ_URL=amqps://your-rabbitmq-url
RABBITMQ_EXCHANGE_VALIDATE_JSON=validateJSON
RABBITMQ_TOPIC_EXCHANGE_VALIDATE_JSON=topic_validateJSON
RABBITMQ_ROUTING_KEY_VALIDATE_JSON=validateJSON
RABBITMQ_TOPIC_ROUTING_KEY_VALIDATE_JSON=topic_validateJSON
RABBITMQ_QUEUE_VALIDATE_JSON=topic_validateJSONimport { registerAs } from '@nestjs/config';
export default registerAs('rabbitmq', () => ({
server: process.env.RABBITMQ_URL,
exchange: {
validateJson: process.env.RABBITMQ_EXCHANGE_VALIDATE_JSON,
topicValidateJson: process.env.RABBITMQ_TOPIC_EXCHANGE_VALIDATE_JSON,
},
routing: {
validateJson: process.env.RABBITMQ_ROUTING_KEY_VALIDATE_JSON,
topicValidateJson: process.env.RABBITMQ_TOPIC_ROUTING_KEY_VALIDATE_JSON,
},
queue: {
topicValidateJson: process.env.RABBITMQ_QUEUE_VALIDATE_JSON,
},
}));# 1. Start server
yarn start:dev
# 2. Register new user
curl -X POST http://localhost:4000/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "test@example.com",
"username": "testuser",
"password": "test123456"
}'
# 3. Check server logs - you should see:
# [AuthService] New user registration: test@example.com
# [RabbitmqProducerService] Message sent successfully
# [AuthService] User registration sent to RabbitMQ: test@example.com
# [RabbitmqConsumerService] Received message: {"event":"user.registered",...}Producer (Auth Service):
[AuthService] New user registration: test@example.com
[AuthService] User registration sent to RabbitMQ: test@example.com
RabbitMQ Producer:
[RabbitmqProducerService] Message sent successfully
Consumer:
[RabbitmqConsumerService] Received message: {
"event": "user.registered",
"data": {
"id": "user_xxx",
"email": "test@example.com",
"username": "testuser",
"createdAt": "2025-10-19T23:00:00.000Z"
},
"timestamp": "2025-10-19T23:00:00.000Z"
}
βββββββββββββββββββ
β Auth Service β
β (Producer) β
ββββββββββ¬βββββββββ
β
β publish()
β
βββββββββββββββββββββββββββββββ
β RabbitMQ Exchange β
β (validateJSON) β
ββββββββββ¬βββββββββββββββββββββ
β
β route to queue
β
βββββββββββββββββββββββββββββββ
β RabbitMQ Queue β
β (topic_validateJSON) β
ββββββββββ¬βββββββββββββββββββββ
β
β consume()
β
βββββββββββββββββββ
β Consumer β
β Service β
βββββββββββββββββββ
@Injectable()
export class RabbitmqProducerService {
private readonly logger = new Logger(RabbitmqProducerService.name);
async publish(
exchange: string,
routingKey: string,
payload: any,
): Promise<void> {
try {
const rabbitMqUrl = this.configService.get<string>('rabbitmq.server');
const connection = await amqp.connect(rabbitMqUrl);
const channel = await connection.createConfirmChannel();
await channel.assertExchange(exchange, 'direct', {
durable: true,
autoDelete: false,
});
const messageBuffer = Buffer.from(JSON.stringify(payload));
return new Promise((resolve, reject) => {
channel.publish(
'',
routingKey,
messageBuffer,
{ contentType: 'text/plain' },
(err) => {
if (err) {
this.logger.error(`Failed to send message: ${err.message}`);
reject(err);
} else {
this.logger.log('Message sent successfully');
resolve();
}
connection.close();
},
);
});
} catch (error) {
this.logger.error(`Error in publish: ${error.message}`);
throw error;
}
}
}Consumer tα»± Δα»ng lαΊ―ng nghe messages tα»« queue:
@Injectable()
export class RabbitmqConsumerService implements OnModuleInit {
async onModuleInit() {
await this.listen();
}
private async listen() {
this.connection = await amqp.connect(rabbitMqUrl);
this.channel = await this.connection.createChannel();
// Assert queue
await this.channel.assertQueue(topicRoutingKey, {
durable: true,
autoDelete: false,
exclusive: false,
});
// Bind queue to exchange
await this.channel.bindQueue(topicRoutingKey, routingKey, topicRoutingKey);
// Start consuming
this.channel.consume(
topicRoutingKey,
(message) => {
if (message) {
const content = message.content.toString();
this.logger.log(`Received message: ${content}`);
// Process the message here
}
},
{ noAck: true },
);
}
}1. User Registration Request:
POST /auth/register
{
"email": "john@example.com",
"username": "johndoe",
"password": "securepass123"
}2. Server Processes:
- β Validate input (email format, min length, etc.)
- β Check if email/username exists
- β Hash password with bcrypt
- β Create user record
- β Push to RabbitMQ
- β Generate JWT token
3. RabbitMQ Message:
{
"event": "user.registered",
"data": {
"id": "user_1729363200000_xyz789",
"email": "john@example.com",
"username": "johndoe",
"createdAt": "2025-10-19T23:00:00.000Z"
},
"timestamp": "2025-10-19T23:00:00.000Z"
}4. Consumer Receives:
[RabbitmqConsumerService] Consumer connected successfully
[RabbitmqConsumerService] Received message: {"event":"user.registered",...}
5. Response to User:
{
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": "user_1729363200000_xyz789",
"email": "john@example.com",
"username": "johndoe"
}
}- RabbitMQ publish khΓ΄ng block user registration
- NαΊΏu RabbitMQ fail, user vαΊ«n register thΓ nh cΓ΄ng
- Error Δược log nhΖ°ng khΓ΄ng throw exception
- KhΓ΄ng cαΊ§n manual trigger
- Mα»i registration tα»± Δα»ng push message
- Consumer tα»± Δα»ng start khi app boot
- Durable queues
- Persistent messages
- Auto-reconnect on connection loss
- Event name: "user.registered"
- Other services cΓ³ thα» subscribe
- Loosely coupled architecture
RabbitMQ message nΓ y cΓ³ thα» Δược sα» dα»₯ng cho:
-
Email Verification
- Consumer nhαΊn message
- Gα»i verification email
- Track verification status
-
Welcome Email
- Send welcome message
- Onboarding instructions
-
Analytics
- Track user registrations
- User demographics
- Registration trends
-
CRM Integration
- Sync to CRM system
- Create customer profile
- Setup marketing campaigns
-
Audit Logs
- Log user activities
- Compliance tracking
- Security monitoring
-
Notification Services
- Push notifications
- SMS alerts
- Slack/Discord notifications
| Feature | Status | Description |
|---|---|---|
| Auto Push on Register | β | Messages sent automatically |
| Event Type | β | "user.registered" |
| Message Format | β | JSON vα»i user data |
| Non-Blocking | β | KhΓ΄ng αΊ£nh hΖ°α»ng registration |
| Error Handling | β | Graceful fallback |
| Consumer | β | Auto-listening |
| Logs | β | Detailed logging |
β RabbitMQ Integration ΔΓ£ hoΓ n thiα»n!
Mα»i khi user ΔΔng kΓ½:
- β Data Δược push lΓͺn RabbitMQ
- β Consumer nhαΊn Δược message
- β Event cΓ³ thα» Δược xα» lΓ½ bα»i cΓ‘c services khΓ‘c
- β System hoαΊ‘t Δα»ng async vΓ reliable
Documentation Date: October 19, 2025
Feature: User Registration with RabbitMQ Integration
Status: β
Implemented & Working