架构设计
文章平均质量分 78
fpcc
行之苟有恒,久久自芬芳!
展开
-
一步一步写线程之十五协程
人难得是选择,选择是最痛苦的。但一旦选择完成,朝着方向前进,其实反而没有什么可痛苦的了。今天讲协程,没有继续于以往的技术实现的原理和实现的框架或者应用的方法,而是从另外一个角度分析其在计算机发展过程上的定位。言简意浅,与诸君共勉!原创 2024-06-16 14:43:36 · 602 阅读 · 0 评论 -
一步一步写线程之十三队列间的消息通知
其实队列的处理,不光有这种细节需要处理,包括内存大小的处理,是否提前处理,都是需要考虑的。正如前面所说,一个队列的设计,不仅仅是一个算法的问题,可能涉及到很多的技术知识和相关的难点。如何能够综合运用这些知识适配开发场景,就是对设计师的一个考验了。原创 2024-06-01 08:19:11 · 454 阅读 · 1 评论 -
跟我学C++中级篇——封装对象的实践
面向对象编程是一种非常广泛的编译方式,很多开发者可能对它是既了解又不了解。对一些基础的知识会用,但又不知道是否用得合适,能不能有一个标准来判定。其实这恰恰表明对面向对象编程还是掌握的不够深入。一切设计没有标准只有原则,这也意味着,实际场景下,在考虑原则的同时,更要考虑实际的需求进行适当的取舍。最好的设计方法是没有的,只有最合适的设计方法。原创 2024-05-11 21:25:30 · 581 阅读 · 4 评论 -
架构设计杂谈
架构设计和思想这些东西,是非常不愿意谈的。一个是网上和实际的书本上资料太多;而另外一个就是,这些东西是需要大量的编程实践来支撑的(这也意味着不同的环境发展可能产生不同思想体系)。换句话说,对一个没有任何编程经验或者说编程经验少得可怜的人来说,谈这些根本没有任何意义。那么有人说,我好好的编程,搞这个十几年,不就有了架构和设计的思想体系了么?大错。编程经验是架构设计的一个必要条件而已。大家都明白道理,但是一真正涉及到自己,就拎不清楚了。原创 2024-04-27 10:46:23 · 495 阅读 · 2 评论 -
一步一步写线程之九线程池任务的窃取
对绝大多数软件人员而言,其实很多技术拼到最后不是拼设计者的聪明才智,拼的是经验。特别是对于工程类的开发更是如此。而软件开发领域,基本以现有的成熟的技术为主,这点就更突出。随着软件的规模越大,经验的要求越高。很多开发者可能终其一生都遇不到所谓的千万并发,那希望他设计一个支持千万并发的服务,就是一个不可能的任务,其它情况亦是如此。所以开发者们勿需气馁,把基础打好,认真学习,找机会就上。不断总结经验得失,技术就会越来越磨炼得精粹。原创 2024-04-20 10:23:28 · 645 阅读 · 1 评论 -
一步一步写线程之八线程池的完善之二数据结构封装
在分析完成数据结构的封装后,基本也就明白了在多线程中如何使用STL中的容器。但是,一般对线程安全的操作控制,都是使用锁。不管锁的粒度是大是小,对性能的影响一般来说都是比较大的。而多线程特别是线程池恰恰又都是在高性能的场景下应用,所以这时就需要开发者认真考虑加锁引起的性能损失。当然,在后面可以考虑在某些情况下使用无锁编程技术,让数据的处理更快捷。但无锁编程也不是万能的,它也是有其相对的应用场景。万流归宗,还是需要开发者对整体技术的把握和实际应用场景进行综合考虑。原创 2024-03-31 08:45:13 · 607 阅读 · 2 评论 -
一步一步写线程之六数据通信并发模型Actor和CSP
数据通信模型和多线程编程本身是密不可分的,原则上来讲,谈及多线程编程一般就是要实现多线程之间的通信,否则多线程技术本身并没有什么可讨论的。一个技术其实如何能真得可以深入掌握进去,其实就是一个生态,围绕着它或近或远或紧密或间疏的有着各种各样的其它技术与之互相配合。挨过来一样,在其它的技术上,可能学习的这个技术又是其生态中的一环。明白了吧,你中有我,我中有你,这才最终形成了更广义上的计算机技术。原创 2024-02-05 22:46:03 · 679 阅读 · 2 评论 -
一步一步写线程之五线程池的模型之二半同步半异步模型
在目前可预见的技术范围内,完全无锁的可能性几乎是零,而且相对于有锁编程,无锁编程的要件有点多,这也导致无锁编程更多的应用于基础层。而且大多的应用场景其实对于效率的敏感性并没有到不可忍受的地步,所以这也是HA/HS应用非常广泛的原因。大家可以看看这篇文章“An Architectural Pattern for Efficient and Well-structured Concurrent I/O”,会有更好的体会心得。原创 2024-01-27 11:47:29 · 959 阅读 · 0 评论 -
一步一步写线程之五线程池的模型之一领导者追随者模型
学习理论就是学习别人抽象出来的知识,然后再把学习到的知识理论应用到自己的工作中。如此往复循环,慢慢就会对这些知识有了更深刻的理解,也就可以在此基础上自己抽象自己的理论和知识体系来指导自己的实际工作。武林中不是有一句话:“练拳不练功,到老一场空;练功不练拳,到老也枉然!计算技术亦是如此。原创 2024-01-20 22:45:27 · 1076 阅读 · 2 评论 -
领域驱动设计——DDD的整体设计流程
DDD整体设计应用的流程和方式原创 2023-03-23 21:15:07 · 741 阅读 · 0 评论 -
领域驱动设计——柔性设计
对DDD领域驱动设计听 柔性设计进行分析说明原创 2023-03-18 08:45:34 · 626 阅读 · 0 评论 -
跟我学c++高级篇——模板元编程之三Policy续
对元编程中的策略设计进行分析说明原创 2023-02-24 11:10:35 · 187 阅读 · 0 评论 -
跟我学c++中级篇——类型擦除的应用
对c++中的类型擦除的应用举一个例子的演进说明原创 2022-12-31 16:07:58 · 1125 阅读 · 3 评论 -
领域驱动设计——领域的重构
对重构在DDD中的作用进行分析说明原创 2022-11-21 15:17:30 · 507 阅读 · 0 评论 -
领域驱动设计——精炼
对领域的精炼进行说明分析原创 2022-11-20 13:36:29 · 355 阅读 · 0 评论 -
领域驱动设计——模型的完整性设计
对领域设计的完整性进行分析和说明原创 2022-09-26 17:29:18 · 643 阅读 · 0 评论 -
领域驱动设计——设计模式的应用
对设计模式在领域驱动设计上的应用做一个基本的分析原创 2022-09-24 12:02:59 · 491 阅读 · 0 评论 -
领域驱动设计——柔性设计
对领域设计中的柔性设计进行分析和说明原创 2022-09-22 10:40:04 · 1616 阅读 · 0 评论 -
领域驱动设计——领域对象的生命周期
对DDD设计中对象的生命周期进行分析和说明原创 2022-09-06 16:49:07 · 401 阅读 · 0 评论 -
领域驱动设计——模型
对领域设计中的模型设计基础元素进行说明原创 2022-08-22 19:02:41 · 486 阅读 · 0 评论 -
领域驱动设计——领域的整体设计
对领域驱动设计的整体设计进行一个宏观的说明原创 2022-08-11 15:44:27 · 248 阅读 · 0 评论 -
领域驱动设计——MDD
对MDD进行一个总体的介绍原创 2022-08-04 17:05:54 · 387 阅读 · 4 评论 -
领域驱动设计
对领域设计进行一个整体上的介绍和分析原创 2022-07-21 17:11:08 · 849 阅读 · 0 评论 -
面向驱动设计
对面向驱动设计做一个整体的概要说明原创 2022-07-11 16:33:29 · 150 阅读 · 0 评论 -
多核和多CPU编程——ABA的问题
一、无锁编程在前面已经多次提到过无锁编程或者说非阻塞算法,无锁编程的原理就是compare-and-swap,一般通过在一个循环里比较值的变化来判断原有的内存值和现在的内存值是否相同,如果相同把新的值赋值给原有内存值(是指在多线程操作中),即原有内存值为old(预期值),新的数据值为new(希望值),现内存值为cur(一般为原子变量),比较old和cur,如果相等,则把new赋值old(old==new),否则啥都不干。看下面的一个例子:#include <atomic> templa原创 2022-04-25 09:52:12 · 159 阅读 · 0 评论 -
多核和多CPU编程——任务调度
一、调度算法分类任务分解后,具体如何安排任务到硬件上执行,就需要对任务执行更高效更便捷进行分析。基本上,就可以形成算法模型。任务并行的调度算法基本有三大类:1、树结构算法其实就是任务执行是有先后顺序和依赖相关的,这些就可以通过一个树的遍历来完成。2、Fork-join算法并行任务调度算法中很常见的,其主要核心是任务窃取(也就是前面提到的线程的窃取)3、图调度算法图调度算法和树算法基本原理有些类似,只是具体的调度方式有所不同。在前面的DAG中已经分析过,主要是在形成的任务图中,进行分层并行。二原创 2022-04-21 10:26:39 · 2130 阅读 · 0 评论 -
多核和多CPU编程——任务的分解
一、任务分解任务的分解,是实现并行最容易理解和最容易为开发者所接受的。所有的软件的需求,都是从实际应用场景而来,而实际的应用场景中,哪些任务可以分解,分解后子任务间的依赖性,哪些子任务(组)可以独立执行不依赖其它子任务。这些都是软件实际开发中能不能够更高效的利用并行编程的前提和手段。任务分解成N个子任务,是并行的最基本的方式。二、分解的方法任务的并行,可以从最简单的任务分解开始,任务分解有以下几种常见的方式:1、简单的任务并行分解最简单的任务分解,其实是从最初的需求中,分解出可以独立执行的任务。原创 2022-04-18 11:25:42 · 976 阅读 · 0 评论 -
多核和多CPU编程——有向无环图DAG应用
一、有向无环图Directed Acyclic Graph,DAG,有向无环图。如果一个有向图无法从某个顶点出发经过若干条边回到该点,则这个图是一个有向无环图(DAG图)。接触过算法数据结构和离散数学的,基本都知道这个东西。图论是一个专门的数学分支这里不进行讨论,DAG的应用范围非常广,常见的如算法和数据结构中的最短路径问题,区块链的共识相关,包括本文要讲的任务调度问题。看一个基本的有向无环图的:如果有对DAG感兴趣的,可以找本数学书籍看看。二、DAG任务分解任务的分解本身就是一个复杂的问题。当然原创 2022-04-16 09:32:27 · 744 阅读 · 0 评论 -
死锁和活锁
一、多线程的资源竞争多线程编写的复杂度其实就是体现在资源的竞争控制上,这个在以前的文章中反复提到过。资源竞争主要是两种情况,数据竞争和执行任务竞争。通过前面的文章介绍可以知道,锁可以解决这些问题,但如何更好的处理竞争问题并达到最优,这就需要策略和算法了。包括提到的无锁编程,其实也是一种解决的策略。无论是在单核亦是多核的情况下,资源的竞争总是不可避免的,所以对资源的控制就是需要认真对待的一个问题。二、死锁所谓死锁,其实就是“集合中的每一个进程都在等待只能由本集合中的其他进程才能引发的事件,那么该组进程原创 2022-04-15 18:16:24 · 5317 阅读 · 0 评论 -
多核和多CPU编程——并行(发)程序的设计模式
一、并发和并行的处理机制在实际的应用场景中,并行和并发的现象是常见的,因此,在不断的发展过程中,发现其需要解决的问题可以分成三种类型:1、工作任务的分解工作任务指的是具体的任务有什么,可不可以划分成独立的执行任务,可不可以每个独立任务同时运行。比如几个监控页面同时显示问题。2、数据的分解这个就非常常见了,比如要同时从两个表里拿数据,可不可以用两个线程同时进行。3、数据流的分解数据流的分解,其实更类似于任务和数据的处理流程的分解,典型的如CPU的流水线设计。基本上,通过这三种类型的处理机制分析原创 2022-04-07 17:55:05 · 1976 阅读 · 0 评论 -
多核和多CPU编程——并行计算的加速比
一、并行计算的衡量并行计算和串行计算到底哪个好,或者说并行计算中哪个优哪个劣?这需要有一些衡量的标准:通过上述的参数的对比,可以在整体上有一个性能的参考。二、加速比(Speedup)加速比就是指并行计算比传统的串行执行速度提高了多少倍。即:加速比(Sn)=单处理器最优算法串行时间/多核并行计算时间它涉及到两个定律:1、Amdahl定律Gene Amdahl于1967年提出了这个定律,用于在并行计算相对于最优串行算法在性能上提升的理论上的最大值:上面的主要说明如下:n: 并行系统中处理原创 2022-03-29 09:48:02 · 9664 阅读 · 0 评论 -
多核和多CPU编程——基础硬件说明
一、硬件的发展CPU的发展在经过了摩尔定律的快速迭代后,有了长足的进步。但俗话说的好,一个好汉三个帮,单体的CPU发展,最终还是遇到了瓶颈。无论是超标量还是流水设计,都无法超越此瓶颈。从实际情况来看,多CPU要比多核出现的早,毕竟多CPU要比多核好设计架构一些。而随后,在单个芯片上集成多个CPU核心(CMP)也就是常说的多核技术开始迅速发展起来。现代的多核心处理器,是一种内存共享的技术,CPU一般为对称状态,所以叫做共享存储的对称多处理器(SMT,symmetric multi-processor)。多原创 2022-03-28 10:38:43 · 1376 阅读 · 2 评论 -
多核和多CPU编程——并行计算模型
一、几种并发模型一般来说,模型是抽象出来具有某些普遍特征的单元。它可能是一个(组)公式,也可能是一个算法等等。目前比较常见的几个模型有如下几个:1、PRAMPRAM(Parallel Random Access Machine,随机存取并行机器)模型是一种抽象的并行计算模型,即共享存储的SIMD模型。其假定有一个无限容量大的共享存储器,具有N个(N可达无限)功能、架构相同的处理器,相关处理器随时可以通过共享存储单元相互交互数据。根据处理器对共享存储单元同时读、同时写的限制,PRAM模型可以分为下面几种原创 2022-03-26 10:21:11 · 2356 阅读 · 0 评论 -
多核和多CPU编程——基本模式和库
一、基本模式1、MPIMPI(Message Passing Interface)消息传递接口是MPI论坛发布的一个支持C/C++/Fortran库。属于一种消息传递编程模式,它提供了一种与平台无关的消息传递程序标准。它主要有三种实现:mpich、chimp 和lam。这种模型适应性好,无论是多核、多CPU还是分布式集群都可以使用。缺点是复杂的进程通信导致对开发者的要求较高,而且需要进行通信间的控制。2、OpenMPOpenMP(Open Multi Processing)是由Open ARB发布的原创 2022-03-24 17:14:53 · 4733 阅读 · 0 评论 -
多核和多CPU编程——基础数据结构
一、并发并行计算常用的数据结构其实数据结构是通用的,但是在并行计算中,一般需要对任务和数据进行拆解,以最大化的达到并行执行的目的。在这个过程中,有一些数据结构就更适合在这个场合下应用,这也是介绍这些常用数据结构的目的。一般来说,在并行设计开发和应用中,常用的数据结构包括:数组、链表、哈希和树。但是,这并不代表其它的数据结构不能在并行设计中使用。只是说,上面几种应用的比较多而已。同样,这几种数据结构并不是说单纯一个就包打天下,经常是几种混合在一起应用,你中有我,我中有你的一种共生共用的态势,这样能更好的实原创 2022-03-22 15:27:00 · 1241 阅读 · 0 评论 -
多核和多CPU编程——多线程的资源控制
一、多线程下的资源控制在分析多核及多CPU编程前,就不得不先回到最初的单核编程上,早期的电脑直到现在的一些简单的单片机,其实都是使用的一个CPU串行的来执行任务。就好比人们去一台ATM上取款,只能一个个的来操作,而不能说你操作一半时换另外一个人再操作ATM。但是这样就会出现一个问题,如果一个人占用时间过长怎么办,后面的人即使只想查询一下,都得等好长的时间。最初电脑使用纸带也和上面一样,直到后来为了解决这个问题,就出现了多任务系统,直至后来出现PC,出现了现在基于抢占式的CPU时间片轮转的方式来调度线(进原创 2022-03-20 19:34:20 · 1503 阅读 · 4 评论 -
并发模型分析
一、并发和并行这里首先要把并发(concurrency)和并行(parallellism)区分一下。并行一般只多个CPU或者多台计算机(分布式)同时运行程序,而并发一般是指在一台机器或者一颗CPU(可以多核心)来通过时间片模拟同时执行执行多个程序(但是从严格意义上来讲,如果多个程序被分配到不同的核心同时执行也是并行)。本篇只分析并发模型。并发的模型分为两大类:一类是多线程并发;另外一类是多进程并发。而目前主流的基本都是多线程并发,当然,协程也跟了上来,但这现在不是重点。而目前比较通用的两大类:Acto原创 2021-10-04 16:21:52 · 228 阅读 · 0 评论 -
分库分表的工具
分库分表的工具最近杂事太忙,更新急剧慢了下来,没办法,只能适应中。昨天忽然想起来件事儿,原来在一家公司面试时,有人问过,分表分库的时候儿用什么工具,说实话,还真没用过。回来看了看相关工具,这时候儿才明白了人家问的意思,是说在大数据量已成为现实时,如何分库分表。记得原来我们在电力做的时候儿,几十G的库,也不分表,看来真LOW了。不说没用的,回到正题。1、金山的Kingshardhtt原创 2017-09-19 11:12:01 · 2885 阅读 · 0 评论 -
微服务之二springClound
提到微服务就不得提到springclound,它是基于springboot的一个微服务的开发工具,包括很多的子项目,有配置(spring cloud config),消息总线(Spring cloud bus),核心组件(spring cloud netflix)等待,这里不一一列举和介绍,用到就展开一下。Spring cloud更强调用httprestful他类似消息队列的机制来达到消息的交换。...原创 2018-07-01 07:34:02 · 606 阅读 · 0 评论 -
微服务之三springBoot操作数据库
依照第一篇文章创建一个数据操作的工程,这里是展现操作mysql数据库的。采用JPA是一种比较普通的使用方法,就从这里开始。当然首先的是要引进对MYSQL的MAVEN依赖,在POM文件中增加下面的几个引用: <dependency> <groupId>org.springframework.boot</groupId> ...原创 2018-07-01 07:35:07 · 781 阅读 · 0 评论