论 业务系统 架构 的 简化 (一) 不需要 MQ
MQ , 就是 消息队列(Message Queue),
不知从什么时候起, MQ 被用来 搭建 分布式 业务系统 架构, 一个重要作用 就是用来 “削峰” 。
我们 这里 就来 讨论 如何 设计 业务系统 来 应对 高并发, 不需要 MQ 。
应对 高并发, 很简单, 水平扩展 就可以 。 增加 服务器 数量 就可以 。
MQ 通常用来 分解 一个 用户 请求 中的 各项 子任务, 尤其 是 异步任务, 尤其是 需要 和 第三方 平台 交互 的 任务 。
比如 支付 业务 就是 一个 典型 的 场景 。
假设 我们 做一个 支付 相关 的 业务, 用户 的 一次 支付, 我们的 系统 可能 需要 和 微信(支付宝) 交互, 等待 回调 , 等等 。
同时 还需要 处理 我们自己的 各种 业务 逻辑, 如果 业务逻辑 比较 庞大, 也可能 拆分 为 异步任务 进行 。
但 不管 是 削峰 还是 分解业务, 都不需要使用 MQ 。
我们 只 需要 用 进程内的 队列 (Queue) 和 多线程 就可以 很好 的 实现这些 。
削峰, 可以使用 进程内的 队列(Queue), 简单的说, 比如 C# 的 System.Collection.Generics.Queue<T> ,
分解业务, 多个异步任务, 用 多线程 就可以 。
大家可能会问, 在 水平扩展(负载均衡) 和 情况下, Server 之间怎么通信, 怎么共享数据 ?
答案 是 一般情况 下 水平扩展 的 Server 之间 不需要 通信,
一个 用户 的 一个 请求, 在 一台 Server 内 就可以 完成, 不需要 和 其它 水平 Server 通信 。
这个 请求 如果分解为 多个 子任务, 在 一台 Server 内 开 多个线程 执行 就可以 。
同理, 对于 削峰, 我们使用 进程内的 队列(Queue) 就可以 , 比如 :
private static Queue<T> payQueue;
这行么 ?
水平 Server 之间的 通信 , 或者说 共享数据, 可以通过 分布式缓存 (比如 Redis 什么的) 来实现,
我之前也说过, 分布式缓存 实际上是 Web 集群 的 共享内存 。
但从 简化 的 角度 来看, 一个 请求, 或者说 一个 业务, 通常 在 一台 Server 内 就可以 完成 。 如果需要 多任务, 就使用 多线程 。
如果 一个 业务 需要 多个 请求 才能 完成 ,
这种情况 就可能 跨 Server,
因为 负载均衡 的 话, 第一次 请求 在 Server 1, 第二次 请求 在 Server 2,
此时, 可以通过 分布式缓存 来 在 Server 之间 共享数据, 比如 保存 状态信息 。
第三点 是, 对于一个 庞大的业务, 可能采用了 削峰 多任务 等 复杂的架构, 那么, 如何 保证 这个架构 的 稳定性 和 透明性 ?
所谓 透明性 就是 开发人员 和 运维人员 对 这个 系统 里 发生了 什么 看的 很清楚, 出现问题 可以 清楚 的 知道 定位 追溯 解决 问题 。
要实现 透明性 , 需要 在 代码 中 规范 和 适当 的 加入 Log 。
这样 可以 记录下来 每个 子任务 的 创建 执行 报错 结束 状况 。
在 分布式架构 下, 传统的 文件 Log 已经不能 适应, 需要 升级 为 数据库 Log(DB Log) 。
DB Log 的 优点 是 :
1 支持 分布式架构, 各台 Server 的 Log 可以汇总到一起(数据库 , 表)
2 便于 分析查询, 用 Sql 很容易 查询追溯, 以及 产出 报表 。
那 这个 DB Log (或者叫 分布式 Log ^^) , 要怎么搞定 ?
其实 很简单, 我自己就写了一个, 可以看一下 :
《SOALog》 https://www.cnblogs.com/KSongKing/p/9455309.html
今天说的这个 架构, 就是我之前说过的 “1 Binary n Deploy” 架构,
也是我之前说过的 “3.5 层架构” (在 传统 的 三层架构 上 加上 缓存层 叫做 3.5 层架构) 。
还有一点就是, 将 业务 分解 为 子任务 不一定能 提高效率 。
除了 要等待 第三方平台 回调, 或者 响应时间不确定 的 这类情况, 一般情况 分解为 子任务 效率 不一定高 。
因为 现在 高并发 是 常态,
在 高并发 下, CPU 实际上没有 多余的 资源(核) 来 执行 分解出来的 子任务 , 反而还会 增加 线程间 通信 的 性能消耗 。
比如, 我们 的 CPU 假设 有 16 个 核, 要处理 每秒 1600 个 请求, 每个 核 要处理 每秒 100 个 请求,
把 请求 分解成 子任务 实际上 并不能 起到 “并行执行, 利用多核, 提升效率” 的 作用 。
论 业务系统 架构 的 简化 (一) 不需要 MQ的更多相关文章
- 系统架构师JD
#################################################################################################### ...
- RESTful API后台系统架构设计(Java)
最近设计和实现了一个JAVA的RESTful API的后台业务系统架构,主要基于Java平台.设计要求是: 性能:平均响应时间(RESTful API)小于2s(平均负载的情况下),并发访问200个以 ...
- TOP100summit:【分享实录-美团点评】 业务快速升级发展背后的系统架构演进
本篇文章内容来自2016年TOP100summit美团●大众点评高级技术专家,酒店后台研发组eHome团队负责人许关飞的案例分享.编辑:Cynthia 许关飞:美团●大众点评高级技术专家,酒店后台研发 ...
- SOA 新业务语言 新系统架构——什么是SOA
原文地址:http://blog.csdn.net/ichaos/archive/2008/01/20/2054377.aspx SOA的概念是Gartner在1996年提出来的,并于2002年12月 ...
- Java生鲜电商平台-电商促销业务分析设计与系统架构
Java生鲜电商平台-电商促销业务分析设计与系统架构 说明:Java开源生鲜电商平台-电商促销业务分析设计与系统架构,列举的是常见的促销场景与源代码下载 左侧为享受促销的资格,常见为这三种: 首单 大 ...
- 以字节跳动内部 Data Catalog 架构升级为例聊业务系统的性能优化
背景 字节跳动 Data Catalog 产品早期,是基于 LinkedIn Wherehows 进行二次改造,产品早期只支持 Hive 一种数据源.后续为了支持业务发展,做了很多修修补补的工作,系统 ...
- 异构(兼容dubbo)SOA系统架构(.net)优化升级
前面一片文章已经提到我司的异构(兼容dubbo)SOA系统架构,解决了不少技术痛点,也还算比较完善,也顺利推广开来. 但作为项目的开发者,自己产品的问题心里是清楚的,离自己满意还是有不小的距离. 在推 ...
- NET ERP系统架构设计
解析大型.NET ERP系统架构设计 Framework+ Application 设计模式 我对大型系统的理解,从数量上面来讲,源代码超过百万行以上,系统有超过300个以上的功能,从质量上来讲系统应 ...
- 高性能、高可用、高扩展ERP系统架构设计
ERP之痛 曾几何时,我混迹于电商.珠宝行业4年多,为这两个行业开发过两套大型业务系统(ERP).作为一个ERP系统,系统主要功能模块无非是订单管理.商品管理.生产采购.仓库管理.物流管理.财务管理等 ...
随机推荐
- DevExpress WinForms使用教程:SVG图库和Image Picker
[DevExpress WinForms v18.2下载] 每个新版本都在几个新控件中引入了矢量图标支持. 对于v18.2,这是列表: BackstageViewControl及其项目 RecentI ...
- UI控件Telerik UI for WinForms发布R1 2019|附下载
Telerik UI for WinForms拥有适用Windows Forms的110多个令人惊叹的UI控件.所有的UI for WinForms控件都具有完整的主题支持,可以轻松地帮助开发人员在桌 ...
- nginx 更改用户组
为什么要更改 Nginx 服务的默认用户:就像更改 ssh 的默认 22 端口一样,增加安全性,Nginx 服务的默认用户是 nobody ,我们更改为 nginx 1) 添加 nginx 用户 us ...
- php优秀框架codeigniter学习系列——hooks
这篇文章学习CI框架的钩子特性. hooks是CI框架提供的一种机制,允许你在程序框架运行流程的某个阶段执行你自己的一些代码.比如系统运行前,CI_Controller调用前,系统运行结束后等特定的时 ...
- slaac
https://zhidao.baidu.com/question/460186176.html slaac是IPv6中的术语.Stateless address autoconfiguration, ...
- 用XPath精确定位节点元素&selenium使用Xpath定位之完整篇
在利用XSL进行转换的过程中,匹配的概念非常重要.在模板声明语句 xsl:template match = ""和模板应用语句xsl:apply-templates select ...
- SQL注入之Sqli-labs系列第二十九关(基于WAF防护的单引号报错注入)
开始挑战第二十九关(Protection with WAF) 0x1查看源码 (1)login.php页面存在防护,只要检测到存在问题就跳转到hacked.php页面(其他信息看备注) 0x2 for ...
- Unity调用Windows弹框、提示框(确认与否,中文)
Unity调用Windows弹提示框 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...
- Codeforces Round #519
题目链接:传送门 A. Elections (思维+暴力) 思路: 从最小的k开始枚举就好了- -. #include <bits/stdc++.h> using namespace ...
- java-源文件中可以有多个类,但是最多只能有一个public修饰
1.如果源文件中有多个类,那么只能有一个类是public类:如果有一个类是public类,那么源文件的名字必须与这个类的名字完全相同,扩展名是.java. 2.如果源文件中没有public类,那么源文 ...