原创 千万别强制停机!我嘴都气歪了!

发布时间:2021-06-24 09:59:12 浏览 335 来源:猿笔记 作者:程序员鱼皮

    会导致服务器被强制停机,我们自己偶尔也会用任务管理器或者`kill-9`命令杀个进程啊,会开启一个线程来处理该请求,4假设web服务进程突然中断,会导致所有在内存队列中等待执行的请求丢失!要检查所有数据库中状态为0的数据是否正确。会导致以后这条数据的状态始终为1,也会导致**数据的状态和预期不一致**,业务中断可能直接影响收益,数据库事务是指对数据库的一系列**不可分割**的操作,应用程序或者数据库系统突然挂了,回滚过程也可能会被中断,事务中断还可能导致锁行、锁表,假设程序正在向一个文件进行写操作,可能会导致文件的不完整、甚至损坏。


    你知道强行关机的后果有多严重吗?

    有一天,我正在愉快地写一篇技术文章,电脑啪地一声变成了蓝屏!

    结束了。写了几千字忘了存!

    我盲目猜测,很多同学都有这种经历,因为一些意料之外的意外,迫使电脑停机,丢掉了现在的工作。

    同样,对于企业来说,所有的网站、应用程序、数据和服务都挂在服务器上。一旦发生意外,如被切断或遇到自然灾害,服务器将被迫停止,机器上所有正在进行的程序将被强制中断。后果不堪设想!

    有同学笑了,但是节目被强行打断了。我们偶尔使用任务管理器或“kill-9”命令来终止一个进程。为什么不快速重启程序?有什么大不了的?

    的确,我曾经通过杀人过程下线升级服务,很爽很爽。但直到有一次,因为强行杀人过程,导致网络事故,造成经济损失,加班加点,嘴都喘不过气来了!我意识到我太粗暴,太单纯。

    * *其实一个程序被强行中断,除了无法提供服务,还有很多严重后果!**

    ####1.请求丢失

    一个web服务器,比如Tomcat,是JavaWeb开发的主流。当收到请求时,会打开一个线程来处理该请求。但是,如果请求的数量太大,线程无法处理,请求将被放入等待队列,等待空闲线程。

    假设web服务进程突然中断,会导致内存队列中所有等待执行的请求丢失,等待时间很长,什么都不等!

    ####2.业务中断

    一旦流程中断,会导致所有* *正在进行的业务中断,会导致很多意想不到的后果。

    比如有一个检查数据的任务,就是检查所有数据库中状态为0的数据是否正确。代码流程如下:

    java//开始检查,数据状态由0置为1startCheck();//检查doCheck();//结束检查,将正确的数据状态置为2endCheck();

    假设数据的状态刚刚被设置为1,表明它正在被检查。然后程序中断,会导致数据一直为1,永远不会再检查。

    同理,如果数据检查无误,数据状态应该设置为2,但程序中断时,数据状态会与预期不符。

    以上只是一个简单的例子,但是在实际的业务场景中,业务中断可能会直接影响收益,尤其是涉及交易的支付转账业务。如果用户已经支付,但是因为程序中断导致支付记录没有保存,那么这个支付业务不是真的爽吗?

    ####3.交易中断

    数据库事务是指对数据库进行的一系列* *不可分* *的操作,这些操作是一致的。每次执行都必须使数据库从一种一致的状态变为另一种一致的状态。

    比如转账业务,用户A需要转账1元给用户B,用户A扣1元,用户B需要增加1元。

    但如果用户A已经扣了1元,应用或数据库系统突然挂机,导致交易未完成就中断。因此,用户B的总量保持不变。此时,数据库处于不一致状态。同样,即使在程序中设计了回滚,回滚过程也可能会被中断!

    除了数据不一致之外,事务中断还可能导致行和表的锁定,这可能会影响这部分数据的可用性。

    ####4.文件损坏了

    假设程序正在写入一个文件,它在完成之前被中断,这可能导致文件不完整甚至损坏。

    这让我想起小时候电脑配置不高,有时候玩游戏卡。然后强行杀了进程,导致游戏文件损坏,只好重新下载游戏。

    ####5.任务丢失

    当我们编写业务代码时,我们经常异步处理耗时的任务,并在将任务提交给线程池后立即返回成功。线程池从任务队列中依次读取和执行任务。

    一旦程序中断,线程池中的任务就会丢失,* *就好像他从来没有提交过* *。就像你答应了一个人去做一件事,他们和你在一起心安理得,但你最后还是站起来跑了。

    ####6.数据丢失

    有时,我们将数据临时存储在内存中,然后定期、定期或成批地将其保存到数据库或本地磁盘中。

    比如Redis数据库的RDB机制,定期在本地备份内存中的数据,减少了大量数据并发写入时的负载,提高了性能。

    但是就像上面说的任务丢失,一旦程序中断,可能会导致很多* *非持久数据丢失,比如缓存、批量提交数据等。

    ####7.信息丢失

    在分布式系统中,每个节点经常通过消息进行交互和协作,但是程序中断可能不同

作者信息

程序员鱼皮 [等级:3] 应用开发工程师
发布了 12 篇专栏 · 获得点赞 491 · 获得阅读 33507

相关推荐 更多