高手问答第 252 期 —— 聊聊分布式架构那些事儿

雑人 发布于 08/11 19:29
阅读 9K+
收藏 9

分布式架构是分布式计算技术的应用和工具,其中J2EE技术应用较为广泛,它简化和规范多层分布式企业应用系统的开发和部署,它可以给分布式应用软件提供在各种技术间共享资源的平台。掌握分布式架构,就能帮你解决实际工作中常遇到的痛点,如系统宕机、系统瘫痪、系统故障、系统臃肿等等。

无论你是Java开发者、还是分布式架构爱好者,都能在分布式架构中受到启发,让我们一起探索,揭开分布式领域中神秘面纱吧!

OSCHINA本期高手问答( 2020 年 8 月 12 日——2020 年 8 月 18 日 ) 我们请来了张程老师@zacharyos和大家一起探讨关于分布式架构相关的问题。

问答范围

本次问答主要包括以下方向:

  1. 分布式架构技术栈方面问题,包括但不限于高并发、高可用、高效性等问题。
  2. 分布式架构中性能优化问题,包括但不限于Web容器、缓存、负载均衡、队列等问题。

嘉宾简介

张程,有6年研发经验。曾就职于格瓦拉生活商务有限公司演出部门,从事Java研发以及设计方面工作,之后进入优速科技有限公司信息技术部门,从事高并发下单渠道、面单打印平台研发、全链路压测、系统容灾方案设计,并担任架构设计和技术负责人。著有《分布式架构:技术栈详解与快速进阶》一书,已由机械工业出版社出版。

为了鼓励提问@华章 会在问答结束后从提问者中抽取5名幸运会员赠与正版分布式系统架构技术栈详解与快速进阶一本

适读人群:

  1. Java软件开发人员;
  2. 前端H5工程师和交互工程师;
  3. 分布式系统工程师和架构师。

京东购买链接:https://item.jd.com/12679217.html

OSChina 高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。

下面欢迎大家就相关问题向张程老师@zacharyos 提问,请直接回帖提问。

 

加载中
0
雑人
雑人

高手问答第 252 期 —— 聊聊分布式架构那些事儿
@Li_Peng   @alan杜   @源码分析55   @fightingAllTheDay  @猪娃娃 
恭喜以上五位小伙伴分别获得图书一本
请在48小时内私信 @雑人    告知快递信息(格式:姓名+电话+地址),过期中奖资格将会被取消!

0
Li_Peng
Li_Peng

@zacharyos 您好,想请问一下,在您过去的实际项目中,对于MySQL的分库分表和读写分离是否会同时使用?如果同时使用感觉架构上有些复杂,但是不同时使用分库分表和读写分离架构的话,不知道是否有其他更好的架构进行替代?

zacharyos
zacharyos
您好,还是要根据实际场景来划分,两者不想冲突。优先级依次 读写分离/分库分表。项目实际运用场景中如果需要用到读写分离/分库分表时,可以用一款成熟的插件尽可能来降低难度,如:mycat/sharding, 具体可以参考书中Mysql章节有详细介绍和分析。
0
z
zb83430830

@zacharyos 站点层过滤的话,是把uid请求数单独保存到各个站点的内存中么?如果是这样的话,怎么处理多台服务器集群经过负载均衡器将相同用户的响应分布到不同服务器的情况呢?还是说将站点层的过滤放到负载均衡前?

zacharyos
zacharyos
回复 @三轮大师 : 负载均衡都有重新转发流量的策略,如Nginx有upstream_next,当检测到异常服务器后会转发流量到其它服务器
三轮大师
三轮大师
回复 @zacharyos : 如果是基于ip_hah,那么如果某一台服务宕机了,导致某一些用户无法正常服务 这个问题要怎么解决呢?
zacharyos
zacharyos
基于你的提问,有多种实现方式,常用会用集群session、redis缓存、负载均衡等。如果系统比较庞大,用户数量较大,可以采用ip_hash,虽然有点耗资源,但是效果显著。
0
赤脚小子
赤脚小子

@zacharyos 老师好

1. grpc,http,dubbo 目前你们是如何取舍的

2. 数据库的容灾做到了什么级别,同城互备?异地多活?这期间是怎样的演化过程,都上云了么?数据安全性如何保证的?

3. 分布式事务请问你们用的是柔性事务么?基于还是不基于MQ?您更倾向哪个方案呢?

谢谢老师

AlexZ1024
AlexZ1024
回复 @zacharyos : 请问你们异地多机房数据如何做的同步呢?时延和带宽分别要求多少呢?
zacharyos
zacharyos
针对你的问题如下: 1、grpc,http,dubbo 两类协议,根据项目中实际需求来决定,http和rpc本身在网络传输上有差别。 2、目前异地双活,演从同城单机房、异地多机房,演化的本源是容灾和提高处理效率,没有上云,上云流量会涉及更多网络设备转换不可控延迟等。数据库多主多从内部机房。作用在内网。 3、分布式事务目前推荐使用中间件如:MQ来处理,当然rocketmq更完善,场景覆盖更全面
0
开源中国首席罗纳尔多
开源中国首席罗纳尔多

@zacharyos 您好,请问分布式,多个数据库的情况下怎么保证数据复制够快,不影响下单的时候查库存是准确的?加锁就慢了?

zacharyos
zacharyos
你的问题其实应该分为分解下 首先数据库分为很多种类。以Mysql举例说明如下: 1.mysql本身支持binlog方式数据同步,方案:主从节点,之前压测过,500并发下主从同步延迟在100毫秒内,1000并发在150-300毫秒内。延迟相对不大,供参考。 2.核心需求高并发下单是否会查询库存是否有很大延迟?推荐方案 可以把下单服务里面的组合服务并行执行通过订阅消息解耦
0
猪娃娃
猪娃娃

@zacharyos 您好
1、后端服务可以使用微服务进行拆分,前端开发是否有成熟可用的 微前端技术支撑微服务?
2、目前ServiceMesh 火热发现很多公司都开始着重研究 Mesh 方向,是否以后也是趋势?

zacharyos
zacharyos
目前后端使用微服务技术已经比较成熟,前端也在持续发展,其中借鉴的思路,目前singleSpa广泛。 随着技术的变革更新,容器从docker至K8s,很多技术其实已经融合的很好,ServiceMesh技术目前讨论较多,Mesh后续会持续发力。
0
A
Aiwass

@zacharyos 老师您好,想请教下对于类似秒杀,抢红包的场景下,怎么去做分流,如何去及时更新库存

zacharyos
zacharyos
整个秒杀场景方案设计。大概分为以下几类 1.秒杀活动页(静态资源、图片压缩、请求分包分量) 2.服务器倒计时实时读取 3.服务器高并发处理请求,并进行合理的熔断 4.分流方案设计(1.用户分类识别标记,2.网关层根据标签合理分流策略) 5.缓存数据 6 识别正常用户,对于非正常用户进行验证、黑白名单、爬网、请求频率等验证 7.库存问题设计(缓存、数据库最终一致性),避免超卖、少卖
0
君千殇520
君千殇520

@zacharyos 您好,微服务系统是当下最流行的架构,但是在具体开发过程中,对于各种实际业务的处理总会遇到很多问题,目前我遇到2个问题,虽然已经解决,但是总感觉不是很好的解决方案。

1.在分布式系统中,分库分表已经是常态,那么对于基础数据,比如:人员、用户、部门、公司等,在其他业务库里面(业务库和基础库不在同一服务器、不在同一数据库),比如:人员名称、用户名称、部门名称等类似这种基础信息,需要显示,并保证这些信息修改后能实时生效,在业务这边看到最新的信息。有什么比较好的解决方案吗?(不能增加系统复杂性、增加太多开发工作量)

2.对于java,现在用的orm框架hibernate,在sql调优这块根本没法进行。之前考虑换mybatis,但是改动工作量太大,目前新的服务和项目采用的是mybatis,但是旧的服务和项目还没发很好的解决这个问题。如果hibernate直接执行sql,那么就违背了orm初衷,很别扭。。

君千殇520
君千殇520
回复 @安宇雨 : 你这种方法现在用的就是这种思路:业务方也存放一套基础数据表,只需要考虑同步数据就行,而且改动后只需要同步一条数据更新,而不是上亿条
安宇雨
安宇雨
回复 @安宇雨 : 部分 改成 调用基础服务 得到相关 信息 , 假定 有个基础服务提供 select id from user where username = xxx 用集合来过滤出 业务 数据
安宇雨
安宇雨
回复 @君千殇520 : 他回答的是怎样通过公用信息.jar 大概就是(人员、用户、部门、公司)的dto | vo 再者可能是 直接 entity , 也就是数据结构, 怎样 通过 kafka 之类的 实时同步到 各 业务上的问题, 你的问题是sql 上层面的问题, 对于你这个问题, 他没有正面回答, 走sql层 , 业务方也是有基础表数据, 还是用表关联的, 不过基础系统足够快的话 把子查询
君千殇520
君千殇520
回复 @zacharyos : 2.你这种应该是冗余名称。然后用户服务更新用户信息的时候,来同步更新业务表的冗余名称吧?这种做法我们个别业务用过,但大部分业务用不了:比如,10个服务里面30个业务表冗余了用户名称,难道用户名改了后,来用mq更新业务表吗 ?工作量是一方便,而且后期只要增加有用到用户的业务,都要改代码再做处理;数据量,这个时候更新业务的数据量可能就千万数据了,尤其是一个用户几年后改名
君千殇520
君千殇520
回复 @zacharyos : 的确没太明白你提供的方案。1.订单表不冗余用户姓名,需要通过id查询然后再放进来,但是比如分页,如果不仅仅需要姓名,还需要部门等或者还有别的业务服务信息名称(比如工程名),难道每个都通过id去查询吗?分页要是还有查询呢?根据用户名,部门名,工程名等来查询呢?
下一页
0
蔡晓建
蔡晓建

引用来自“君千殇520”的评论

@zacharyos 您好,微服务系统是当下最流行的架构,但是在具体开发过程中,对于各种实际业务的处理总会遇到很多问题,目前我遇到2个问题,虽然已经解决,但是总感觉不是很好的解决方案。

1.在分布式系统中,分库分表已经是常态,那么对于基础数据,比如:人员、用户、部门、公司等,在其他业务库里面(业务库和基础库不在同一服务器、不在同一数据库),比如:人员名称、用户名称、部门名称等类似这种基础信息,需要显示,并保证这些信息修改后能实时生效,在业务这边看到最新的信息。有什么比较好的解决方案吗?(不能增加系统复杂性、增加太多开发工作量)

2.对于java,现在用的orm框架hibernate,在sql调优这块根本没法进行。之前考虑换mybatis,但是改动工作量太大,目前新的服务和项目采用的是mybatis,但是旧的服务和项目还没发很好的解决这个问题。如果hibernate直接执行sql,那么就违背了orm初衷,很别扭。。

关于hibernate和mybatis混用,可以复杂查询用mybatis,增删改用的hibernate

君千殇520
君千殇520
那我还不如增删改查简单的用mybatis-plus
0
蔡晓建
蔡晓建

引用来自“君千殇520”的评论

@zacharyos 您好,微服务系统是当下最流行的架构,但是在具体开发过程中,对于各种实际业务的处理总会遇到很多问题,目前我遇到2个问题,虽然已经解决,但是总感觉不是很好的解决方案。

1.在分布式系统中,分库分表已经是常态,那么对于基础数据,比如:人员、用户、部门、公司等,在其他业务库里面(业务库和基础库不在同一服务器、不在同一数据库),比如:人员名称、用户名称、部门名称等类似这种基础信息,需要显示,并保证这些信息修改后能实时生效,在业务这边看到最新的信息。有什么比较好的解决方案吗?(不能增加系统复杂性、增加太多开发工作量)

2.对于java,现在用的orm框架hibernate,在sql调优这块根本没法进行。之前考虑换mybatis,但是改动工作量太大,目前新的服务和项目采用的是mybatis,但是旧的服务和项目还没发很好的解决这个问题。如果hibernate直接执行sql,那么就违背了orm初衷,很别扭。。

可以考虑 CQRS架构,也可以用cache。

其实分布式能不分就不分,适当规模的单体其实很好。

君千殇520
君千殇520
如果用了分布式系统,数据库不分库分表,那么用分布式意义就不大了,就是搞再多的负载均衡、集群,数据库能力在摆着,没啥用; 第一个问题,缓存解决不了... 就举个简单例子,订单分页信息查询,查询条件用户名,返回数据要有用户名,怎么查?数据怎么返回?难道查询之前先去缓存里查下用户id,然后再分页查?返回数据后再从缓存里拿用户名组合返回? 正常业务工作量至少增加了3倍,系统由于缓存问题还会不稳定报错
返回顶部
顶部