分布式系统常见的问题和解决办法

https://blog.csdn.net/Be_Pretty_Better/article/details/82732908

1.分布式session问题:因为在分布式系统中,服务器集群,同一服务通常会放在几台不同的服务器中,当浏览器第一次发来请求或原session已经失效时,会在服务器端创建session,并将sessionId放在响应头中返回浏览器保存在cookie。当浏览器第二次访问时,会带着sessionId在服务器中查找session,虽然两次访问的网址相同,但是请求可能打到两个不同的tomcat上,这样第二次请求找不到之前的session。这个问题有以下5种解决方法:
使用数据库进行session共享
使用redis进行session,k,v分别是sessionId,session,该方法已经集成在springboot中,在redis配置类上加@EnableRedisHttpSession
使用token加session,token和session都是临时且唯一的,redis的k,v分别是token,session
使用tomcat自带的session同步工具,但是效果不好有延时
在网关层做ip hash操作,确保相同ip的请求可以打到相同的tocmat
2.分布式跨域问题:前端页面的ajax请求在访问当前页面所在的系统的服务接口时,不会发生任何问题,但是在访问系统的页面时,可以将请求成功发出去,也可以成功返回,但浏览器不会允许展示,这个问题有4种解决办法:
在响应头中加“access-control-allow-origin”
用nginx或zuul反向代理,请求全都打到反向代理服务器,在通过反向代理服务器发请求,并返回给ajax,在浏览器看来都是同一个系统
用jsonp,将ajax的type设置jsonp,但是jsonp只能支持get请求
ajax打到本系统的某接口,在通过这个接口封装httpclient或其他rpc框架发请求
3.分布式任务调度:系统中都会有定时任务,当同一服务被部署到多台不同服务器后,同一定时任务就会被被执行多次,比如定时进行redis备份,那么redis就会被备份多份,这显然是不对的。
通过使用xxl-job调度中心进行统一调度,保证同一时间相同任务只有一个被执行。
4.分步式事物:一个方法A改了自己的数据库,成功后,又通过rpc发请求给另一个服务B改B的数据库,也成功,返回true,结果网断了,A没收到B的响应,超时之后,A数据库回滚,B不动,这样就违反一致性。
用lcn框架解决,lcn是国人开发,核心思想是“不生产事物,只做本地事物搬运工”,采用2pc协议,也就是当两个数据库都操作完成并成功后,都会给lcn发信号,这时lcn在同一commit,否则lcn统一rollback
5.分布式幂等性:例如表单重提交问题,应该提交多次只有一次起作用,在传统系统中,多次提交会打到统一接口,可以再接口内部进行请求去重,但是在分布式系统中,多次提交可能打到不同服务器上,不能再按照之前的方法去重
解决方法:用aop做请求拦截,在前置通知中,判断过来的请求头中是否有token,如果有放行,如果没有,采用uuid+时间戳的方式,基于分布式锁生成全局唯一token,加到请求头中,在将token存放到redis,放行。请求到达环绕通知,首先判断请求头中的
token在redis能否查到,如果能,删除redis的token,执行请求接口。如果redis中没有对应的token,说明请求是第二次或多次调用,拦截。
6.分布式锁:当多个线程同时对一个变量进行读写操作,就会产生线程安全问题,但是传统的synchronized对其他系统的线程是不可见的,所以需要一个对所有服务所有线程都可见的锁。
三中解决方法:基于数据库,基于redission,基于zookeeper。在zookeeper约定好的路径下建临时节点,同一时间只有一个线程能建立成功,并且在删除之前都不能创建相同路径的节点,定义watch可监听节点的删除操作,删除后其他节点能及时得到通知
而不用轮巡的尝试创建锁。在这提一下java的一个基础知识,synchronized和lock的区别,lock有tryLock方法,可以尝试创建锁,并拿到返回值,lock能够知道当前有没有锁,并进行处理,而synchronized在不能加锁的时候阻塞住,直到能加锁为止。zookeeper
分布式锁类似lock,在创建临时节点的时候,创建成功和失败都会有返回值。
redission方式:redission和ReentantLock是唯二的两个实现了lock接口的类,reentantlock是重入锁,redission是分布式锁,用法和lock相同,是基于redis实现的。

分布式系统常见问题总结

https://blog.csdn.net/moranzi1/article/details/78572219

分布式系统常见的几个问题和解决办法

原文地址:https://www.cnblogs.com/Andrew520/p/12142860.html

时间: 2024-10-13 12:05:28

分布式系统常见的问题和解决办法的相关文章

linux 编译安装php及编译安装mysql常见错误总结及解决办法

一.编译安装php常见错误总结及解决办法 错误 1checking for xml2-config path…configure: error: xml2-config not found. Please check your libxml2 installation.解决办法:# yum -y install libxml2-devel 错误 2 checking for BZip2 in default path… not foundconfigure: error: Please rein

移动端常见兼容性问题及解决办法

当使用transform:translate3d(-50%,-50%,0)居中弹框(div)时,在pc端,内部的文字会模糊.解决办法:给body定义样式 body{ font-family: Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,SimSun,sans-serif; } 用position:absolute/fixed;把一个按钮固定在页面的底部,在android系统中,当调用输入法时,该按钮会

Hadoop等软件常见运行问题及解决办法

Hadoop常见问题及解决办法 1.问题:java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries  解决:在程序中添加hadoop.home.dir设置,如:“System.setProperty("hadoop.home.dir", "D:\\desktop\\hadoop-2.6.0");”,并将winutils.exe拷贝至D:\

Linux客户机访问FTP服务器常见的问题及解决办法

在Linux系统中,搭建一个服务,就是修改其配置文件,一般情况下,配置文件的修改出现问题的概率不大,多半是一些其他因素导致客户机与服务器之间访问出现问题,下面就针对客户机访问FTP服务器常出现的一些问题找出解决办法.其他服务的解决办法也类似.1.客户机无法访问FTP服务器如果说客户机无法访问FTP服务器多半是防火墙的作怪,iptables 防火墙管理工具默认禁止了 FTP 传输协议的端口号,因此在正式配置 vsftpd 服务程序之前,为了避免这些默认的防火墙策略"捣乱",还需要清空 i

Tomcat常见内存溢出的解决办法

PermGen space错误解决方法 在看下文之前,首先要确认意见事情,就是你是如何启动tomcat的,我们在平时的开发环境当中,都是通过startup.bat方式启动tomcat的,那么你按照下面的方式,去修改/bin/catalina.bat是没有问题的.但是如果你是生产环境下,我们一般都希望使用windows服务方式去启动tomcat,此时之前修改的配置文件是没有用的.因为windows服务启动tomcat不再去加载catalina.bat当中的参数了,而是去加载注册表中的参数,所以我们

服务器运维常见的故障及其解决办法

进入信息时代,各种行业对数据的安全和技术要求也越来越高,,同时也遇到了各种各样的服务器故障问题,虽然能够接到服务器厂商的支持,但是往往耗时耗工,特别是有些不能够立即判断和解决的问题,造成了企业不必要的损失,下面是针对一些常见的服务器故障现象和解决方法,以便更好的更快的进行故障处理和排查. 01 服务器常见故障及现象 有关服务器无法启动的主要原因 : ①市电或电源线故障(断电或接触不良) ②电源或电源模组故障 ③内存故障(一般伴有报警声) ④CPU故障(一般也会有报警声) ⑤主板故障 ⑥其它插卡造

使用dedecms中常见错误提示及解决办法(一)

在使用 dedecms 做网站时,常常会遇到一些棘手的问题,比如:页面图片不显示(src 的地址不对)等等. 1. 更新网站时错误 问题:Call to a member function GetInnerText() on a non-object(在一个非对象类型上调用成员函数 GetInnerText()). 原因:出现这个问题,是因为自定义了内容模型,这个内容模型里有图片字段.当我们去生成网站时,更新网站就会提示此错误. 解决:打开 \include\taglib\channel\img

几个常见CSS错误和解决办法

1.IE6下,当float存在时,margin双倍的问题 解决方法:加display:inline; 例: #content { float: left;     width: 500px;     padding: 10px 15px;     margin-left: 20px;     display:inline; } 2.克服盒子模型的hack 原写法: #main-div{ width: 150px; border: 5px; padding: 20px; } 修正后 #main-d

eclipse插件开发常见的问题及解决办法

莫名其妙地我的某个Plug-in Projects出现了这样的Error:An API baseline has not been set for the current workspace.虽然后来通过上网查找解决了(就是把两个error弄不显示了),只要在Window -> Preferences -> Plug-In Development -> API Baselines | Missing API Baseline option设置成Ignore就行.