最实用的高并发任务执行架构设计 | 架构篇(2)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: 最实用的高并发任务执行架构设计 | 架构篇

演化阶段二

渐渐的,你设计的引擎还不错。那么新的挑战来了。


1、更多的业务方找到你,希望也使用你的项目进行任务制作,但是他们并不想共享资源,而是希望有自己的独立资源,和独立的队列。但并不是所有的资源都需要独立,一些可以支持高并发的资源,是可以共享的。简而言之,更多的业务方,由业务方为维度的独立队列,独立和共享的资源分配。


2、业务方找到你,说如果把任务1的结果给到任务2,其实就能拿到我要的结果。问题来了,原子任务要具备可以编排成复杂任务的能力。


3、任务的状态过程无法监控。OK,任务状态机。


4、既然大家都需要对接你的项目,能不能提供标准的sdk,我只需要引入就可以完美的对接你的系统。


5、相同的任务参数,是不是制作出来的结果一致呢?那么是否需要增加结果缓存,降低对资源的消耗呢?


6、完正的生产项目必然需要将日志、告警等关键信息传递出来,一旦发生问题可以马上定位到问题的起因。


这些问题对于新人来说还是很有挑战的,需要对系统深层的含义有充足的理解。没事,我来好好来说下设计所需要掌握的知识点。



image.png

设计说明:


1、需要在资源表中区别资源类型,共享资源组所有业务组都可以使用,独立资源则资源具备业务标识。在执行引擎的队列管理中,也需要区分业务组,避免共用排队。这里给一个建议,共享的资源一定要是可以支持并发或者可以部署多个实例的,避免所有的业务组产品制作瘫痪。


2、增加了高级任务概念,高级任务可以将任意的原子任务进行组合编排,形成全新的任务。需要定义专属于TEE的语法规则。对语法规则引擎的开发,有一些建议。你可能会选择规则引擎,建议其实可以自己开发,毕竟语法不会太过复杂,没必要引入三方的引擎。


image.png


3、增加任务状态机,执行引擎在提交线程的同时,也想任务状态机提交任务线程信息。任务的进度状态可以同步给任务状态机中,同时一旦任务执行过长的时间,除了任务自己的超时机制外,也可由状态机的看门狗程序将卡死线程释放、资源回收。


4、研发属于TEE的SDK,作为内部系统不建议SDK增加鉴权模块。毕竟你对接的往往都是业务后端,鉴权不通过的话根本渗透不到TEE层面。给开发SDK一些建议,尽量引用较少的包,避免业务端引入带来的包冲突。SDK也需要添加一些回调Consumer或者Function,尽可能让业务端对接起来代码简单。


5、增加了缓存策略,可以设想一下,大部分情况下,相同的参数制作出来的结果也必然相同。使用redis,将任务参数与任务结果进行缓存,主键可以采用任务参数的MD5值。任务在提交给任务执行引擎前,检查缓存中是否已经存在结果。缓存的过期时间按照具体情况而定。


image.png


6、增加日志系统和监控系统的对接,状态机与任务执行中的信息接入到日志系统中。对于日志系统的建议是,最好采用成熟的ELK架构。可以考虑两种方式


a、将日志异步推送到消息队列(例如:kafka),使用flink将kafka存入es。


b、使用logstash将日志内容清洗处理,推送到es。


两种方式都可以,但是一定要异步推送日志,避免任务阻塞。


告警系统的接入可以使用Prometheus,将TEE的指标信息开放出来,特别是告警信息。在Prometheus的告警监控规则中,可以将告警信息按照某些策略发送邮件或者短信,通知运维人员。


image.png


小结:


做到这里,我们再看看我们的技术架构图,是不是感到很满足。但是这真的够了吗?


演化阶段三

随着业务愈发繁重,一个新的问题出现。


1、TEE在本机运行很顺利,但是每个任务都是需要消耗线程的,单台模式线程必然不是无限的,总有吃满的时候。问题来了,TEE得支持分布式部署结构。但是有资源管理的存在,你无法通过加实例的方式来实现,因为资源调度必然混乱。


2、假设TEE挂掉,则等于业务组此刻提交的任务均失败,容灾机制需要建立。


到了这一步,很多小伙伴可能觉着一阵头大,分布式不是大数据的东西吗?不是的,不是大数据就不能分布式部署吗?就不能有主从节点吗?就不能有注册中心吗?要跨过内心的固有思想,我们往下看。


image.png


设计说明:


1、需要先将TEE项目做一下代码分解,将管理调度模块与任务执行模块拆解开了。消耗性能和线程较高的是任务执行模块,定义为TEE执行节点。消耗性能和线程较低,却需要参数校验、任务封装、资源调度、队列管理的是管理调度模块,定义为TEE管理节点。


2、TEE执行节点可以多实例,形成节点池。管理节点可以考虑做成共享任务队列的管理池。这里有个难点,如何共享任务队列。建议使用zookeeper或者缓存方式,但是不管哪种方式都要注意使用集群,避免单点故障导致队列数据丢失。


3、关于注册中心,可以使用开源组件,nacos、zookeeper都可以。在该架构设计中,其实注册中心并没有太多功能,如果你对自己有信心,可以尝试自己写一个注册中心,核心功能就是服务注册与心跳检测。可以用netty架构做一做,提高一下自己的代码能力。


image.png


4、在管理池的调用方面,增加网关代理,可以使用nginx、konga等。主要功能是业务端调用的时候,随机打到管理节点上,就算一个管理节点挂了,也不会影响使用,保证了生产线的稳定。


小结:


分布式架构,主从节点模式也好、哨兵模式也好、选举模式也好,按照自己的业务需求选择最适合自己的。不是大数据才有分布式,它是一种设计思想,要知道开发大数据组件的大佬们,也是一行行java写出来的。大佬们可以,为什么你不可以呢?


代码设计

在着手开发该系统的时候,我给大家一些代码开发的建议:


1、定时任务的实现,从最简单的while死循环加sleep,到定时线程池,或者springboot的@Scheduled注解,都可以实现。我在这里推荐一下时间轮算法TimeWheel,有兴趣的可以去了解一下。


2、异步消息处理,如果你只是想在项目内部使用消息总线,推荐使用guava包内的EventBus。按照消息的数量级,考虑使用RabbitMQ或者Kafka作为消息中间件。


3、任务执行,推荐使用CompletableFuture进行异步非阻塞任务编程。


4、在资源的使用中,可能存在多种协议类型http、ws、tcp等。所以代码设计中,尽可能提供完整全面的协议工具类。


总结

最近和一个同事闲聊的时候,他和我说了说最近面试高级研发的情况。总结一下,现在想招一个做过高并发场景的太难了,大部分人选只做业务相关。这让我想到了十年前,我刚工作的时候。那时候没有那么多框架,大部分功能需要看很多资料研究底层的原理与算法。随着软件行业的日益成熟,从以前拿着谷歌翻译看国外的组建说明,到从阿里云直接对接功能,软件研发的成本和时间也在大大缩短。渐渐失去了研究分析的动力,框架什么都有为什么要抓破脑袋自己写。


怎么成长?怎么进步?


上面给出的架构图,看上去都挺好理解。但真要自己去代码实现,中间各个环节出现的问题真的好解决吗?冰冻三尺,非一日之寒。没有日积月累的学习,是很难成功的。不要惧怕那些你看上去遥远的东西,获取你的几个晚上的学习,它就成了你最趁手的武器。对学习而言,难的永远不是过程,而是踏出第一步。




高并发任务执行架构中,有一个模块看上去很不起眼,但是在你研发的过程就会发现他会给你制造大麻烦-资源调度。以后有时间我会单独做一篇关于资源调度的架构设计,与大家说道说道里面的坑。


最后说一句:为什么不ban猛犸?

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
相关文章
|
6天前
|
缓存 NoSQL Java
秒杀圣经:10Wqps高并发秒杀,16大架构杀招,帮你秒变架构师 (1)
高并发下,如何设计秒杀系统?这是一个高频面试题。40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试Shopee时遇到了这个问题,未能很好地回答,导致面试失败。为此,尼恩进行了系统化、体系化的梳理,帮助大家提升“技术肌肉”,让面试官刮目相看。秒杀系统设计涉及16个架构要点,涵盖业务架构、流量架构、异步架构、分层架构、缓存架构、库存扣减、MQ异步处理、限流、熔断、降级、存储架构等多个方面。掌握这些要点,可以有效应对高并发场景下的秒杀系统设计挑战。
秒杀圣经:10Wqps高并发秒杀,16大架构杀招,帮你秒变架构师 (1)
|
11天前
|
消息中间件 运维 数据库
架构设计之解析CQRS架构模式!
架构设计之解析CQRS架构模式!
架构设计之解析CQRS架构模式!
|
2月前
|
消息中间件 存储 监控
Django后端架构开发:Celery异步调优,任务队列和调度
Django后端架构开发:Celery异步调优,任务队列和调度
56 1
|
2月前
|
监控 安全 中间件
Python Django 后端架构开发: 中间件架构设计
Python Django 后端架构开发: 中间件架构设计
33 1
|
2月前
|
存储 缓存 负载均衡
高并发系统架构的设计挑战与应对策略
【8月更文挑战第18天】高并发系统架构设计是一项复杂而重要的任务。面对性能瓶颈、稳定性与可靠性、并发控制和可扩展性等挑战,开发人员需要采取一系列有效的策略和技术手段来应对。通过负载均衡、缓存技术、数据库优化、异步处理、并发控制、弹性设计及监控与调优等手段,可以设计出高性能、高可用和高可扩展性的高并发系统架构,为用户提供优质的服务体验。
|
2月前
|
存储 缓存 Cloud Native
MPP架构数据仓库使用问题之ADB PG相比Greenplum的HAWQ在架构设计上有什么不同
MPP架构数据仓库使用问题之ADB PG相比Greenplum的HAWQ在架构设计上有什么不同
|
3月前
|
开发者 Sentinel 微服务
高并发架构设计三大利器:缓存、限流和降级问题之降级策略中的有限状态机的三种状态切换的问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之降级策略中的有限状态机的三种状态切换的问题如何解决
|
3月前
|
监控 应用服务中间件 nginx
高并发架构设计三大利器:缓存、限流和降级问题之Nginx的并发连接数计数的问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之Nginx的并发连接数计数的问题如何解决
|
5月前
|
消息中间件 Java Linux
2024年最全BATJ真题突击:Java基础+JVM+分布式高并发+网络编程+Linux(1),2024年最新意外的惊喜
2024年最全BATJ真题突击:Java基础+JVM+分布式高并发+网络编程+Linux(1),2024年最新意外的惊喜
|
4月前
|
缓存 NoSQL Java
Java高并发实战:利用线程池和Redis实现高效数据入库
Java高并发实战:利用线程池和Redis实现高效数据入库
456 0