我的DDD实践之路:第一战

简介: 领域驱动设计(DDD)这个概念也是最近比较火的,我第一次接触到这个概念,是阿里云的架构师来我们公司交流的时候,当时留意了一下,后面在自己团队工作遇到痛点时才真正开始学习。

领域驱动设计(DDD)这个概念也是最近比较火的,我第一次接触到这个概念,是阿里云的架构师来我们公司交流的时候,当时留意了一下,后面在自己团队工作遇到痛点时才真正开始学习。

为什么选择DDD?

  1. 重构越来越频繁。每次重构都需要重新梳理业务、重新梳理数据结构,之前的代码也要一行一行的整理和对应,耗费的人力实在太大,甚至超过了重构能带来的好处。
  2. 代码越来越混乱。慢慢地,已经没法说清楚一个类是什么含义、一个方法是什么含义,大量的业务代码像过程一样揉杂在一起,即使写了注释,也难以理解。
  3. 团队协作变得困难。慢慢地,某一个开发写的代码,变得只有他自己能维护,其他人看不懂,没法参与进去。
  4. 缺少必要的数据。想要分析某些旧功能的数据时,发现当初设计这个功能的人只存了该功能所需要的最基本的数据,没有流水记录、也没有留出扩展的空间,甚至某些必要的状态数据也由于产品不关注而没有去记录。

DDD对我们,与其说是一个战术,更多的是一个战略和方法论。

我的第一个DDD系统

第一次尝试,没敢修改已经成熟的系统,做了一个当时比较需要的中间件:实时计算平台。

这一系统主要为了解决的问题是,每次有新的实时计算需求都需要单独去开发一套代码、写一个新的TOPO。考虑用一套可配置化的平台,来解决所有的简单实时计算需求。

按照DDD的思想,我设计这一系统时,划分了两个限界上下文:计算上下文和存储上下文。

计算上下文

计算上下文主要负责微批量实时计算。上游对接某一种消息队列,订阅消息,根据配置在内存中做计算,积攒几秒中之后,将计算结果丢给存储上下文。

存储上下文

存储上下文负责更新数据库。当前主要使用的是关系型数据库PolarDb和NOSQL数据库TableStore。将内存中的计算结果更新到数据库中,若数据库中已有该行数据,则根据计算方法选择求和或是求最大值等等。

初次尝试的感想

整套平台的代码,包括最开始的2、3次功能迭代,都是我自己一个人开发的。当时由于自己的熟悉程度比较高,觉得效果还不错。

后边把项目交给组员去维护时,得到了一些来自组员的反馈。其中最主要的一点就是:大家觉得我是为了做DDD而做DDD。

因为这一系统本身的代码量就不大,拆分成两个上下文之后,上下文之间交互的防腐层就写了大量的代码。而且为了在数据层也解耦,导致数据库设计时多分了几张表,表之间的关联关系比较难理解。

后续

公司正处于微服务转型阶段,解决复杂问题的三种能力:分治、抽象、知识,这几个关键词一直存在于我的脑海中。再加上初次尝试DDD感觉还不错,后边再设计任何系统的时候我都要使用DDD去做。

接下来碰到了一个问题,证明我在实时计算平台的设计思路是正确的。

实时计算平台最早接入的是mysql的binlog日志,后边根据业务需要,还要接入其他团队的业务数据、前端埋点日志、运维监控日志等等。为了避免每次接入新的数据源需要修改代码、重启服务,需要将“数据接入”和“计算/存储”隔离开,这样一来,当初解耦设计的优势就体现出来了。后面考虑了一套系统的方案,把包括实时计算平台、数据同步平台在内的多个中间件整合成了一套完整的数据处理平台。

暂时还没有在核心的、业务复杂的项目中尝试DDD,待我尝试了之后,再来进一步谈谈感想。

相关实践学习
基于Hologres+Flink搭建GitHub实时数据大屏
通过使用Flink、Hologres构建实时数仓,并通过Hologres对接BI分析工具(以DataV为例),实现海量数据实时分析.
实时计算 Flink 实战课程
如何使用实时计算 Flink 搞定数据处理难题?实时计算 Flink 极客训练营产品、技术专家齐上阵,从开源 Flink功能介绍到实时计算 Flink 优势详解,现场实操,5天即可上手! 欢迎开通实时计算 Flink 版: https://cn.aliyun.com/product/bigdata/sc Flink Forward Asia 介绍: Flink Forward 是由 Apache 官方授权,Apache Flink Community China 支持的会议,通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到国内外一线大厂围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者不可错过的盛会。 去年经过品牌升级后的 Flink Forward Asia 吸引了超过2000人线下参与,一举成为国内最大的 Apache 顶级项目会议。结合2020年的特殊情况,Flink Forward Asia 2020 将在12月26日以线上峰会的形式与大家见面。
目录
相关文章
|
Linux Shell
【Shell 命令集合 基础命令】Linux cat 命令使用教程
【Shell 命令集合 基础命令】Linux cat 命令使用教程
910 1
|
8月前
|
缓存 监控 Java
《深入理解Spring》性能监控与优化——构建高性能应用的艺术
本文系统介绍了Spring生态下的性能监控与优化实践,涵盖监控体系构建、数据库调优、缓存策略、线程池配置及性能测试等内容,强调通过数据驱动、分层优化和持续迭代提升应用性能。
|
移动开发 前端开发 JavaScript
鸿蒙-webview的使用和JS交互(附源码)
日常我们在开发项目时,为了项目快速的开发和迭代,难免会用到H5页面。使用鸿蒙进行项目开发时,也一样免不了要加载H5页面,在移动开发中打开H5页面需要使用WebView组件。同时,为了和H5页面进行数据交换,有时候还需要借助JSBridge来实现客户端与H5之间的通讯。 那么鸿蒙之中用到的技术是什么呢?WebView 在此之前,先看一个报错 ​ App Launch: The Huawei Lite Simulator supports only Lite projects.
1308 0
鸿蒙-webview的使用和JS交互(附源码)
|
机器学习/深度学习 存储
线性化注意力综述:突破Softmax二次复杂度瓶颈的高效计算方案
大型语言模型虽在各领域表现出色,但其核心的softmax注意力机制存在显著的计算资源消耗问题。本文探讨通过线性时间复杂度的替代方案突破这一瓶颈,介绍线性注意力机制、门控线性注意力及状态空间模型(SSM)等创新方法,旨在优化计算效率与内存容量之间的权衡,提升模型性能。
815 9
线性化注意力综述:突破Softmax二次复杂度瓶颈的高效计算方案
|
存储 安全 Java
什么?CPU消耗要压降80% ——《事件序列化CPU开销压降》揭榜
本文为《事件CPU开销压降》揭榜报告,旨在解决风控系统间信息传递时事件体持续膨胀导致的序列化/反序列化CPU消耗过高的问题。
497 12
均值回归策略在A股ETF市场获利的可能性
【9月更文挑战第24天】均值回归策略是一种量化交易方法,依据资产价格与平均价格的关系预测价格变动。在A股ETF市场中,该策略可能带来收益,但需考虑市场复杂性和不确定性。历史数据显示某些ETF具有均值回归特征,但未来表现不确定,投资者应结合技术与基本面分析,合理决策并控制风险。
582 2
|
存储 弹性计算 人工智能
阿里云Alex Chen:普惠计算服务,助力企业创新
本文整理自阿里云弹性计算产品线、存储产品线产品负责人陈起鲲(Alex Chen)在2024云栖大会「弹性计算专场-普惠计算服务,助力企业创新」中的分享。
|
存储 NoSQL Java
线程池的原理与C语言实现
【8月更文挑战第22天】线程池是一种多线程处理框架,通过复用预创建的线程来高效地处理大量短暂或临时任务,提升程序性能。它主要包括三部分:线程管理器、工作队列和线程。线程管理器负责创建与管理线程;工作队列存储待处理任务;线程则执行任务。当提交新任务时,线程管理器将其加入队列,并由空闲线程处理。使用线程池能减少线程创建与销毁的开销,提高响应速度,并能有效控制并发线程数量,避免资源竞争。这里还提供了一个简单的 C 语言实现示例。
326 6
|
数据可视化 测试技术 数据安全/隐私保护
​十个常见的 Python 脚本 (详细介绍 + 代码举例)
​十个常见的 Python 脚本 (详细介绍 + 代码举例)
779 0
|
JSON JavaScript 前端开发
蓝易云 - JSON数据详解
JSON被广泛应用于现代编程语言之间的数据交换,因其简洁明了的特性,使得程序员更容易读取和生成。
302 0