0Pricing
C# Academy · 课时

生成和使用消息

使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 消息传递概念
  2. 生成和使用消息
  3. Saga 与工作流
  4. 错误处理与重试
← 返回 C# Academy