微服务架构开发电商系统需要用Redis、ES和MQ吗?
如果不用什么很高大上的东西,就是有多个微服务就行这种技术架构会很难吗?
我看了一些视频,他们都用到了es、mq、redis的东西,我想不用这些东西,就简单的有多个服务,这样可行吗?
01 使用微服务你考虑好了吗?
首先商场的开发要根据你的实际需要来定夺架构,例如,只是在微信小程序中商品滚动图片展示、产品分类、微信支付、订单、地址、简要配送信息,并且有一套后台管理系统,包括:用户、角色、商品、定价、订单等,基本上一个完整的商场系统就可以运行了。那么是不是要一定上微服务呢,还是单体服务就够用了呢?
需要上微服务架构最主要的目的就是为了解决服务功能频繁更新发布,导致总是影响业务大面积抖动,从而降低了新功能的敏捷迭代。因为对于单体服务,这个问题是无法避免的,一定会影响可靠性。
1. 分布式CAP:但是我接触过的微服务项目,往往微服务发布机制都不成熟,实际上每次发布微服务和发布单体是一个效果,所有服务都得停下来重新部署。为什么呢?因为在线事务系统一定是优先考虑强一致性,无论什么开发团队遇到微服务,嘴上说得再漂亮,到了部署的时候,身体都会很诚实。微服务在分布式环境下对CAP理论的付诸实施,你是否已经了然于心了呢?
只要是联机事务,在微服务环境下依然要保证分布式强一致性。如下图所示:

2. 分布式事务:微服务另外遇到的一个问题就是将单体应用对数据库的SQL操作拆分成了PRC远程协作,那么这个时候就可能涉及分布式事务。
如下图所示:发起端向支付微服务发起一次支付提交,完成支付后,支付微服务需要用RPC调用来通知订单服务更新订单状态,那么这时候系统就已经掉入到了分布式事务的漩涡。你是否为分布式事务做好准备了?

02 技术是随着业务规模的发展而逐步引入
其次,这些都对你来说都没有问题了,为什么还会有Redis,elasticsearch(es),MQ呢? 那我们就一一分析一遍这些技术在商场中的作用,你自己去评估是否引入。
1. Redis:主要作用是查询缓存,防止数据库被击穿,主要情境是商场出现了高并发的访问状态,不过也恭喜你,能用Redis证明你的业务很成功。
如下图所示:一个比较标准的MySQL读写分离,Redis作为查询缓冲区的联机事务处理的分布式架构耦。这种情况也是出现在MySQL读写分离都无法解决高并发带来的某个峰值时刻,对数据库的击穿,就需要通过增加一个二级缓存来解决。

请一定要注意,贯彻K.I.S.S原则,技术上能不加就不加的原则。因为总是要面对分布式的一致性问题,在加入Redis缓存这个问题,实际上这是目前工程师们非常流行的一种做法,但是在保证MySQL主从复制的一致性方面本身就存在不可控的复杂度,更何况,又引入缓存系统(Redis)和数据库(MySQL)之间的数据同步的一致性问题,会使得整体架构的复杂性更高,会导致上线后遇到很多不可预知的麻烦,所以在没有做好充分准备工作之前,增加架构复杂度的事情要慎之又慎。
2. Elasticsearch:对于大量的商品内容检索,高级一点就不仅仅是分类关键字查询了,更需要是专业搜索提供的商品内容的全文内容检索,方便用户通过组合关键字,更快查找到自己想要的商品,除非你对自己的编程功底认为不错,可以直接用luence,否则es是个很不错的选择。
如下图所示:为架构纳入Elasticsearch专业搜索引擎,需要引入的技术操作流程,MySQL binlog->Canal->Kafka->Elasticsearch,这是一个binlog实时推送架构,效果最好,也最复杂。这就是表面说起来简单,但真要做好,内部都要沁透工程师的辛勤与汗水。

3. MQ:当商场的微服务之间,以及商场与第三方服务之间形成犬牙交错的状况,一般微服务架构会形成事件驱动机制也就是EDA,例如订单发起后通过消息推送给下游,下游可能就是订单的配送系统接受处理。那么用到mq了,系统已经不再是一个小范围的商业服务了,应该算是平台级的!如下图所示:

当然mq的引入也不一定是发展到了规模化,也有可能一开始就面临O2O的业务需要,早期就需要将线上业务事件推送给线下业务系统,这就需要mq了,建议考虑支持分布式事务的mq,例如:rocketmq。如下图所示:传统企业搞互联网+,一开始就要考虑通过消息中心来解决线上线下的数据对接、信息安全、异步协作等问题。

03 总结
最后做个总结,对于上面聊的这些内容,我相信你心里至少应该有个底,可以明确一点——系统架构的技术体系都是不断迭代加厚,都是根据业务的需要不断地加持,逐步产生良好的业务支撑作用。
初期往往过度设计得越多,系统死掉的几率越大,因此微服务是不是一开始就要纳入设计? 系统性能优化,高级查询,复杂系统优化等等这些操作,是否需要在前期设计中完成?,是否已经有了与之匹配的团队组织形式? 这些都需要逐一斟酌,虽需长远规划但仍要从简入深。
可以阅读另一篇关于微服务和分布式关系的详细文章:
前往读字节创作中心——了解”读字节“更多创作内容

微服务架构开发电商系统需要用Redis、ES和MQ吗?的更多相关文章
- .Net微服务架构之运行日志分析系统
一.引言 .Net技术栈目前还没有像spring cloud相对完整一整微服务架构栈,随着业务发展系统架构演进,自行构建.Net技术体系的微服务架构,配套相关核心组件.因平台基于微服务架构方式研发,每 ...
- 庐山真面目之十三微服务架构中如何在Docker上使用Redis缓存
一.介绍 1.开始说明 在微服务器架构中,有一个组件是不能少的,那就是缓存组件.其实来说,缓存组件,这个叫法不是完全正确,因为除了缓存功能,它还能完成其他很多功能.我就不隐瞒了,今天我们要探讨 ...
- Java生鲜电商平台-SpringCloud微服务架构中核心要点和实现原理
Java生鲜电商平台-SpringCloud微服务架构中核心要点和实现原理 说明:Java生鲜电商平台中,我们将进一步理解微服务架构的核心要点和实现原理,为读者的实践提供微服务的设计模式,以期让微服务 ...
- Net分布式系统之五:微服务架构
因工作较忙,抽时间将框架遇到的问题和框架升级设计进行记录. 一.背景&问题 之前框架是一个基于SOA思想设计的分布式框架.各应用通过服务方式提供使用,服务之间通信是RPC方式调用,具体实现基于 ...
- SOA和微服务架构
微服务架构强调的第一个重点就是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用.这些小应用之间通过服务完成交互和集成.每个小应用从前端web ui ...
- MicroService 微服务架构模式简述
开源地址: https://github.com/TheCodeCleaner/MicroService4Net 本文内容 微服务 微服务风格的特性 组件化(Componentization )与服务 ...
- 基于 Docker 的微服务架构实践
本文来自作者 未闻 在 GitChat 分享的{基于 Docker 的微服务架构实践} 前言 基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 D ...
- SOA和微服务架构的区别
微服务架构强调的第一个重点就是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用.这些小应用之间通过服务完成交互和集成.每个小应用从前端web ui ...
- SOA和微服务架构的区别?
转自知乎:https://www.zhihu.com/question/37808426/answer/93335393 SOA和微服务架构的区别? 微服务架构强调的第一个重点就是业务系统需要彻底的组 ...
随机推荐
- 手把手教你如何使用Charles抓包
一.为什么使用charles 前几天因为需要通过抓包定位问题,打开了尘封已久的fiddler,结果打开软件后什么也干不了,别说手机抓包了,打开软件什么请求也抓不到. 很多时候都是如此,如果一个方案不行 ...
- Python基础之数据类型详解(2)
今天继续昨天的python基本数据类型详解,按照上一篇博文的格式,接下来讲解列表.元组.字典以及集合. 列表 1.用途按位置存放多个值2.定义在[]内用逗号分割开多个任意类型的元素 # 定义列表 # ...
- [树形DP]加分二叉树
加 分 二 叉 树 加分二叉树 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第j ...
- 高精度减法(c++)
高精度减法 每当要进行精度较高的运算时,就要用到高精度. 下图是各个类型的数值范围: 如果想不起各个类型占多少字节,可以采用下面的方法: printf("%d %d",sizeof ...
- C#类的一些基础知识(静态方法可以不用实例化调用)
将类成员函数声明为public static无需实例化即可调用类成员函数 using System; namespace ConsoleApp { class Program { static voi ...
- PBRT阅读笔记——COLOR AND RADIOMETRY
四个关键概念 Energy(Q) 每一个光子都有特定的波长并携带特定的能量: 其中c为光速,h为普朗克常量. Flux(Φ) 辐射通量,可以直观理解为功率.是能量对时间微分得到的 ...
- Leedcode算法专题训练(栈和队列)
1. 用栈实现队列 232. Implement Queue using Stacks (Easy) Leetcode / 力扣 class MyQueue { Stack<Integer> ...
- Java执行groovy脚本的两种方式
记录Java执行groovy脚本的两种方式,简单粗暴: 一种是通过脚本引擎ScriptEngine提供的eval(String)方法执行脚本内容:一种是执行groovy脚本: 二者都通过Invocab ...
- Spring/SpringBoot整合QuartZ
https://www.bilibili.com/video/av55637917/?p=2
- .netcore 写快递100的快递物流信息查询接口
快递100的物流信息查询接口,官方提供了一些demo;还好官方提供的代码是.netcore版本写的,不过写的有点low;根据官方提供的代码,我按照.netcore 的风格重构了代码:核心代码如下: / ...