生成和使用消息
使用 MassTransit 发送和处理消息。
生成和使用消息 是 CoddyKit 上的免费 C# Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。
注册 MassTransit
请在 DI 中配置 MassTransit:注册它,将其指向一种传输方式(此处为 RabbitMQ),并让它发现您的消费者。
builder.Services.AddMassTransit(x =>
{
x.AddConsumers(typeof(Program).Assembly);
x.UsingRabbitMq((context, cfg) =>
{
cfg.Host("localhost");
cfg.ConfigureEndpoints(context);
});
});定义消费者
消费者会针对其处理的消息类型实现 IConsumer<T>。您的逻辑位于 Consume 中,该方法会接收 ConsumeContext<T>。
public class OrderPlacedConsumer : IConsumer<OrderPlaced>
{
public async Task Consume(ConsumeContext<OrderPlaced> context)
{
OrderPlaced message = context.Message;
// handle the event
}
}发布事件
注入 IPublishEndpoint 并调用 Publish,即可向所有订阅者广播事件。
public class OrderService
{
private readonly IPublishEndpoint _publish;
public OrderService(IPublishEndpoint publish) => _publish = publish;
public Task PlaceOrderAsync(Guid id, string email) =>
_publish.Publish(new OrderPlaced(id, email));
}发送命令
命令会发送到特定的 endpoint。解析目标对应的 ISendEndpoint,然后调用 Send。
var endpoint = await _sendProvider
.GetSendEndpoint(new Uri("queue:charge-payment"));
await endpoint.Send(new ChargePayment(orderId, amount));Publish 与 Send 总结
Publish 用于事件,会到达每个已订阅的消费者;Send 用于命令,并定位到一个队列。正确选择可以决定您的路由行为。
ConsumeContext 的作用
ConsumeContext 暴露的不只是消息本身:它还提供关联标识符、标头,以及在消费者内部发布消息或发送响应的能力,从而支持消息链式处理。
public async Task Consume(ConsumeContext<OrderPlaced> context)
{
await context.Publish(new InvoiceRequested(context.Message.OrderId));
}请求-响应
MassTransit 还支持通过消息传递实现请求-响应。请求客户端发送请求并等待类型化的回复;当您需要获得响应,同时又希望与消息代理解耦时,这种方式非常有用。
var response = await _client
.GetResponse<OrderStatus>(new GetOrder(orderId));
OrderStatus status = response.Message;endpoint 命名
ConfigureEndpoints 会按照约定,自动为每个消费者命名一个接收 endpoint(队列)。需要时,您可以通过格式化器或显式配置来自定义名称。
消息序列化
默认情况下,MassTransit 会将消息序列化为 JSON,并包含元数据(消息类型、标识符)。生产者和消费者共享消息契约类型,这些类型通常位于共享包中。
并发
消费者可以并行处理多条消息。请调整 PrefetchCount 和并发限制,在吞吐量与下游处理能力之间取得平衡。
cfg.ReceiveEndpoint("orders", e =>
{
e.PrefetchCount = 16;
e.ConcurrentMessageLimit = 8;
e.ConfigureConsumer<OrderPlacedConsumer>(context);
});测试消费者
MassTransit 提供内存测试工具,因此您无需使用真实的消息代理,就可以发布消息并断言消费者已处理该消息。
快速检查
测试消息的生产和消费。
总结
使用 AddMassTransit、传输层和 ConfigureEndpoints 注册 MassTransit。消费者通过 IConsumer<T> 实现,并包含一个 Consume 方法。对于事件(所有订阅者),使用 IPublishEndpoint.Publish;对于命令(一个队列),使用 ISendEndpoint.Send。ConsumeContext 支持消息链式处理和请求-响应,测试工具则可以在内存中验证消费者。
常见问题解答
「生成和使用消息」课时是免费的吗?
是的 — 「生成和使用消息」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。
「生成和使用消息」这节课中我会学到什么?
使用 MassTransit 发送和处理消息。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C# Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「生成和使用消息」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C# Academy 课中编写并运行代码吗?
能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。