Brighter 实战:命令、事件与发送-发布-投递黄金三角

前言

我之前的文章中,我们探讨了 Brighter 如何与 RabbitMQ 集成。本文将深入解析 Brighter 中三个核心消息处理方法:SendPublish 和 Post 的区别与应用场景。

什么是消息总线(Bus)?

消息总线是系统中用于组件间数据传输的通道。Brighter 将其分为两种类型:

1. 内部总线(Internal Bus)

  • 运行范围:应用程序内部。

  • 优化特性:直接内存处理(无需序列化消息)。

  • 自动注册:默认注册所有消息和对应的处理程序(Handler)。

2. 外部总线(External Bus)

  • 运行范围:连接外部系统(如 RabbitMQ、Kafka、AWS SQS/SNS)。

  • 依赖 I/O:需通过网络或文件操作访问外部资源。

示例:配置 RabbitMQ 外部总线

var rmqConnection = new RmqMessagingGatewayConnection  
{  
    AmpqUri = new AmqpUriSpecification(new Uri("amqp://guest:guest@localhost:5672")),  
    Exchange = new Exchange("paramore.brighter.exchange")  
};  

// 注册外部总线  
services.AddServiceActivator(options => {})  
    .UseExternalBus(  
        new RmqProducerRegistryFactory(  
            rmqConnection,  
            new RmqPublication[]  
            {  
                new()  
                {  
                    MakeChannels = OnMissingChannel.Create,  
                    Topic = new RoutingKey("greeting.event")  
                }  
            }  
        ).Create()  
    );  

命令(Command)与事件(Event)

命令(Command)

  • 用途:触发一个立即执行的操作(如 CreateUserUpdateData)。

  • 处理规则仅允许一个处理程序(Brighter 强制要求)。

  • 命名规范:使用祈使句动词(如 ShipOrder)。

public class CreateUser : Command  
{  
    public CreateUser() : base(Guid.NewGuid()) { }  
    public string Name { get; set; }  
}  

事件(Event)

  • 用途:通知已发生的状态变化(如 UserCreatedOrderShipped)。

  • 处理规则允许多个处理程序

  • 命名规范:使用过去式动词(如 InventoryUpdated)。

public class UserCreated : Event  
{  
    public UserCreated() : base(Guid.NewGuid()) { }  
    public string Name { get; set; }  
}  

Send、Publish 和 Post 的使用场景

方法用途总线类型处理行为
Send命令(Command)内部总线执行唯一处理程序
Publish事件(Event)内部总线执行所有注册的处理程序
Post命令/事件外部总线

发送到外部系统

使用示例:

// 发送命令(内部总线,单处理程序)  
commandProcessor.Send(new CreateUser { Name = "Alice" });  

// 发布事件(内部总线,多处理程序)  
commandProcessor.Publish(new UserCreated { Name = "Bob" });  

// 投递到外部队列(如 RabbitMQ)  
commandProcessor.Post(new OrderShipped { OrderId = 123 });  

代码解析:Send 与 Publish

命令处理程序(单例)

public class MyCommandHandler : RequestHandler<MyCommand>  
{  
    private readonly ILogger<MyCommandHandler> _logger;  

    public MyCommandHandler(ILogger<MyCommandHandler> logger) => _logger = logger;  

    public override MyCommand Handle(MyCommand command)  
    {  
        _logger.LogInformation(  
            "命令处理完成:ID={Id}, 内容={Text}",  
            command.Id, command.Text  
        );  
        return base.Handle(command);  
    }  
}  

事件处理程序(多例)

public class MyEventHandler1 : RequestHandler<MyEvent>  
{  
    private readonly ILogger<MyEventHandler1> _logger;  

    public MyEventHandler1(ILogger<MyEventHandler1> logger) => _logger = logger;  

    public override MyEvent Handle(MyEvent @event)  
    {  
        _logger.LogInformation(  
            "处理程序1:事件 ID={Id}, 内容={Text}",  
            @event.Id, @event.Text  
        );  
        return base.Handle(@event);  
    }  
}  

public class MyEventHandler2 : RequestHandler<MyEvent>  
{  
    // 实现与 MyEventHandler1 类似  
}  

执行代码

var processor = provider.GetRequiredService<IAmACommandProcessor>();  

// 发送命令(触发单处理程序)  
processor.Send(new MyCommand { Text = "你好,命令" });  

// 发布事件(触发所有处理程序)  
processor.Publish(new MyEvent { Text = "你好,事件" });  

关键注意事项:

  • 若对同一个命令使用 Send 但存在多个处理程序,Brighter 会抛出异常。

  • Post 会绕过进程内处理,直接通过外部总线传输消息。

总结

Brighter 的命令模式通过解耦操作与执行,为构建可扩展系统提供了优雅的解决方案。后续文章将深入探讨重试机制、管道(Pipeline)和监控功能。

完整代码示例:
GitHub 仓库

参考资源

  1. Brighter 官方文档

  2. 命令模式指南

  3. 命令模式(维基百科)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值