今天在演练这样一个场景——假如所有缓存服务器都宕机,而且不能很快恢复,并且假设数据库服务器能够支撑,在代码中如何应对这样的情况?

之前的做法是在读缓存的地方捕获异常并写入日志,然后直接从数据库读取数据;在写缓存的地方捕获异常并写入日志,继续后续处理。这样看起来不错,虽然缓存服务器宕机,但程序可以继续工作,虽然速度慢一些,但不会让网站服务中断,然后只要把缓存服务器恢复即可。

但是如果缓存服务器宕机时,访问量很大,每一个操作缓存的地方都抛异常、写日志,这是两个开销很大的操作,大量的这样的操作会给Web服务器带来很大的压力。有没有更好的解决方法呢?

当操作缓存时抛出了第一个异常,我们就已经知道缓存服务器发生了故障。接下来对缓存的任何操作不仅没有必要,而且由此产生的异常会带来额外的开销、影响性能。只要我们通过一种方式在知道缓存服务器发生故障的第一时间通知后续缓存操作代码不要进行缓存操作,就能解决这个问题。

我们想到的一个解决方法是通过全局静态变量,该全局静态变量保存缓存服务器当前可用状态,只要有一个操作缓存的地方出现异常就将该变量置为不可用状态,并写日志、发通知。每一个操作缓存的地方在操作前先检查一下这个全局静态变量,一发现缓存服务器不可用,就放弃操作缓存,进入无缓存情况下的操作流程。当我们得知缓存服务器宕机后,先专心把缓存服务器恢复正常运行,然后更新一下这个全局静态变量即可。

这又是一个看起来不错的解决方法。但是全局静态变量只能在当前应用程序的当前进程中全局,无法在Web Farm(比如使用负载均衡,同一个应用程序运行于多台服务器上)与Web Garden(同一个应用程序运行于同一台服务器的多个进程中)的场景中全局。所以采用这个解决方法,缓存服务器宕机时,每个进程都要进行捕获异常、设置全局静态变量的操作,虽然不是最佳解决方法,但总比异常满天飞要好很多。还有一个更头疼的问题,就是在缓存服务器恢复正常后,如何将这些全局静态变量恢复为可用状态?无法代码进入每一个进程中进行操作,目前我们只想到一个解决方法——重启应用程序(如果是IIS,回收应用程序池)。

有没有更好的解决方法呢?继续思考,也期待你的良计妙策。

【更新】

改进修改全局静态变量的方式,通过定时执行的代码检查缓存服务器的状态。如果缓存服务器不可用,将全局静态变量置为不可用状态;如果缓存服务器可用,并且全局静态变量的值为不可用状态,则将全局静态变量置为可用状态。

如何应对java服务器宕机_代码中如何应对缓存服务器宕机的情况相关推荐

  1. 10分钟搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡...

    10分钟搭建服务器集群--Windows7系统中nginx与IIS服务器搭建集群实现负载均衡 原文:10分钟搭建服务器集群--Windows7系统中nginx与IIS服务器搭建集群实现负载均衡 分布式 ...

  2. 安装web服务器组件,在Windows2003系统中如何安装Web服务器组件?

    当用户使用dreamweaver软件时会使用到IIS服务器,而Web服务器组件是WindowsServer2003系统中IIS6.0的服务器组件之一,默认情况下并没有被安装,用户需要手动安装Web服务 ...

  3. mysql事务中宕机_事务执行一半,业务系统宕机,数据库的数据会怎样?

    业务系统提交了一个数据库dml指令,在尚未进行提交时,系统宕机了.那么数据库的数据会是修改前的,还是修改后的?数据库中的连接是否会断开,数据是否会被锁定?带着这些疑问,我们做的如下测试: 1.在数据库 ...

  4. java美元兑换_代码中的美元$

    这个题目其实有点标题党了,其实本篇文章主要内容应该是说"代码中的美元符号(dollar sign)".想总结一下我所看到的美元符号在代码中的起到的作用,当然了并不是说它作为格式化字 ...

  5. java 代码坏味道_代码中的坏味道

    前言 在日常生活中,当我们买的水果放久了之后会发出一种难闻的气味("坏味道"),这个时候我们就应该把它扔掉.同样,代码也有"坏味道",当然确定什么是和不是代码& ...

  6. 局域网中另外一台服务器的内存_工作中遇到的技术名词

    1.Cookie Cookie 是浏览器访问服务器后,服务器传给浏览器的一段数据. 此后每次浏览器访问该服务器,都必须带上这段数据.最常用的是识别用户身份,以及记录历史. 2.日志 日志是包含有关系统 ...

  7. python 串口上位机_如何使用Python开发串口通讯上位机(二)

    黑色的dos窗口对于大部分来说,页面极为不友好,且操作不方便,因此本篇主要讲讲如何结合QtDesigner创建一个UI并初步与串口Api链接.1 QtDesigner进行上位机页面设计 Python下 ...

  8. java 不要使用魔法值_Java代码中的魔法值

    所谓魔法值,是指在代码中直接出现的数值,只有在这个数值记述的那部分代码中才能明确了解其含义. 1. 前言 重构老代码中遇到了不少类似下面这种写法: public void attend(String ...

  9. java.library.path属性在代码中设置不生效问题

    http://www.blogjava.net/gembin/archive/2008/10/29/237377.html from http://daimojingdeyu.blogbus.com/ ...

最新文章

  1. 如何让语音助手通过图灵测试
  2. python编程界面怎么打开-为Python程序添加图形化界面的教程
  3. 【原创】.NET读写Excel工具Spire.Xls使用(4)对数据操作与控制
  4. (转)安装黑苹果 MAC OS X Lion 10.7.2过程 (未验证)
  5. 跨专业选修C语言看什么书,跨专业考研如何选择?!!!!!
  6. 在阿里云里申请免费Https证书SSL
  7. dojo中的AMD模式开发案例
  8. c# out关键字 vb_在c#中使用out关键字
  9. 彻底搞定C指针-——第五篇:函数参数的传递
  10. 在网上收集了一部分关于使用Google API进行手机定位的资料和大家分享
  11. Centos7静态ip设置(亲测有效)
  12. springboot细节挖掘(集成ElasticSearch)
  13. C# async await
  14. CCF NOI1027 数字之和
  15. 什么是死亡之 Ping 攻击?
  16. Linux服务器密码过期了怎么办?Linux服务器如何设置密码永不过期?
  17. 网线/双绞线相关知识
  18. python字典forward_python工具库库介绍-bidict: 双向字典
  19. 计算机双工模式,windows10系统如何设置网络双工模式?
  20. 编写程序获取 vector 容器的第一个元素。分别使用下标 操作符、front 函数以及 begin 函数实现该功能,并提 供空的 vector 容器测试你的程序

热门文章

  1. VMware15安装centos7开机黑屏死机问题
  2. 【宾馆房间开门问题】
  3. java统计字母出现次数_java文件如何统计字母出现的次数和百分比
  4. android启动流程之preloader--->lk
  5. 小议过滤器filter
  6. Python网络爬虫(四):selenium+chrome爬取美女图片
  7. 5. docker的镜像相关命令
  8. Motion Blur 运动模糊 后期处理系列6
  9. [Buzz Today]2012.09.12
  10. webview 硬件加速问题