在现代系统中,特别是互联网软件,通常会涉及到大量用户的并发访问,我们的系统一定要在架构上支持高性能、大并发的访问。一个高性能的系统通常由很多的方面组成,包括数据库高性能、Web服务器高性能、负载均衡、缓存、软件架构等。我们这篇文章先从软件开发架构的角度作为切入点来介绍如何构建高性能的系统。

传统架构性能的问题

我们先来看看DDD经典架构中,在多用户、大并发访问的情况下,对性能产生不利影响的因素。先来看看简单架构图:

1.通常会在当前界限上下文中只有一个领域模型,这个领域模型既会用于领域逻辑,同时也会用于持久化。

2.领域模型既会用于用例、也会用于查询。

3.当前界限上下文通常只会有一个WebApi项目,这个项目中不同的Action Api用于不同的功能,有查询的,有用例的。

从上面几点大家可以看出,有以下几个原因带来性能的瓶颈:

1.上下文的查询和用例通过一个模型来做,对应到数据库来讲,就是增、删、改、查针对同一个数据库的相关表,通过阻塞会造成性能问题;虽然通过建立好的索引可以进行缓解,但解决问题不彻底。

2.领域模型通常是根据业务需要进行设计的,也就是用于用例。如果用于查询需求的话,可能会连接多个业务表才能完成查询,查询性能出现问题。

3.通常经典DDD是完成领域逻辑后,通过应用服务协调领域逻辑与仓储来将领域对象持久化到数据存储中,然后通过WebApi返回用户结果。如果领域复杂,用户并发量大的话,这个过程反馈到前端有一定的时间,用户体验不好。

4.当前界限上下文是一个WebApi项目,无论是用例还是查询;这样也无法对性能进行扩展,比如用例的在一些主机上,查询的在另一些主机上。

为了有效的解决上述出现的性能问题,业界总结了一种架构风格,也就是CQRS(命令查询职责分离)。通过CQRS的理念,可以有效的提高系统对大并发的支持。

命令指的是要更改对象状态的行为,对系统有副作用;查询指的是不更改对象状态的行为,对系统无副作用。其实CQRS不仅仅用于大并发的处理,在日常开发中,其实也是可以利用这种理念的。

命令与查询混在一起的情况:

 private int Add(int a,int b){int result = a + b;return result;}
复制代码

从上面代码可以看出,更改状态与查询是混在一起的;我们可以改造成命令与查询分离的方式:

private int result;private void Add(int a,int b){result = a + b;           }private int QueryResult(){return result;}
复制代码

基于上述代码的思路与经典DDD架构的问题,我们就引入CQRS架构风格来解决性能问题。

CQRS架构

我们先来看看CQRS整体的架构图,然后再说它是怎么解决性能问题的。

我们来看看整体架构图的流程以及它是如何解决性能问题的:

1.首先可以看到命令与查询走不同的WebApi服务,这样可以将更改系统状态的行为与查询的行为做很好的隔离,并可以部署微服务到不同的服务器上,当然还可以通过NLB做进一步的扩展。

2.命令端的WebApi并不直接处理调用用例完成,而是接收到用户命令时,将命令消息发布到消息总线,然后立刻返回一个操作信息给用户,这样用户体验很好,不需要等待业务逻辑完成与持久化完成。

3.命令处理器WebApi从消息队列侦听到消息,然后进行处理,处理的主要内容是完成领域逻辑调用,直接添加事件数据到事件存储中。这里需要注意的是,并不是持久化到业务数据库中。首先完成领域逻辑调用,可以得到用例最终正确的领域对象,然后存储事件时,存储这次领域对象的状态,并且是直接添加。

这样做的好处有:一是加快持久化,二是能够保存领域对象每次变化的信息,未来可以用于历史追踪、事件溯源与最终一致性

4.命令处理器将领域对象发送到消息总线中,事件处理器会侦听队列,并最终将消息信息涉及到的领域对象持久化到业务数据库中。

5.在查询WebApi中,可以直接查询业务库,如果业务库并不适合多表连接查询时,可以再单独做个拉平的为查询提供服务的查询库。查询库的内容可以通过业务库更新成功后,发布消息到另一个队列中,然后通过处理器来处理这些数据到查询库中。

微服务实战视频请关注微信公众号:MSSHCJ

转载于:https://juejin.im/post/5b7bd319e51d4538940015f1

微服务实战(五):落地微服务架构到直销系统(构建高性能大并发系统)相关推荐

  1. 微服务实战(六):落地微服务架构到直销系统(事件存储)

    在CQRS架构中,一个比较重要的内容就是当命令处理器从命令队列中接收到相关的命令数据后,通过调用领域对象逻辑,然后将当前事件的对象数据持久化到事件存储中.主要的用途是能够快速持久化对象此次的状态,另外 ...

  2. java 限流熔断_SpringCloud Alibaba微服务实战五 - 限流熔断

    简介 Sentinel是面向分布式服务框架的轻量级流量控制框架,主要以流量为切入点,从流量控制,熔断降级,系统负载保护等多个维度来维护系统的稳定性.在SpringCloud体系中,sentinel主要 ...

  3. 在微服务架构下基于 Prometheus 构建一体化监控平台的最佳实践

    欢迎关注方志朋的博客,回复"666"获面试宝典 随着 Prometheus 逐渐成为云原生时代的可观测事实标准,那么今天为大家带来在微服务架构下基于 Prometheus 构建一体 ...

  4. SpringCloud Alibaba微服务实战(五) - Sentinel实现限流熔断

    什么是Sentinel? 请查看文章:SpringCloud Alibaba微服务实战(一) - 基础环境搭建 构建服务消费者cloud-sentinel进行服务调用 服务创建请查看文章:Spring ...

  5. 实战落地微服务架构商城项目-part01

    文章目录 分布式三高商城系统 一.系统架构演变 1.服务架构的演变 1.1单体架构 1.2集群 1.3垂直化 1.4服务化 1.5微服务化 微服务和SOA的区别 2.微服务架构的需求 2.1RPC框架 ...

  6. 11.落地:微服务架构灰度发布方案

    前置知识 1.nacos 服务注册与发现 2.本地负载均衡器算法 3.gateway 网关 4.ThreadLocal 1.什么是灰度发布? 2.什么是灰度策略? 3.灰度发布落地方案有哪些 4.灰度 ...

  7. Spring Cloud微服务实战(五)-应用通信

    订单服务源码 https://github.com/Wasabi1234/SpringCloud_OrderDemo 商品服务源码 https://github.com/Wasabi1234/Spri ...

  8. 【微服务实战】什么是微服务,微服务怎么实施?

    今天来聊一聊微服务,初衷是:1.微服务现在确实很火 2.虽然大家张口闭口微服务,但是大家对微服务的理解确实千差万别,甚至有误解.(19年1月份未完成的文章) 一.什么是微服务 "微服务&qu ...

  9. 《微服务实战》微服务设计原则

    微服务设计原则 文章目录 微服务设计原则 设计原则之分层架构 设计原则之统一通信协议 设计原则之单一职责 设计原则之服务拆分 设计原则之前后踹分离 设计原则之版本控制 设计原则之围绕业务构建 设计原则 ...

最新文章

  1. Android中级篇之百度地图SDK v3.5.0-百度地图定位[超详细图解定位基础]
  2. tkinter绑定鼠标滚轮滚动事件
  3. SAP Spartacus产品数据HTTP GET请求前的OPTIONS请求
  4. java五子棋代码详解_代码详解:Java和Valohai的深度学习之旅
  5. 【STM32】手把手固件库开发工程建立
  6. setmaximumsize java_setMaximumSize为什么不起作用
  7. 表单元素内容禁用拼写检查
  8. 笔者分享:关于Win7 XPS查看器的详细介绍【386w】
  9. 360手机助手pc版 v2.4.0.1265 官方版
  10. tracert命令详解
  11. 【翻译】Qt Designer 布局宝典
  12. python求平方根的代码_python求平方根
  13. CryEngine5.3 问题
  14. Pandas RuntimeWarning: More than 20 figures have been opened. Figures created plt.close()也不起作用
  15. 【详细】Oracle数据库安装教程--Oracle DataBase 19c
  16. 动漫制作技巧如何制作动漫视频
  17. MacM1安装homebrew步骤
  18. Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
  19. 【SSR和CSR】服务端渲染和客户端渲染区别?如何快速分辨页面是SSR还是CSR?
  20. Mac上如何提取图片上的文字?

热门文章

  1. RabbitMQ学习总结(5)——发布和订阅实例详解
  2. java B2B2C Springboot电子商务平台源码-SSO单点登录之OAuth2.0登录认证
  3. 反向区域DNS解析服务
  4. [转载]正确解决:坑爹的0xc000007b——应用程序无法正常启动
  5. 吾八哥学Python(四):了解Python基础语法(下)
  6. CJIS安全政策:企业如何确保FIPS合规性?
  7. 痞子衡嵌入式:第一本Git命令教程(7.1)- 清理之缓存(stash)
  8. 【设计模式】业务代表模式
  9. [C++] Lvalue and Rvalue Reference
  10. 39.拖曳排序插件——sortable