CAP源码解读

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

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"
            });
            //携带事务使用
            using (dbContext.Database.BeginTransaction(_capBus, autoCommit:
### 视频源码分析与实现 视频处理技术涉及多个领域,包括多媒体编码解码、数据流传输以及前端展示等。以下是关于 HTML5 `video` 的源码实现及其解析。 #### 1. HTML5 Video Tracker 实现原理 HTML5 提供了一个内置的 `<video>` 标签用于播放媒体文件。通过 JavaScript 可以进一步增强其功能,例如追踪视频中的对象或帧变化。 在 `Tracker Video Analysis and Modeling JS (Beta)` 中提到的功能可以通过以下方式实现: - **Video Element 控制**: 使用原生 DOM API 来控制视频播放状态。 ```javascript const videoElement = document.querySelector('video'); // 检测视频加载完成事件 videoElement.addEventListener('loadedmetadata', () => { console.log(`Duration: ${videoElement.duration} seconds`); }); ``` - **Canvas 进行像素级操作**: 将每一帧渲染到 Canvas 上并提取图像数据。 ```javascript const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); function processFrame() { if (!videoElement.paused && !videoElement.ended) { requestAnimationFrame(processFrame); // 绘制当前帧至 Canvas canvas.width = videoElement.videoWidth; canvas.height = videoElement.videoHeight; ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height); // 获取像素数据 const frameData = ctx.getImageData(0, 0, canvas.width, canvas.height).data; // 对帧数据进行分析... } } processFrame(); ``` 上述方法可以用来实时跟踪视频内的运动物体或其他特征[^1]。 #### 2. 数据流与缓冲机制 当涉及到更底层的数据交互时,则需考虑 Java NIO 的核心概念——Buffer 和 Channel。这些组件对于高效管理音视频流至关重要: - **Channel** 负责读写 I/O 操作; - **Buffer** 存储临时数据片段; 具体来说,在异步环境下利用 Channels 完成非阻塞式的网络通信能够显著提升性能[^3]。 #### 3. 结合 Python 库扩展能力 虽然主要讨论的是基于 Web 技术栈的应用场景,但如果希望深入挖掘某些特定算法或者模型训练过程的话,也可以引入强大的 Python 工具集来辅助开发工作流程。比如借助 OpenCV-Python 处理静态图片序列作为输入素材之一[^2]: ```python import cv2 cap = cv2.VideoCapture('input.mp4') while cap.isOpened(): ret, frame = cap.read() if not ret: break # 在这里应用自定义逻辑处理每一张frame gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.destroyAllWindows() ``` 以上展示了如何从本地磁盘加载 MP4 文件并通过循环逐帧访问内容的过程。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值