• [分享交流] C++20协程框架分享
    引入协程背景有大量的异步业务逻辑, 传统的回调代码割裂, 可读性差, 不可避免的回调地狱简化编码复杂度,希望底层能够支持协程, 简化跨线程或者实现rpc的能力项目Github: CrystalNetCrystalNet支持C++20, 包括requires, 协程等特性协程框架是CrystalNet的一个底层支持协程源码路径:kernel/include/kernel/comp/Coroutines测试case: TestCoroutine.h/TestCoroutine.cpp TestPoller.h/TestPoller.cpp细节介绍封装一个通用的协程类template<typename T> class CoTask<T>封装一个阻塞等待类CoWaiter,并提供阻塞等待接口:CoTask<> Waiting(), 用于等待条件满足时唤醒协程设计封装了一个Poller,主要用于处理事件循环, 协程的suspend时候会向Poller抛异步任务调度协程, 直到在CoWaiting时永久阻塞CoTask提供GetParam让用户在协程阻塞时获取到协程句柄,方便用户在条件满足时通过协程句柄唤醒协程Poller提供SendAsync接口实现跨线程的通信(协程方式提供)// 跨线程协程消息(otherPoller也可以是自己) // req暂时只能传指针,而且会在otherChannel(可能不同线程)释放 // req/res 必须实现Release, ToString接口 template<typename ResType, typename ReqType> requires requires(ReqType req, ResType res) { // req/res必须有Release接口 req.Release(); res.Release(); // req/res必须有ToString接口 req.ToString(); res.ToString(); } CoTask<KERNEL_NS::SmartPtr<ResType, AutoDelMethods::Release>> SendToAsync(Poller &otherPoller, ReqType *req) { // 1.ptr用来回传ResType KERNEL_NS::SmartPtr<ResType *, KERNEL_NS::AutoDelMethods::CustomDelete> ptr(KERNEL_NS::KernelCastTo<ResType *>( kernel::KernelAllocMemory<KERNEL_NS::_Build::TL>(sizeof(ResType **)))); ptr.SetClosureDelegate([](void *p) { // 释放packet auto castP = KERNEL_NS::KernelCastTo<ResType*>(p); if(*castP) (*castP)->Release(); KERNEL_NS::KernelFreeMemory<KERNEL_NS::_Build::TL>(castP); }); *ptr = NULL; // 设置stub => ResType的事件回调 UInt64 stub = ++_maxStub; KERNEL_NS::SmartPtr<KERNEL_NS::TaskParamRefWrapper, KERNEL_NS::AutoDelMethods::Release> params = KERNEL_NS::TaskParamRefWrapper::NewThreadLocal_TaskParamRefWrapper(); SubscribeStubEvent(stub, [ptr, params](KERNEL_NS::StubPollerEvent *ev) mutable { KERNEL_NS::ObjectPollerEvent<ResType> *finalEv = KernelCastTo<KERNEL_NS::ObjectPollerEvent<ResType>>(ev); // 将结果带出去 *ptr = finalEv->_obj; finalEv->_obj = NULL; // 唤醒Waiter auto &coParam = params->_params; if(coParam && coParam->_handle) coParam->_handle->ForceAwake(); }); // 发送对象事件 ObjectPollerEvent到 other auto iterChannel = _targetPollerRefChannel.find(&otherPoller); if(LIKELY(iterChannel != _targetPollerRefChannel.end())) { auto objEvent = ObjectPollerEvent<ReqType>::New_ObjectPollerEvent(stub, false, this, iterChannel->second); objEvent->_obj = req; iterChannel->second->Send(objEvent); } else { auto objEvent = ObjectPollerEvent<ReqType>::New_ObjectPollerEvent(stub, false, this, nullptr); objEvent->_obj = req; otherPoller.Push(objEvent); } // 等待 ObjectPollerEvent 的返回消息唤醒 auto poller = this; // 外部如果协程销毁兜底销毁资源 auto releaseFun = [stub, poller]() { poller->UnSubscribeStubEvent(stub); }; auto delg = KERNEL_CREATE_CLOSURE_DELEGATE(releaseFun, void); co_await KERNEL_NS::Waiting().SetDisableSuspend().GetParam(params).SetRelease(delg); if(LIKELY(params->_params)) { auto &pa = params->_params; if(pa->_errCode != Status::Success) { g_Log->Warn(LOGFMT_OBJ_TAG("waiting err:%d, stub:%llu, req:%p") , pa->_errCode, stub, req); UnSubscribeStubEvent(stub); } // 销毁waiting协程 if(pa->_handle) pa->_handle->DestroyHandle(pa->_errCode); } // 3.将消息回调中的ResType引用设置成空 auto res = *ptr; *ptr = NULL; co_return KERNEL_NS::SmartPtr<ResType, KERNEL_NS::AutoDelMethods::Release>(res); } 提供异步化工具函数: PostCaller异步编码举例代码在测试用例:TestPoller, 示例中实现了co_await 请求一个req,并返回一个resclass TestTimeoutStartup : public KERNEL_NS::IThreadStartUp { POOL_CREATE_OBJ_DEFAULT_P1(IThreadStartUp, TestTimeoutStartup); public: TestTimeoutStartup(KERNEL_NS::LibEventLoopThread * target) : _target(target) { } virtual void Run() override { KERNEL_NS::PostCaller([this]() mutable -> KERNEL_NS::CoTask<> { auto targetPoller = co_await _target->GetPoller(); auto req = HelloWorldReq::New_HelloWorldReq(); auto res = co_await targetPoller->template SendAsync<HelloWorldRes, HelloWorldReq>(req).SetTimeout(KERNEL_NS::TimeSlice::FromSeconds(5)); g_Log->Info(LOGFMT_NON_OBJ_TAG(TestTimeoutStartup, "res return")); }); } virtual void Release() override { TestTimeoutStartup::Delete_TestTimeoutStartup(this); } KERNEL_NS::LibEventLoopThread * _target; };
  • [热门活动] HCDG重庆架构师专场-应用架构演进与优化技术沙龙 总结
    HCDG(华为云开发者社区组织)重庆架构师专场 ——“应用架构演进与优化” 技术沙龙顺利收官。本次活动以 “架构迭代升级与系统效能优化” 为核心议题,精准吸引辖区内企业架构师、技术负责人及资深开发者参与,现场交流氛围热烈,技术观点碰撞频繁,收获参会者一致好评。  沙龙开篇,DTSE(开发者技术支持工程师)架构师李常青老师带来主题演讲《架构演进之路:技术架构优化迭代的最佳实践分享》。  李老师以清晰的逻辑脉络,系统拆解了架构演进的十个完整阶段:从最初满足基础功能的单机部署,到应对数据增长的数据库服务器读写分离,再到适配业务复杂度提升的微服务架构落地…… 每一个阶段均结合技术背景、核心痛点与转型路径深入浅出地细致讲解。最终,他基于全链路演进经验,提炼并总结出一套覆盖 “业务适配性、可扩展性、稳定性、成本可控性” 的通用架构设计原则,内容详实且具备极强的实践参考价值,为听众提供了架构设计的完整方法论框架。 随后开启的 “动手实操:MaaS 能力调用实战” 环节,将沙龙氛围推向高潮。作为当前企业 “轻量化集成技术能力、加速业务创新” 的核心模式,MaaS(Model-as-a-Service,模型即服务)可帮助团队快速对接 AI 模型、业务组件等能力,降低架构搭建成本。    最后,由观测云技术总监黄小龙带来专题分享《下一代智能可观测性最佳实践》。他指出,在云原生、微服务架构普及的背景下,“传统监控” 已难以满足系统稳定性保障需求,而 “智能可观测性” 通过 “日志 + 指标 + 链路” 全维度数据关联分析,可实现 “问题主动预警、根因自动定位、性能瓶颈可视化”。黄小龙详细拆解智能可观测性体系的核心技术(如动态服务拓扑、AI 根因分析算法)与落地步骤,为参会者搭建前沿观测体系提供清晰路径。   整场沙龙内容聚焦 “实战”“落地”,环节设计从 “理论分享” 到 “动手实操” 再到 “前沿趋势”,逻辑紧凑、层层递进。不仅帮助参会者拓宽了架构设计与系统优化的技术视野,更搭建了本地架构师群体的交流桥梁,现场达成多组技术合作意向、经验共享共识。未来,HCDG 将持续围绕架构设计、云原生运维、AI 技术落地等核心方向,在西南地区举办更多 “小而精、专而深” 的技术活动,助力区域开发者生态成长,推动技术实践与业务创新深度融合。
  • [技术干货] 2024年项目实战必备之CRUD开源框架系统推荐
    在软件开发领域,CRUD(创建、读取、更新、删除)操作是构建数据驱动应用程序的核心功能。以下是一些流行的开源CRUD应用架构系统,以及它们的主要特点和优劣点的对比:1. CoolAdminCoolAdmin是一个前后端分离的开源架构。前端基于Vue.js,后端支持Java或Node.js。它具有模块化设计,通过代码生成器能快速实现CRUD接口。权限管理完善,还有任务调度等功能。它的优点是开发效率高、可扩展性强。但学习曲线陡峭,对Docker部署不太熟悉的开发者存在一定挑战。特点:模块化设计:采用模块化编码,结构清晰,易于维护。前后端分离:后端支持Java和Node.js,前端基于Vue.js,实现前后端分离。极速开发:通过代码生成器,只需少量代码即可实现CRUD接口。权限管理:内置权限管理系统,支持文件空间、任务调度等功能。部署灵活:支持Docker部署,简化部署流程。优点:开发效率高,适合快速迭代。模块化设计,易于扩展和维护。支持多种技术栈,灵活性高。缺点:学习曲线较陡峭,需要一定的技术基础。对于不熟悉Docker的用户,部署可能有一定难度。2. FastCrudFastCrud是基于Vue3的面向配置的CRUD开发框架。低代码特性明显,可作为低代码平台基础。支持多UI组件库,有本地和远程数据字典功能。通过简单配置就能快速开发CRUD功能。优点是入门简单、扩展性强。然而其功能在处理复杂业务逻辑时可能有所欠缺。特点:面向配置的CRUD框架:基于Vue3,通过配置文件快速生成CRUD功能。低代码平台基础框架:适合快速搭建原型和开发简单的数据管理应用。多UI支持:支持Antdv、ElementPlus、NaiveUI等多种UI组件库。数据字典支持:支持本地和远程数据字典,简化数据展示。优点:入门简单,适合快速开发。支持多种UI组件,灵活性强。配置驱动,易于扩展和维护。缺点:功能相对基础,不适合复杂的企业级应用。需要一定的Vue.js和配置文件知识。3. FlaskAppBuilderFlaskAppBuilder是基于Flask的Web应用开发框架。它提供模板与工具,能快速构建应用,集成多种数据库。权限管理系统强大,可定义角色等控制用户访问。有便捷的界面生成器,并且有丰富的插件生态。优点是开发效率提高且功能丰富,但可能对初学者来说相对复杂。特点:自动CRUD生成:基于Flask框架,自动生成CRUD页面和接口。安全性和认证:提供细粒度的安全配置和多种认证方式。灵活的界面和组件:支持多种视图和组件,如图表、过滤器等。应用场景广泛:适用于企业内部系统、数据管理应用和教育培训。优点:开发速度快,适合快速构建管理系统。安全性高,支持多种认证方式。界面灵活,易于定制。缺点:学习曲线较陡峭,需要熟悉Flask框架。功能相对复杂,不适合简单的CRUD应用。4. Dapper.SimpleCRUDDapper.SimpleCRUD是基于Dapper的CRUD操作帮助器。它允许用简单API执行CRUD操作,支持异步操作。能通过模型属性指定数据库映射关系。在高并发、大数据量场景下,以原生SQL语句为基础的它可提高性能。但只擅长处理简单操作,对于复杂查询支持不足。特点:高性能的轻量级ORM框架:基于Dapper框架,优化CRUD操作。简化数据库操作:通过简单的API调用实现高效的数据库操作。适用于高并发场景:执行速度快,适合处理大量数据。优点:执行速度快,性能高。代码简洁,易于理解和维护。适合高并发和大数据量的应用场景。缺点:功能相对基础,不支持复杂的查询和关联操作。需要一定的SQL知识。总结选择合适的开源CRUD应用架构系统应根据项目需求、技术栈和团队能力来决定。CoolAdmin适合需要快速迭代和灵活扩展的项目;FastCrud适合快速开发和简单的数据管理应用;FlaskAppBuilder适合需要快速构建复杂管理系统的企业级应用;Dapper.SimpleCRUD则适合高并发和大数据量的应用场景。
  • [认证交流] 【华为开发者认证E级云架构学习分享】
        经过几天紧张而充实的学习,收获颇丰。非常感谢华为为我们提供了这次宝贵的HCCDE学习机会。黄涛老师授课抑扬顿挫,生动有趣,教学内容精彩纷呈,让人听得津津有味。之前我也曾参加过华为云的P级和E级培训并获得了相应的证书。而这次HCCDE培训的推出,无疑更加契合了当前云计算技术的发展趋势,其系统化和专业化的课程设置,让我对云计算解决方案架构的设计和应用能力有了更深入的理解和提升。     我坚信,通过HCCDE的学习,能够大大提升我们在实际工作中运用云计算技术的能力,为企业的数字化转型贡献自己的价值。同时,我也期待更多的人能够加入到HCCDE的学习中来,共同探索和挖掘华为云的潜力,实现个人与企业的共同成长。     在此,我衷心祝愿HCCDE培训越办越好,能够吸引更多的人才加入,共同推动云计算技术的发展与应用。再次感谢华为为我们提供这样一次宝贵的学习机会,也感谢各位老师的辛勤付出!
  • [区域初赛赛题问题] 初赛赛题疑惑
    请问任务书这段话的意思是说在港口装卸货物的一帧时间里,如果货船离开了,那么需要等待装卸货物的这一帧结束,才能让新的船进入这个港口吗?
  • [区域初赛赛题问题] 调试相关的问题
    可以让判题器启动后在后台等待输入,然后发送初始化等一系列命令逐帧进行调试吗?
  • [技术干货] 微服务还是单体架构?
    在当今技术领域,微服务和单体架构已成为现代技术领域的焦点议题。这两种架构各有千秋,各有利弊,也引发了不少热烈的探讨和争议。那么你是如何看待这个问题的呢?你认为哪种架构更符合未来云的发展趋势呢?1.为什么会出现微服务和单体架构的争议?2.在实际的业务中,你选择的是微服务还是单体架构?3.在云上,哪种架构更符合未来云的发展趋势呢?