第七章、并发编程实战项目

2023-11-11

一、并发任务执行框架

架构师是什么?

在一个软件项目开发过程中,将客户的需求转换为规范的开发计划及文本,并制定这个项目的总体架构,指导整个开发团队完成这个计划的那个人,就是 架构师。一般是一个项目里的最资深的专业技术人员,可以说架构师首先一定是个Java高级开发人员。

主要职责

主要是架构设计、软件开发,具体来说包括

1、确认需求

在项目开发过程中,架构师是在需求规格说明书完成后介入的,需求规格说明书必须得到架构师的认可。架构师需要和分析人员反复交流,以保证自己完整并准确地理解用户需求。

2、系统分解

依据用户需求,整个系统是否需要分层,如何进行分层,架构师将系统整体分解为更小的子系统和组件,从而形成不同的逻辑层或服务。随后,架构师会确定各层的接口,层与层相互之间的关系。架构师不仅要对整个系统分层,进行“纵向”分解,还要对同一逻辑层分块,进行“横向”分解。
软件架构师的功力基本体现于此,这是一项相对复杂的工作。

3、技术选型

架构师通过对系统的一系列的分解,最终形成了软件的整体架构。技术选择主要取决于软件架构,就是不断找到系统的瓶颈和弱点,采用分而治之、缓存、异步、集群等手段逐渐化解,并平衡处理系统各项要求(性能、安全、可用性、伸缩性、扩展性…)的过程。由此形成了架构。

什么样的架构才是好的架构?
答案:是适用于当前业务和团队成员,并保留适当前瞻性(最多半年的业务增长)的就是好架构。
Web Server运行在Windows上还是Linux上?数据库采用MSSql、Oracle还是Mysql?需要不需要采用MVC或者Spring等轻量级的框架?前端采用富客户端还是瘦客户端方式?类似的工作,都需要在这个阶段提出,并进行评估。
架构师对产品和技术的选型仅仅限于评估,没有决定权,最终的决定权归项目经理。架构师提出的技术方案为项目经理提供了重要的参考信息,项目经理会从项目预算、人力资源、时间进度等实际情况进行权衡,最终进行确认。

4、制定技术规格说明

架构师在项目开发过程中,是技术权威。他需要协调所有的开发人员,与开发人员一直保持沟通,始终保证开发者依照它的架构意图去实现各项功能。

5、核心、关键或者难点任务的开发

6、开发管理

通常还需要承担一些管理职能:规划产品路线、估算人力资源和时间资源、安排人员职责分工,确定计划里程碑点、指导工程师工作、过程风险评估与控制等。这些管理事务需要对产品技术架构、功能模块划分、技术风险都熟悉的架构师参与或直接负责。

7、沟通协调

项目目组内外各种角色沟通协调,可以说架构师相当多的时间用在和人打交道上。处理好人的关系对架构和项目的成功至关重要。

架构师的方方面面

作用

负责系统架构设计,同时也要负责架构的实施落地、演化发展、推广重构。
充当救火队员的角色,系统出现故障或者“灵异现象”,会请他们出马解决。
架构师对某一领域有较深刻的认识,有时候甚至是坚定的技术信仰,乐于同他人分享自己的知识,希望能够推广自己的技术主张。

效果

不管项目有多么艰难复杂,只要有优秀的架构师,大家就会坚信,项目一定能顺利完成。优秀的架构师带给项目组的,不只是技术和方法,更重要的是必胜的信念。这种信念是架构师自己积累起来的气场和影响力。
架构师通常会开发项目中最具技木难度和挑战性的模块,从而为整个项目的顺利进行铺平道路。这些模块包括基础框架、公共组件、通用服务等平台类产品。在大型互联网应用中,基础服务承担着海量的数据存储和核心业务处理服务,有许多挑战性的工作。所以我们的实战就是实现一个基础框架和对一个项目进行性能优化。

二、实现一个基础框架

1、需求的产生和分析

公司里有两个项目组,考试组有批量的离线文档要生成,题库组则经常有批量的题目进行排重和根据条件批量修改题目的内容。架构组通过对实际的上线产品进行用户调查,发现这些功能在实际使用时,用户都反应速度很慢,而且提交任务后,不知道任务的进行情况,做没做?做到哪一步了?有哪些成功?哪些失败了?都一概不知道。
架构组和实际的开发人员沟通,他们都说,因为前端提交任务到Web后台以后,是一次要处理多个文档和题目,所以速度快不起来。提示用多线程进行改进,实际的开发人员表示多线程没有用过,不知道如何使用,也担心用不好。综合以上情况,架构组决定在公司的基础构件库中提供一个并发任务执行框架,以解决上述用户和业务开发人员的痛点:
1)对批量型任务提供统一的开发接口
2)在使用上尽可能的对业务开发人员友好
3)要求可以查询批量任务的执行进度

2、需要做什么

要实现这么一个批量任务并发执行的框架,我们来分析一下我们要做些什么?

2.1、批量任务,为提高性能:

必然的我们要使用java里的多线程,为了在使用上尽可能的对业务开发人员友好和简单,需要屏蔽一些底层java并发编程中的细节,让他们不需要去了解并发容器,阻塞队列,异步任务,线程安全等等方面的知识,只要专心于自己的业务处理即可。

2.2、每个批量任务拥有自己的上下文环境:

因为一个项目组里同时要处理的批量任务可能有多个,比如考试组,可能就会有不同的学校的批量的离线文档生成,而题库组则会不同的学科都会有老师同时进行工作,因此需要一个并发安全的容器保存每个任务的属性信息,

2.3、自动清除已完成和过期任务

因为要提供进度查询,系统需要在内存中维护每个任务的进度信息以供查询,但是这种查询又是有时间限制的,一个任务完成一段时间后,就不再提供进度查询了,则就需要我们自动清除已完成和过期任务,用定时轮询吗?
在这里插入图片描述

3、具体实现

可查询进度的并发任务执行框架

3.1、用户业务方法的结果?

一个方法执行的结果有几种可能?三种,成功:按预想的流程出了结果;失败:按按预想的流程没出结果;异常:没按预想的流程抛出了预料之外的错误。因此我们定义了一个枚举,表示这三种情况,

public enum TaskResultType {
	success,/*方法执行完成,业务结果也正确*/
	failure,/*方法执行完成,业务结果错误*/
	exception/*方法执行抛出了异常*/
}

对于方法的业务执行结果,返回值有很多种可能,基本类型,系统定义的对象类型,用户自定义的对象类型都是存在的,我们需要用泛型来说表示这个结果。同时方法执行失败了,我们还需要告诉用户或者业务开发人员,失败的原因,我们再定义了一个任务的结果类。

public class TaskResult<R> {
	// 方法执行结果
	private final TaskResultType resultType;
	// 方法执行后的结果数据
	private final R returnValue;
	// 如果方法失败,这里可以填充原因
	private final String reason;

3.2、如何执行用户的业务方法?

我们是个框架,用户的业务各种各样,都要放到我们框架里执行,怎么办?当然是定义个接口,我们的框架就只执行这个方法,而使用我们框架的业务方都应该来实现这个接口,当然因为用户业务的数据多样性,意味着我们这个方法的参数也应该用泛型。

public interface ITaskProcesser<T,R> {
	TaskResult<R> executeTask(T data);
}

3.3、用户如何提交他的工作和查询任务进度?

用户在前端提交了工作(JOB)到后台,

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第七章、并发编程实战项目 的相关文章

  • VScode无法启动问题解决思路

    VScode无法启动问题解决 过程 后记 过程 在不知道为什么的情况下 VScode启动没有反应 然后尝试解决问题 进行以下尝试 重启 重装 卸载注册表重装 删除配置重装 均不行 然后本来想打算重装系统了 最后还是接着搞一搞 然后就打算用P
  • MySQL字符集设置

    ERROR 1366 HY000 Incorrect string value错误解决办法 通过命令查看Mysql默认字符集的相关设置 mysql gt SHOW VARIABLES LIKE character Variable name
  • 9.Java面向对象基础(上)

    个人简介 作者简介 大家好 我是W chuanqi 一个编程爱好者 个人主页 W chaunqi 支持我 点赞 收藏 留言 愿你我共勉 没有什么比勇气更温文尔雅 没有什么比怯懦更冷酷无情 文章目录 面向对象 上 1 面向对象的思想 1 1
  • 前端开发工程师

    岗位职责 1 负责网站前端页面的开发工作 2 根据产品需求 分析并给出最优的页面前端结构解决方案 3 与设计师合作完成网站页面前端的特效和最新的应用 4 与产品经理合作完成前端网站交互效果的实现 职位要求 1 掌握各种修图软件 如PS Fi
  • 数据库系统工程师真题及详解(2015~2021)

    2015 2021年软考中级数据库系统工程师真题及答案详解 链接 https pan baidu com s 1VMXyrl1cBX Gwoz0EU Dow pwd nt0a 提取码 nt0a 据了解 考试试题大部分与历年真题相近 祝大家软
  • 计组

    目录 一 知识点 1 寻址方式什么 2 根据操作数所在的位置 都有哪些寻址方式 3 直接寻址 4 立即寻址 5 隐含寻址 6 相对寻址 7 寄存器 8 寄存器 寄存器型 RR 寄存器 存储器型 RS 和存储器 存储器型 SS 9 基址寻址方
  • 类成员函数的重载、覆盖和隐藏区别

    转自 http blog csdn net yanjun 1982 archive 2005 09 02 470405 aspx 这三个概念都是与OO中的多态有关系的 如果单是区别重载与覆盖这两个概念是比较容易的 但是隐藏这一概念却使问题变
  • 理清概念:同步与异步

    广义的同步与异步 在广义上 同步和异步是描述两个或多个事件 操作或进程之间的关系 同步意味着事件 操作或进程是有序的 一个操作必须在另一个操作完成后开始执行 异步则意味着事件 操作或进程是独立的 可以在不等待其他操作完成的情况下开始执行 同
  • CentOS7 RPM包管理功能总结及示例

    RPM是红帽软件包管理器 主要用来对RPM包进行安装 升级 卸载 查询 校验和数据库维护的管理操作 安装 语法 rpm i install install options PACKAGE FILE i 安装一个新包 PACKAGE FILE
  • 关于C#中get和set

    转自 http blog sina com cn s blog 82526aa60100txtx html 在程序中经常碰到get set 不甚明白 在网上查询时也说的迷迷糊糊 所以整理下 以学的明白透彻点 有两个类person publi
  • stm32串口驱动和esp8266的使用

    写在前面 本文并不对相关知识进行讲解 只是这次的实验课要实现的任务有些复杂 我也踩了一些坑 对代码实现思路进行复现和记录 并不是技术科普性文章 基础知识还是要自己有所掌握 1 stm32的串口通讯 开发板 stm32f407zgt6课程学习
  • 一文搞懂深度优先搜索(DFS)

    一 原理 深度优先搜索再得到一个新节点时立即对新节点进行遍历 从节点 0 出发开始遍历 得到到新节点 6 时 立马对新节点 6 进行遍历 得到新节点 4 如此反复以这种方式遍历新节点 直到没有新节点了 此时返回 返回到根节点 0 的情况是
  • 数据结构与算法(三):栈与队列

    一 栈 1 基本概念 2 栈的顺序存储结构 3 两栈共享空间 4 栈的链式存储结构 5 栈的应用 递归 二 队列 1 基本概念 2 队列的顺序存储结构 三 总结 上一篇 数据结构与算法 二 线性表 中介绍了数据结构中线性表的两种不同实现 顺
  • 反转链表+交换两个链表的节点

    目录 编辑 一 反转链表 1 题目描述 2 例子 3 题目接口 4 分析以及解题代码 1 迭代法 2 递归写法 二 两两交换两个链表中的节点 1 题目描述 2 例子 3 题目接口 4 题目分析以及解法 一 反转链表 1 题目描述 首先来看看
  • Chapter One : 开启 Python 之旅

    目录 1 计算机的组成 了解 2 计算机如何处理程序的 了解 3 编程语言 了解 4 了解 Python 4 1 Python 的版本 4 2 Python 的应用领域 5 搭建 Python 开发环境 5 1 下载并安装 Python 2
  • linux c 打印调用某函数的文件名与行

    只做记录 供自己翻 http www voidcn com article p ruuoijoc mn html
  • win全盘重分- DiskGenius

    因为最近找不到了太好的素材 来整理一下全盘重分的素材 全盘分区最好的是制作U盘启动器 在U盘的PE里进行分区 使用工具是相当简单的 PE使用的是冰封U启动 第一步打开DiskGenius软件 算是系统重装分区用的最多的也是最普遍的工具之一
  • 【概率论与数理统计】猴博士 笔记 p26-28 F、f的性质、一、二维连续型求期望、方差

    F f的性质 做法 上述公式的原理 做一些题目来练习套公式 例1 解 P X 2 F
  • Pycharm中如何配置已有的环境

    这篇是关于在pycharm中配置已经在anaconda中存在的虚拟环境 1 File settings 2 在设置弹窗中选择Project Interpreter 然后点击add 3 根据图操作 4 随后找到Anaconda中envs中想要

随机推荐

  • 2022年苹果开发者账号/AppleID如何更改绑定的手机号

    2022年苹果开发者账号 AppleID如何更改绑定的手机号 1 打开Apple ID 网址 登陆进去 https appleid apple com cn 2 点击编辑选项 将原来的手机号删除 然后添加受信任号码 点击完成 修改密码 修改
  • sendto: Network is unreachable问题的解决

    在用busybox生成根文件系统之后 进入系统ping外网是不能用的 因此需要修改一下几个文件 配置ip为固定 并且开机自动启动网卡 在 etc init d rcS中添加一下内容 网络开机自启动设置 ifconfig eth0 up ud
  • RabbitMQ整合SpringBoor以及RabbitMQ的延迟队列

    延迟队列的概念 前面介绍了死信队列 针对于ttl进入死信队列的情况 假如我们把前面的消费者一关闭 然后对所有的消息都进行设置过期时间 这样是不是就形成了一个延迟队列了 使用场景 比如订单超时关闭 假如我们使用定时任务 假如数据量很大的情况下
  • SpringBoot —— 搭建SpringBoot+Maven项目

    文章目录 前言 一 创建步骤 1 创建SpringBoot项目 选择JDK版本 2 填写包名和项目名 3 创建web项目 4 创建web项目 二 测试 1 配置maven 2 创建测试方法 前言 SpringBoot系列Demo代码 使用i
  • 【复盘与分享】第十一届泰迪杯B题:产品订单的数据分析与需求预测

    文章目录 题目 第一问 第二问 2 1 数据预处理 2 2 数据集分析 2 2 1 训练集 2 2 2 预测集 2 3 特征工程 2 4 模型建立 2 4 1 模型框架和评价指标 2 4 2 模型建立 2 4 3 误差分析和特征筛选 2 4
  • python设置绘图大小_解决Python图形界面中设置尺寸的问题

    Python有自己内置的标准GUI库 Tkinter 只要安装好Python就可以调用 今天学习到了图形界面设计的问题 刚开始就卡住了 为啥呢 就是用geometry size 设置窗口尺寸大小 如800X600 X 从哪里来成了问题 首先
  • 你若有心,我怎会无情

    人和人之间 全靠一颗心 情与情之间 全看一份真 一生很长 什么样的人都会遇到 有的人口蜜腹剑 嘴上跟你说着甜言蜜语 心里却盘算着利用你得到些什么 有的人虚伪自私 表面上跟你掏心掏肺 等你需要帮助的时候却转身离开 所以 看人 不能只看表面 也
  • 复制构造函数(拷贝构造函数)

    也许很多C 的初学者都知道什么是构造函数 但是对复制构造函数 copy constructor 却还很陌生 对于我来说 在写代码的时候能用得上复制构造函数的机会并不多 不过这并不说明复制构造函数没什么用 其实复制构造函数能解决一些我们常常会
  • #1062 - Duplicate entry '0' for key 'PRIMARY'—— mysql的小问题

    问题 1062 重复输入 0 原因 我估计可能是数据表中主键这一栏已经有一个为 0 了 一般出现这种问题是以int类型的字段在输入时没有输如数据 而int类型默认值为 0 而你之前第一条数据已经默认主键如 id为默认的 0 了 于是就报错说
  • java list有序还是无序_java的集合框架

    前言 使用java编程语言的开发人员 在日常开发过程中经常会使用到java的一些集合类 不过这些集合类太多 很多人对它们的特点和使用场景不是特别的了解 通过此文给大家总结一下这方面的知识 方便大家面试或者是初学者理解 Java集合类主要由C
  • 四均线交易系统

    策略说明 基于4均线系统进行判断交易 系统构成 5和20周期均线 3和10周期均线 构成的两组不同周期的均线组合 入场条件 当2组均线均成空头排列时且当前价低于上根BAR最低价入场 出场条件 1 小周期空头均线组合成多头排列 2 两组多头均
  • C++ 获取系统时间(微秒)

    int main 程序开始时间 std chrono time point
  • Python制作一款简单的乒乓球小游戏

    开发工具 Python版本 3 6 4 相关模块 pygame模块 以及一些Python自带的模块 相关文件 关注公众号 Python学习指南 回复 乒乓球 即可获取 环境搭建 pip安装需要的相关模块即可 原理简介 游戏规则 操作 玩家1
  • AWS SAA-C03 #49

    A company stores call transcript files on a monthly basis Users access the files randomly within 1 year of the call but
  • 虚拟机磁盘扩容

    1 前言 现在做开发时 虚拟机的使用很多 经常遇到这样的问题 当初创建虚拟机的时候开辟的磁盘空间比较小 随着虚拟机安装的软件越来越多所占的空间也越来越大 导致虚拟机的磁盘空间越来越少 甚至不够用 此时我们便可以对虚拟机的磁盘大小进行扩容 简
  • 中秋闲鱼卖货,月入过万的新玩法?

    中秋节越来越近了 都开始忙着走亲串友 人情社会关系要多走动 虽然大家都在忙着搞钱 但是逢年过节要停下脚步享受美好生活 月圆中秋思念满满每逢佳节倍思亲 在异国他乡的朋友因疫情不能回家团聚 但现在移动互联网给人们生活带来太多便捷 打电话语音视频
  • 获得用户输入的一个字符串,输出其中字符a的出现次数

    task19 获得用户输入的一个字符串 输出其中字符a的出现次数 name wangzilu date 2020 2 19 task 获得用户输入的一个字符串 输出其中字符a的出现次数 first way x str input pleas
  • shell 重定向到文件

    首先明确基本 gt dev null 输出到空设备 表示丢掉输出信息 2 gt 1 将输出到标准错误的信息输出到标准输出设备 通常是屏幕 有3个默认的i o 0 是标准输入 一般是键盘 1 是标准输出 一般是屏幕了 2 是标准错误 有时候屏
  • 编程笔记:Windows Forms in C#

    1 画线时遇到的奇怪问题 以下摘取部分代码 Graphics g null g CreateGraphics private void Form1 MouseMove object sender MouseEventArgs e 下面三行代
  • 第七章、并发编程实战项目

    一 并发任务执行框架 架构师是什么 在一个软件项目开发过程中 将客户的需求转换为规范的开发计划及文本 并制定这个项目的总体架构 指导整个开发团队完成这个计划的那个人 就是 架构师 一般是一个项目里的最资深的专业技术人员 可以说架构师首先一定