مرور سریع پیامرسانی و معماری رویداد-محور
جمعبندی نکات کلیدی Message Broker، RabbitMQ و MassTransit برای مرور شب قبل مصاحبههای معماری میکروسرویس.
این جزوه مهمترین نکات پیامرسانی ناهمزمان بین سرویسها را که در مصاحبههای معماری و میکروسرویس پرتکرارند، در یک صفحه جمع کرده تا در کمترین زمان مرور کنید. نکات ⭐ (طلایی) پرتکرارترین سؤالات مصاحبه هستند — اگر وقت کم دارید، فقط همانها را بخوانید.
فهرست بخشها
MassTransit0/5
کتابخانهای در NET. که ارسال و دریافت پیام بین سرویسها را بهجای فراخوانی مستقیم HTTP، از طریق یک Message Broker مثل RabbitMQ مدیریت میکند.
تأکید کنید MassTransit خودش یک Broker نیست؛ یک لایه انتزاعی (Abstraction) روی Brokerهایی مثل RabbitMQ، Azure Service Bus یا Amazon SQS است.
// Producer (فرستنده)
await publishEndpoint.Publish(new OrderCreated
{
OrderId = 1
});
// Message
public class OrderCreated
{
public int OrderId { get; set; }
}
// Consumer (گیرنده)
public class OrderConsumer : IConsumer<OrderCreated>
{
public async Task Consume(ConsumeContext<OrderCreated> context)
{
Console.WriteLine(context.Message.OrderId);
}
}
یکی از سوالات کلاسیک مصاحبه: «فرق Send و Publish در MassTransit چیست؟» — Publish = broadcast به همه مشترکها، Send = نقطهبهنقطه به یک Consumer.
dotnet add package MassTransit
dotnet add package MassTransit.RabbitMQ
Message Broker0/5
سیستم واسطی که پیامها را بین سرویسهای ناهمزمان (async) جابهجا میکند تا سرویسها مستقیماً به هم وابسته نباشند.
RabbitMQ - جزئیات Exchange، Queue و Ack (پیشرفته)0/6
نگاه عمیقتر به معماری داخلی RabbitMQ: انواع Exchange، Routing Key، Binding، ویژگیهای Queue و مکانیزم Ack/Nack.
تفاوت * (دقیقاً یک کلمه) و # (صفر یا چند کلمه) در Topic Exchange یکی از رایجترین سوالات عملی مصاحبه RabbitMQ است.
استفاده از autoAck=true در پروژه واقعی باعث میشود پیام بلافاصله بعد از دریافت (نه بعد از پردازش موفق) از صف حذف شود و در صورت بروز خطا، پیام برای همیشه گم شود.
RabbitMQ (مقدمات و پیادهسازی با RabbitMQ.Client)0/5
معرفی سریع RabbitMQ بهعنوان یک Message Broker و پیادهسازی خام Producer/Consumer با کتابخانه RabbitMQ.Client در NET.
using RabbitMQ.Client;
using System.Text;
var factory = new ConnectionFactory()
{
HostName = "localhost"
};
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.QueueDeclare(
queue: "testQueue",
durable: false,
exclusive: false,
autoDelete: false
);
string message = "Hello RabbitMQ";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(
exchange: "",
routingKey: "testQueue",
body: body
);
Console.WriteLine("Message Sent");
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;
var factory = new ConnectionFactory() { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.QueueDeclare("testQueue", false, false, false);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine("Received: " + message);
};
channel.BasicConsume(
queue: "testQueue",
autoAck: true,
consumer: consumer
);
Console.ReadLine();
تصور اینکه RabbitMQ جایگزین دیتابیس یا مناسب کارهای همزمان و سریع (synchronous) است؛ RabbitMQ برای پردازش ناهمزمان طراحی شده، نه ذخیرهسازی دائمی داده.
