CAP源码解读
CAP简介
Github:https://github.com/dotnetcore/CAP
开源协议:MIT
CAP 是一个在分布式系统中(SOA,MicroService)实现事件总线及最终一致性(分布式事务)的一个开源的 C# 库,她具有轻量级,高性能,易使用等特点。
服务注册
由此可大致了解到组件内使用了那些服务以及服务的作用
/// <summary>
/// Adds and configures the consistence services for the consistency.
/// </summary>
/// <param name="services">The services available in the application.</param>
/// <param name="setupAction">An action to configure the <see cref="CapOptions" />.</param>
/// <returns>An <see cref="CapBuilder" /> for application services.</returns>
public static CapBuilder AddCap(this IServiceCollection services, Action<CapOptions> setupAction)
{
if (setupAction == null) throw new ArgumentNullException(nameof(setupAction));
ServiceCollection = services;
services.TryAddSingleton<CapMarkerService>();
services.TryAddSingleton<ICapPublisher, CapPublisher>(); //生产者,持久化消息至数据仓储使用,并使用**IDispatcher**任务调度器向队列发送消息
services.TryAddSingleton<IConsumerRegister, ConsumerRegister>();//消费者,解析接收到消息交由**MethodMatcherCache**解析为消费者上下文,并持久化到数据仓储,然后交由**IDispatcher**任务调度器处理
services.TryAddSingleton<MethodMatcherCache>();//方法匹配缓存:调用**IConsumerServiceSelector**消费者服务选择器,将消费者上下文(需要调度的真实方法元信息)缓存。
services.TryAddSingleton<IConsumerServiceSelector, ConsumerServiceSelector>(); //消费者服务选择器,查询宿主服务中消费者的信息组成消费者上下文(需要调度的真实方法元信息)。
//Processors
services.TryAddEnumerable(ServiceDescriptor.Singleton<IProcessingServer, ConsumerRegister>());
services.TryAddEnumerable(ServiceDescriptor.Singleton<IProcessingServer, CapProcessingServer>());//长时间运行处理程序,集成以下三个服务
//Queue's message processor
services.TryAddSingleton<MessageNeedToRetryProcessor>();//消息重试,获取一定时间内任务失败重试次数未超出的任务重新执行。
services.TryAddSingleton<TransportCheckProcessor>();//健康检查
services.TryAddSingleton<CollectorProcessor>();//删除超时消息
services.TryAddSingleton<IDispatcher, Dispatcher>();//任务调度器,进程内的异步队列(Channel),用于控制任务的并发(生产者发布消息,与消费者消费消息), 生产者队列使用**IMessageSender**处理任务的发送,消费者队列使用**ISubscribeDispatcher**服务处理任务的消费
services.TryAddSingleton<IMessageSender, MessageSender>(); //消息发送者,发送消息至消息队列服务,并存储与数据仓储 (控制任务的重试,任务成功与失败写入数据仓储,任务完成后的回调情况)
services.TryAddSingleton<ISubscribeDispatcher, SubscribeDispatcher>();//订阅者(消费者)任务调度器,执行消息上下文真实方法,对于消费者任务调度的扩展(控制任务的重试,任务成功与失败写入数据仓储,任务完成后的回调情况),核心调用**ISubscribeInvoker**
services.TryAddSingleton<ISubscribeInvoker, SubscribeInvoker>(); //订阅者的调用器, 用于消费者(订阅者)调用消息上下文的真实方法。
services.TryAddSingleton<ISerializer, JsonUtf8Serializer>();//序列化器
// Warning: IPublishMessageSender need to inject at extension project.
//选项模式注入上层服务需要依赖抽象的具体实现
//例如数据库可使用mysql,sqlserver,则对应不同的组件
//消息队列例如 rabbitmq,kafka
var options = new CapOptions();
setupAction(options);
foreach (var serviceExtension in options.Extensions)
serviceExtension.AddServices(services);
services.Configure(setupAction);
//Startup and Hosted
services.AddSingleton<IBootstrapper, Bootstrapper>();//启动服务,初始化数据仓储(创建表),开启**IProcessingServer**服务,
services.AddHostedService<Bootstrapper>(); //将启动服务作为后台服务
return new CapBuilder(services);
}
注册关键服务简介
- ICapPublisher:生产者,持久化消息至数据仓储使用,并使用IDispatcher任务调度器向队列发送消息
- IConsumerRegister:消费者,解析接收到消息交由MethodMatcherCache解析为消费者上下文,并持久化到数据仓储,然后交由IDispatcher任务调度器处理
- MethodMatcherCache:方法匹配缓存:调用IConsumerServiceSelector消费者服务选择器,将消费者上下文(需要调度的真实方法元信息)缓存
- ConsumerServiceSelector:消费者服务选择器,查询宿主服务中消费者的信息组成消费者上下文(需要调度的真实方法元信息)
- IProcessingServer.CapProcessingServer:长时间运行处理程序,集成以下三个服务
- MessageNeedToRetryProcessor:消息重试,获取一定时间内任务失败重试次数未超出的任务重新执行
- TransportCheckProcessor:健康检查
- CollectorProcessor:超时消息删除
- IDispatcher:任务调度器,进程内的异步队列(Channel),用于控制任务的并发(生产者发布消息,与消费者消费消息), 生产者队列使用IMessageSender处理任务的发送,消费者队列使用ISubscribeDispatcher服务处理任务的消费
- IMessageSender:消息发送者,发送消息至消息队列服务,并存储与数据仓储(控制任务的重试,任务成功与失败写入数据仓储,任务完成后的回调情况)
- ISubscribeDispatcher:订阅者(消费者)任务调度器,执行消息上下文真实方法,对于消费者任务调度的扩展(控制任务的重试,任务成功与失败写入数据仓储,任务完成后的回调情况),核心调用ISubscribeInvoker
- ISubscribeInvoker:订阅者的调用器, 用于消费者(订阅者)调用消息上下文的真实方法
- IBootstrapper:启动服务,初始化数据仓储(创建表),开启IProcessingServer服务
ICapPublisher
使用方式
//无事务使用
await _capBus.PublishAsync("sample.rabbitmq.sqlserver", new Person()
{
Id = 123,
Name = "Bar"
});
//携带事务使用
using (dbContext.Database.BeginTransaction(_capBus, autoCommit