CAP源码解读

CAP是一个用于分布式系统中的事件总线和最终一致性解决方案,具备轻量、高性能和易用性。本文深入探讨CAP的注册服务,包括ICapPublisher、IDispatcher、IMessageSender等关键组件的工作原理,以及消费者注册、消息发送和处理过程。
摘要由CSDN通过智能技术生成

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);
        } 

注册关键服务简介

在这里插入图片描述
在这里插入图片描述

  1. ICapPublisher:生产者,持久化消息至数据仓储使用,并使用IDispatcher任务调度器向队列发送消息
  2. IConsumerRegister:消费者,解析接收到消息交由MethodMatcherCache解析为消费者上下文,并持久化到数据仓储,然后交由IDispatcher任务调度器处理
  3. MethodMatcherCache:方法匹配缓存:调用IConsumerServiceSelector消费者服务选择器,将消费者上下文(需要调度的真实方法元信息)缓存
  4. ConsumerServiceSelector:消费者服务选择器,查询宿主服务中消费者的信息组成消费者上下文(需要调度的真实方法元信息)
  5. IProcessingServer.CapProcessingServer:长时间运行处理程序,集成以下三个服务
  6. MessageNeedToRetryProcessor:消息重试,获取一定时间内任务失败重试次数未超出的任务重新执行
  7. TransportCheckProcessor:健康检查
  8. CollectorProcessor:超时消息删除
  9. IDispatcher:任务调度器,进程内的异步队列(Channel),用于控制任务的并发(生产者发布消息,与消费者消费消息), 生产者队列使用IMessageSender处理任务的发送,消费者队列使用ISubscribeDispatcher服务处理任务的消费
  10. IMessageSender:消息发送者,发送消息至消息队列服务,并存储与数据仓储(控制任务的重试,任务成功与失败写入数据仓储,任务完成后的回调情况)
  11. ISubscribeDispatcher:订阅者(消费者)任务调度器,执行消息上下文真实方法,对于消费者任务调度的扩展(控制任务的重试,任务成功与失败写入数据仓储,任务完成后的回调情况),核心调用ISubscribeInvoker
  12. ISubscribeInvoker:订阅者的调用器, 用于消费者(订阅者)调用消息上下文的真实方法
  13. IBootstrapper:启动服务,初始化数据仓储(创建表),开启IProcessingServer服务

ICapPublisher

使用方式

            //无事务使用
            await _capBus.PublishAsync("sample.rabbitmq.sqlserver", new Person()
            {
   
                Id = 123,
                Name = "Bar"
            
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值