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的更多相关文章

  1. 系统架构师JD

    #################################################################################################### ...

  2. RESTful API后台系统架构设计(Java)

    最近设计和实现了一个JAVA的RESTful API的后台业务系统架构,主要基于Java平台.设计要求是: 性能:平均响应时间(RESTful API)小于2s(平均负载的情况下),并发访问200个以 ...

  3. TOP100summit:【分享实录-美团点评】 业务快速升级发展背后的系统架构演进

    本篇文章内容来自2016年TOP100summit美团●大众点评高级技术专家,酒店后台研发组eHome团队负责人许关飞的案例分享.编辑:Cynthia 许关飞:美团●大众点评高级技术专家,酒店后台研发 ...

  4. SOA 新业务语言 新系统架构——什么是SOA

    原文地址:http://blog.csdn.net/ichaos/archive/2008/01/20/2054377.aspx SOA的概念是Gartner在1996年提出来的,并于2002年12月 ...

  5. Java生鲜电商平台-电商促销业务分析设计与系统架构

    Java生鲜电商平台-电商促销业务分析设计与系统架构 说明:Java开源生鲜电商平台-电商促销业务分析设计与系统架构,列举的是常见的促销场景与源代码下载 左侧为享受促销的资格,常见为这三种: 首单 大 ...

  6. 以字节跳动内部 Data Catalog 架构升级为例聊业务系统的性能优化

    背景 字节跳动 Data Catalog 产品早期,是基于 LinkedIn Wherehows 进行二次改造,产品早期只支持 Hive 一种数据源.后续为了支持业务发展,做了很多修修补补的工作,系统 ...

  7. 异构(兼容dubbo)SOA系统架构(.net)优化升级

    前面一片文章已经提到我司的异构(兼容dubbo)SOA系统架构,解决了不少技术痛点,也还算比较完善,也顺利推广开来. 但作为项目的开发者,自己产品的问题心里是清楚的,离自己满意还是有不小的距离. 在推 ...

  8. NET ERP系统架构设计

    解析大型.NET ERP系统架构设计 Framework+ Application 设计模式 我对大型系统的理解,从数量上面来讲,源代码超过百万行以上,系统有超过300个以上的功能,从质量上来讲系统应 ...

  9. 高性能、高可用、高扩展ERP系统架构设计

    ERP之痛 曾几何时,我混迹于电商.珠宝行业4年多,为这两个行业开发过两套大型业务系统(ERP).作为一个ERP系统,系统主要功能模块无非是订单管理.商品管理.生产采购.仓库管理.物流管理.财务管理等 ...

随机推荐

  1. 牛客多校第四场 A Ternary String

    题目描述 A ternary string is a sequence of digits, where each digit is either 0, 1, or 2. Chiaki has a t ...

  2. CodeForces ~ 996

    Allen has a LOT of money. He has nn dollars in the bank. For security reasons, he wants to withdraw ...

  3. perl代码调试

    perl调试教程 一.DESCRIPTIONA (very) lightweight introduction in the use of the perl debugger, and a point ...

  4. Linux文件系统命令 cp

    命令名:cp 功能:拷贝文件,把一个文件的内容拷贝到另外一个文件中去. eg: cp source_file dist_file renjg@renjg-HP-Compaq-Pro--MT:~$ cp ...

  5. NioEventLoopGroup的构造函数

    loop是对thread的封装,里面记录一个selector 一套打完,看下来,就是loopgroup里面一个loop的数组,每一个loop在 new的时候,传入了selector(第二个箭头), 第 ...

  6. SpringBatch Sample (五)(复合格式文件的读、多文件的写)

    前面关于Spring Batch的文章,讲述了SpringBatch对CSV文件的读写操作.对XML文件的操作,以及对固定长格式文件的操作.这些事例,同一个Reader读取的都是相同格式的数据,最终写 ...

  7. Tail Recusive

    1.尾递归 double f(double guess){ if (isGoodEnough(guess)) return guess; else return f(improve(guess)); ...

  8. fatal: unable to access 'https://xxxxx': SSL connect error

    /********************************************************************** * fatal: unable to access 'h ...

  9. Linux上统计文件夹下文件个数以及目录个数

    对于linux终端用户而言,统计文件夹下文件的多少是经常要做的操作,于我而言,我会经常在谷歌搜索一个命令,“如何在linux统计文件夹的个数”,然后点击自己想要的答案,但是有时候不知道统计文件夹命令运 ...

  10. golang channel 总结

    1.未初始化的channel读,阻塞 package main import ( "fmt" "time" ) func main() { var ch cha ...