我的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 命令使用教程
1049 1
|
11月前
|
缓存 监控 Java
《深入理解Spring》性能监控与优化——构建高性能应用的艺术
本文系统介绍了Spring生态下的性能监控与优化实践,涵盖监控体系构建、数据库调优、缓存策略、线程池配置及性能测试等内容,强调通过数据驱动、分层优化和持续迭代提升应用性能。
|
移动开发 前端开发 JavaScript
鸿蒙-webview的使用和JS交互(附源码)
日常我们在开发项目时,为了项目快速的开发和迭代,难免会用到H5页面。使用鸿蒙进行项目开发时,也一样免不了要加载H5页面,在移动开发中打开H5页面需要使用WebView组件。同时,为了和H5页面进行数据交换,有时候还需要借助JSBridge来实现客户端与H5之间的通讯。 那么鸿蒙之中用到的技术是什么呢?WebView 在此之前,先看一个报错 ​ App Launch: The Huawei Lite Simulator supports only Lite projects.
1384 0
鸿蒙-webview的使用和JS交互(附源码)
|
人工智能 自然语言处理 搜索推荐
Spark-TTS: AI语音合成的"变声大师"
Spark-TTS 是一款革命性的语音合成模型,被誉为“变声大师”。它通过创新的 BiCodec 技术将语音分解为语义和全局两种 Token,实现对音色、性别、语速等属性的精细控制。结合统一的 LLM 架构,Spark-TTS 简化了传统 TTS 的复杂流程,同时提供了前所未有的灵活性。此外,团队还发布了 VoxBox 开源数据集,为行业提供标准评估基准。尽管在零样本场景下仍存改进空间,但 Spark-TTS 已经开启了语音合成新时代,让个性化、可控的 AI 语音成为可能。
1253 5
|
人工智能 架构师 程序员
用户说 | 手把手体验通义灵码 2.0:AI 程序员如何让我从“调参侠”进阶“架构师”?
通义灵码 2.0 是强大的 AI 编程工具,助力开发者从“调参侠”进阶为“架构师”。它支持跨语言开发、智能单元测试生成和图生代码等功能,显著提升开发效率。新增 QwQ 模型具备“代码脑补”能力,可推荐性能优化策略。尽管功能强大,但仍需注意环境隔离与代码审查,避免过度依赖。通义灵码 2.0 不仅是工具,更是开发者的“外接大脑”,帮助应对全栈开发挑战。
677 0
|
机器学习/深度学习 存储
线性化注意力综述:突破Softmax二次复杂度瓶颈的高效计算方案
大型语言模型虽在各领域表现出色,但其核心的softmax注意力机制存在显著的计算资源消耗问题。本文探讨通过线性时间复杂度的替代方案突破这一瓶颈,介绍线性注意力机制、门控线性注意力及状态空间模型(SSM)等创新方法,旨在优化计算效率与内存容量之间的权衡,提升模型性能。
937 9
线性化注意力综述:突破Softmax二次复杂度瓶颈的高效计算方案
|
存储 安全 Java
什么?CPU消耗要压降80% ——《事件序列化CPU开销压降》揭榜
本文为《事件CPU开销压降》揭榜报告,旨在解决风控系统间信息传递时事件体持续膨胀导致的序列化/反序列化CPU消耗过高的问题。
577 12
|
负载均衡 应用服务中间件 API
深入理解 Nginx 与 Kong 的配置与实践
在微服务架构中,Nginx 用于配置负载均衡,如示例所示,定义上游`pay-service`包含不同权重的服务节点。Kong API 网关则通过service和route进行服务管理和路由,与Nginx的upstream和location类似。通过Kong的命令行接口,可以创建upstream、target、service和route,实现对后端服务的负载均衡和请求管理。Nginx和Kong协同工作,提供高效、灵活的API管理和流量控制。
975 1
深入理解 Nginx 与 Kong 的配置与实践
均值回归策略在A股ETF市场获利的可能性
【9月更文挑战第24天】均值回归策略是一种量化交易方法,依据资产价格与平均价格的关系预测价格变动。在A股ETF市场中,该策略可能带来收益,但需考虑市场复杂性和不确定性。历史数据显示某些ETF具有均值回归特征,但未来表现不确定,投资者应结合技术与基本面分析,合理决策并控制风险。
641 2
|
存储 弹性计算 人工智能
阿里云Alex Chen:普惠计算服务,助力企业创新
本文整理自阿里云弹性计算产品线、存储产品线产品负责人陈起鲲(Alex Chen)在2024云栖大会「弹性计算专场-普惠计算服务,助力企业创新」中的分享。