
Áp dụng SignalR để xây dựng dịch vụ Push Notification trong Microservices
June 30, 2025Trong kiến trúc microservices, việc giao tiếp thời gian thực đóng vai trò cực kỳ quan trọng, đặc biệt khi bạn cần gửi thông báo kịp thời (push notification) tới client. Một trong những công cụ mạnh mẽ và dễ sử dụng nhất để hiện thực điều này trong hệ sinh thái .NET chính là Microsoft.AspNetCore.SignalR.
Trong bài viết này, chúng ta sẽ tìm hiểu cách ứng dụng SignalR để xây dựng một Notification Service hiệu quả trong kiến trúc Microservices. Đồng thời, bạn sẽ thấy cách kết hợp SignalR với MassTransit để xử lý các sự kiện phân tán và đẩy dữ liệu đến client theo thời gian thực.
Tại sao lại là SignalR?
SignalR là một thư viện mã nguồn mở của Microsoft giúp hiện thực giao tiếp hai chiều, thời gian thực giữa server và client thông qua WebSocket hoặc các cơ chế fallback như Server-Sent Events và Long Polling.
Đặc biệt, nó rất phù hợp để xây dựng các hệ thống như:
- Hệ thống thông báo đẩy (push notification)
- Cập nhật dữ liệu trực tiếp theo thời gian thực (live updates)
- Hệ thống chat hoặc phản hồi người dùng ngay lập tức
Xây dựng Notification Service sử dụng SignalR
1. Tạo SignalR Hub
using Microsoft.AspNetCore.SignalR;
namespace NotificationService
{
public class NotificationHub : Hub
{
}
}
Đây là nơi trung tâm mà các client sẽ kết nối đến để nhận thông báo. NotificationHub
kế thừa từ Hub
của SignalR, cho phép bạn định nghĩa các phương thức để push dữ liệu đến client.
2. Tích hợp với MassTransit để nhận sự kiện
using Contracts;
using MassTransit;
using Microsoft.AspNetCore.SignalR;
namespace NotificationService
{
public class MessageConsumer : IConsumer<Message>
{
private readonly IHubContext<NotificationHub> _hubContext;
public MessageConsumer(IHubContext<NotificationHub> hubContext)
{
_hubContext = hubContext;
}
public async Task Consume(ConsumeContext<Message> context)
{
Console.WriteLine("--> Message received");
await _hubContext.Clients.All.SendAsync("MessageReceived", context.Message);
}
}
}
Ở đây, ta sử dụng MassTransit (kết hợp với RabbitMQ hoặc bất kỳ message broker nào khác) để nhận sự kiện từ các microservices khác. Khi có message được publish (ví dụ: đơn hàng mới, cập nhật trạng thái, v.v.), MessageConsumer
sẽ broadcast sự kiện này tới tất cả các client đã kết nối thông qua IHubContext<NotificationHub>
.
3. Kết nối từ phía client (Next.js)
const [connection, setConnection] = useState<HubConnection | null>(null);
useEffect(() => {
const newConnection = new HubConnectionBuilder()
.withUrl(process.env.NEXT_PUBLIC_NOTIFY_URL!)
.withAutomaticReconnect()
.build();
setConnection(newConnection);
}, []);
connection?.on('MessageReceived', (message: Message) => {
// Xử lý message nhận được, ví dụ: hiển thị toast notification
});
Ở phía frontend (trong ví dụ này là Next.js), ta sử dụng thư viện SignalR JS client để kết nối đến NotificationHub. Khi có sự kiện "MessageReceived"
từ server, client sẽ nhận được dữ liệu và xử lý tương ứng (ví dụ: hiển thị thông báo trên giao diện).
Khi làm việc trong môi trường microservices, việc truyền tải thông tin theo thời gian thực là yếu tố quan trọng để nâng cao trải nghiệm người dùng và tối ưu hóa hiệu suất hệ thống. SignalR là giải pháp lý tưởng giúp bạn triển khai điều này dễ dàng, nhất là khi kết hợp với MassTransit, RabbitMQ, hoặc bất kỳ message bus nào trong hệ thống phân tán.
Dù bạn đang xây dựng một nền tảng thương mại điện tử, một hệ thống nhắn tin nội bộ, hay dashboard quản trị, SignalR có thể giúp bạn giữ cho client luôn đồng bộ hóa theo thời gian thực một cách hiệu quả và ít tốn chi phí phát triển nhất.
Bạn có thể mở rộng hệ thống này để hỗ trợ theo nhóm người dùng, gửi targeted notification, hoặc ghi nhận trạng thái delivery của thông báo trong hệ thống. Đây là một nền tảng mạnh mẽ đáng để khai thác trong mọi ứng dụng hiện đại.