【程序员日记】---当“微服务”遇到了“电饼铛“
作者:京东物流 赵勇萍
之后的日子里,我可能会陆陆续续写一写跟编程技术感悟相关的文章,一来可以梳理一下对技术和工作的思考,二来也可以记录一下技术成长的的过程。
换个叫法的话,就叫做程序员日记吧。
电饼铛
今天就从电饼铛说起。
上周,我家的电饼铛坏了,原因可能是清洗过后线路短路导致的。那个老式电饼铛确实用了好些年,且功能单一,基本上除了开关键,再也没有什么可以按钮的地方了,不过老妈却一直用的很顺手。
而对我来说,这确实个好消息,终于可以换一个好电饼铛了。于是在网上买了一个七百多的苏泊尔的电饼铛,这一下子感觉高大上了许多,很多内置模式,可以支持煎蛋,煎饼,炸鸡翅等多种模式,对温控的把握也十分精准。
不过,对于我老妈来说,她并没有显得多兴奋,我将使用说明一一教给她用,但老妈最终只选择一种用法:打开开关,选择自定义模式,一切都靠经验去判断电饼铛的温度和对食材的感觉,其他所有的内置模式,对她老人家来说,好像确实是多余的。
对此,我有点陷入沉思,总觉得有一种似曾相识的感觉。 仔细思考,其实这种情况在编程过程中屡见不鲜。其实这不就是我们微服务架构中经常会遇到的一种情况么....
好的,接下来,如果把我和我老妈的上述行为抽象为代码,可以写成如下:
老妈做煎蛋:
/** *老妈做煎鸡蛋 */ public class MainApplicaiton{ /** *电饼铛 */ @Resource private DianBingCheng dianBingCheng; /** *老妈的判断服务类 */ @Resource private MotherCheckService matherCheckService; /** * 老妈的行为服务 */ private MotherBehaviorService MotherBehaviorService; public void execute() { //打开电饼铛 MotherBehaviorService.Open(dianBingCheng); //检查温度 matherCheckService.CheckTemperature(dianBingChengAggregate); //开始煎鸡蛋 MotherBehaviorService.fryEggs(); //检查是否熟了 matherCheckService.CheckRipe(); //完成,关机盛盘 matherService.complete(); } }
我做煎蛋:
public class MainApplicaiton { /** * 电饼铛聚合根 */ @Resource private DianBingChengAggregateRoot dianBingChengAggregate; public void execute() { //开机 dianBingChengAggregate.open(); //煎蛋模式 dianBingChengAggregate.fryEggs(); //完成,关机盛盘 dianBingChengAggregate.complete(); } }
大家可以看出这两者的实现区别,我们有时候需要思考一下,我不就是处理一个日常特别简单的事情,一定要引入那么多的服务类么?
贫血模型和充血模型
可能大家感觉出来了,这两种实现,就是领域驱动设计中典型的贫血模式和充血模式。这里不得不先说一下贫血模型和充血模型。
贫血模型是事务脚本模式。对于程序员来说,脚本呢肯定是要比写设计说明书要快的多了。比如,我们要设计一个订单流程,包括下单,取消,售后,拆单等情况下的订单流转,那么我们就就会任选一个Service类,写一个方法就能搞定,而这时,原来的那个order类中,就会非常非常的“清爽”,里面全是GET方法和Set方法,没有任何行为。而很多人喜欢给这个order类一个定义,叫OrderDomain,订单领域模型。当然我更喜欢叫这种模型为DB模型,是面向数据库的,而不是面向领域业务的。
而充血模型是才是典型的领域模型模式。他实现起来相对复杂,但这种复杂也是相对的,还是上面的例子,我们会在Order这个对象中放入响应的动作行为的方法,例如我们更新订单状态不会用setStatus()这种方法,而会封装类似orderCancel(),orderComplete()的这种业务行为方法,当然这种方式会让这个类略显“复杂”。
总结一句话,真正的领域模型会把数据和行为聚合在一起,形成聚合根,对外提供基于行为的方法,而非脚本化的增删改查。只有这样才能够更好的对微服务进行拆分。
如果仅是贫血模型其实不是对系统架构危害最大的,想我们已经很熟悉的MVC,通过贫血模型也可以写出复杂的高效快捷的系统。
但是,有一种危害就会很大了:
就像好多同学用这面向对象的语言,写着面向过程的代码一样,很多同学喜欢用冠以领域驱动设计的噱头,却写着MVC式的“面向数据库编程”, 它最大的问题是你引入了领域模型设计的所有成本,但却没有带来任何一丝的收益。
只有当你充分使用了面向对象设计来组织复杂业务逻辑之后,才能抵消这种成本。如果将所有行为都写入一个一个的Service类,领域是被割裂的,那最终你会得到一组事务处理脚本,从而错过了领域模型带来的好处,而且当业务足够复杂时,你将会得到一堆爆炸的事务处理脚本。
此外,你还会发现,
本来属于一个领域的能力,却被散落在了工程的各个角落。这样一来,根本无法形成一个可复用的能力。
当然有同学也会提出疑问:“我的业务场景中领域之间其实关系比较紧密,我会经常遇到会触发同时跟不同领域行为相关的业务,在这种情况下,我就通过一个个的Service扩展,这就是一种显而易见的解决方案呀~~ ”
其实有这种想法的同学,主要是对领域驱动设计理解不深刻的,同时又对传统的MVC框架开发根深蒂固。
其实领域驱动设计早已给出它的最佳实践,那就是领域事件。而面向事件的编程思想对于后端来说,是一种非常高效和优秀的思想。通过领域事件,我们可以实现领域之间的解耦,同时也维护了领域模型的独立性和数据一致性。而关于领域事件又是一个很大的话题,以后有机会再聊。
思考
在我们每个人的大脑里,对于一件事,如果没有概念和理解的话,我们会有意识的躲避那件事,或者用自己熟悉的概念去套用。微服务,DDD,中台这些词汇,恰恰是这样的概念。这是有了这些概念,才让我们不断的努力去学习它,思考他,钻研他。
在微服务和DDD这波浪潮里,很多同学都想用这些概念来包装自己,就像我面试过的很多候选者,他们中的很多都在简历中写了精通领域驱动设计,同时也能说出一些聚合根,实体,值对象等概念,但是实际落地就变成了贫血模式的代码。
所以,对于程序员来说,最核心的能力并不是你会几种语言,会几个架构或者几个名词概念,而是理解那些概念并转化成自己的编程思想。
同时,
勇于创新和敢于推翻自己的已有认知,也是一名程序员能否有一直前进的动力的前提。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
一种基于实时大数据的图指标解决方案
作者:京东科技 尚建平 1. 现有技术 在电商、金融风控领域,使用图来建模,将大量的人员和事件编织成一张庞大的图关系网络,构建图指标来识别异常人员和群体风险行为,目前图指标现有实现方式是基于离线数据或t+1数据构建图关系网络,图指标由业务人员或需求人员根据业务需要提出具体需求由开发人员临时开发、测试、部署、上线。 2. 现有技术的缺点 第一,图指标时效性差,无法实时更新图关系数据,在某些时效性强的场景下图指标不可用。 第二,创建、修改图指标流程繁琐,业务及需求人员无法单独实现,需开发人员临时开发。 第三,图指标相关元数据没有统一管理及分类,无法查看、修改、复用、追溯。 3. 本发明技术方案 3.1 本发明所要解决的技术问题(即发明目的) 第一,接收实时大数据流,实时构建图关系网络,图指标可基于实时图关系数据查询。 第二,业务及需求人员对图指标可视化创建、测试、上线,无需开发人员参与。 第三,图指标相关元数据进行统一管理及分类,可灵活查看、修改、复用、追溯。 3.2 本发明的完整技术方案 3.2.1 系统原理图、结构说明图或流程图 图1-系统原理图 3.2.2 技术方案详细描述 如图2-...
- 下一篇
千亿参数开源大模型 BLOOM 背后的技术
假设你现在有了数据,也搞到了预算,一切就绪,准备开始训练一个大模型,一显身手了,“一朝看尽长安花”似乎近在眼前 …… 且慢!训练可不仅仅像这两个字的发音那么简单,看看 BLOOM 的训练或许对你有帮助。 近年来,语言模型越训越大已成为常态。大家通常会诟病这些大模型本身的信息未被公开以供研究,但很少关注大模型训练技术这种背后的知识。本文旨在以 1760 亿参数的语言模型 BLOOM 为例,阐明训练此类模型背后的软硬件工程和技术要点,以促进大家对大模型训练技术的讨论。 首先,我们要感谢促成或赞助我们这个小组最终完成了训练 1760 亿参数模型这一惊人壮举的公司、个人和团体。 然后,我们开始讨论硬件配置和主要技术组件。 以下是对本项目的简要总结: 硬件 384 张 80GB A100 GPU 软件 Megatron-DeepSpeed 模型架构 基于 GPT3 数据集 含 59 种语言,共 3500 亿词元 训练时长 3.5 个月 人员组成 该项目由 Thomas Wolf (Hugging Face 联合创始人兼 CSO) 发想,他敢于与大公司竞争,提出不仅要训练出立于世界上最大的多语言模...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19