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. 浅谈如何正确给table加边框

    一般来说,给表格加边框都会出现不同的问题,以下是给表格加边框后展现比较好的方式 <style> table,table tr th, table tr td { border:1px so ...

  2. day12作业答案

    2.1 # lst=['asdgg','as','drtysr'] # lst2=[i.upper() for i in lst if len(i) >3 ] # print(lst2) # 2 ...

  3. python文件读写小结

    读文件 打开一个文件用open()方法(open()返回一个文件对象,它是可迭代的): >>> f = open('test.txt', 'r') r表示是文本文件,rb是二进制文件 ...

  4. win10上Adobe Acrobat打开后停止工作

    额,,之前是WIN7,装上没问题,结果更新WIN10之后,突然打开就直接崩溃,,,,,上百度搜了挺多方法,知乎上有个人说,,,卸载必应词典就行了,,真的还可以,哈哈哈~

  5. [转载] About Career Promotion and Tutoring from Zhihu Web FAQer (Quoted Entirely Without Personal Idea. Delete Immediately If Pirated)

    问题: 如何下列各类公司的互联网IT类工作待遇排名? 下列各公司岗位待遇序号从小到大依次降低: 美国互联网总部special offer(15万刀起薪) : 股份制银行总行,证券公司,基金公司IT部门 ...

  6. 关系数据库(MySQL)的规范化、以及设计原则

    1.了解范式(NF) 为了使得关系数据库能够符合规范理论,所有的数据库表都要满足:范式. 关系数据库的范式有五类:第一范式,第二范式,....第五范式.下面我们来了解一下前三个范式: 第一范式:简单来 ...

  7. JAVA基础部分复习(一、8中基础类型,以及String相关内容)

    以下是关于java中8种基本类型的介绍说明: package cn.review.day01; /** * java基础复习,8种数据类型 * (byte,short,long,int,double, ...

  8. 将js和css文件装入localStorage加速程序执行

    原理如下: 一次批量加要加载的文件存入数组,采用Ajax方式异步载入各个文件,然后采用循环方式逐个执行下载下来的Js或者Css文件,如果已经被缓存(localStorage)的则省略下载过程. 由于J ...

  9. js的调用方式

    1.元素绑定 给具体的元素绑定JS的事件 事件:由用户行为触发的操作(鼠标操作,键盘操作) 语法:<标签 事件函数名="JS代码"> et: onclick:单机事件 ...

  10. 2017-2018-1 20155219《信息安全技术》实验二——Windows口令破解

    2017-2018-1 20155320<信息安全技术>实验二--Windows口令破解 实验目的 了解Windows口令破解原理 对信息安全有直观感性认识 能够运用工具实现口令破解 实验 ...