新闻资讯  快讯  焦点  财经  政策  社会
互 联 网   电商  金融  数据  计算  技巧
生活百科  科技  职场  健康  法律  汽车
手机百科  知识  软件  修理  测评  微信
软件技术  应用  系统  图像  视频  经验
硬件技术  知识  技术  测评  选购  维修
网络技术  硬件  软件  设置  安全  技术
程序开发  语言  移动  数据  开源  百科
安全防护  资讯  黑客  木马  病毒  移动
站长技术  搜索  SEO  推广  媒体  移动
财经百科  股票  知识  理财  财务  金融
教育考试  育儿  小学  高考  考研  留学
您当前的位置:首页 > 解决号 > IT

线上服务器宕机时,如何保证数据100%不丢失

时间:2019-07-04 15:06:49  来源:  作者:  发布:admin

一、写在前面

上篇文章《同学,消息中间件在你们生产项目里如何落地使用的?》,我们用一个简单易懂的电商场景给大家引入说明了一个消息中间件的使用场景。

同时,我们还基于RabbitMQ的HelloWorld级别的代码,给出了订单服务和仓储服务如何基于MQ中间件收发消息的示例。

二、业务场景回顾

这篇文章,我们来稍微深入探讨一些MQ中间件使用中的基础技术问题。

首先回顾一下上篇文章做出来的一个架构图,看看订单服务和消息服务是如何基于MQ来收发消息的。

我们稍微把这个图细化一点,简单来说就是多个订单服务实例给queue推送消息,多个仓储服务每个消费一部分消息。如下图所示:

线上服务宕机时,如何保证数据100%不丢失

 

三、意外宕机,问题凸现

假如你线上对MQ技术的使用就到此为止了,那么基本可以跟offer说拜拜了。。。

因为如果是我的话,作为一个面试官就没法继续往下问了。你这个MQ的使用以及理解的深度仅此而已的话,那基本就是刚刚对MQ技术入门的程度。

如果面试官要继续问,完全可以问下面的问题:

  • 那你说说如果仓储服务作为消费者服务,刚收到了一个订单消息,但是在完成消息的处理之前,也就是还没对订单完成仓储调度发货,结果这个仓储服务突然就宕机了,这个时候会发生什么事情?

 

所以说,大家还是要对这个技术了解的稍微深入一点点,否则随便被问几个问题就完蛋了。

大伙儿先来看看下面的图,感受一下车祸现场。

线上服务宕机时,如何保证数据100%不丢失

 

RabbitMQ这个中间件默认的一个行为,就是只要仓储服务收到一个订单消息,RabbitMQ就会立马把这条订单消息给标记为删除,这个行为叫做自动ack,也就是投递完成一条消息就自动确认这个消息处理完毕了。

但是接着如果此时仓储服务收到了一个订单消息,但是还没来得及对仓库系统完成商品的调度发货,结果直接就宕机了。

此时,明显这个订单消息就丢失了啊,因为RabbitMQ那里已经没有了。。。

这会导致什么样的尴尬体验呢?就是一个用户支付了8999元,对一个iphone8下了订单,结果呢,死等活等了好几天,就是不见网站上显示他的iphone8在发货。

搞了半天,原因就是他的那个iphone8的订单在仓储服务那里,还没来得及调度发货直接就宕机了,导致这个订单消息就一直丢失了,始终没有给这个用户通知仓库系统进行发货。

这个问题,是不是很尴尬?所以说,技术问题是会严重影响企业的核心业务流程的!

各位小伙伴,还记得上一讲咱们的仓储服务消费消息的代码中,有一行关键的代码:

线上服务宕机时,如何保证数据100%不丢失

 

只要修改为false之后,RabbitMQ就不会盲目的投递消息到仓储服务,立马就删除消息了,说白了就是关闭autoAck的行为,不要自作主张的认为消息处理成功了。

接着,我们需要改造一下处理订单消息的代码,如下代码所示。

这段代码,说白了,就是在对订单完成了调度发货之后,在finally代码块中手动执行了ack操作,说我自己已经完成了耗时几十秒的业务逻辑的处理,现在可以手动ack通知RabbitMQ,这个消息处理完毕了。

线上服务宕机时,如何保证数据100%不丢失

 

此时整个架构运行流程大致看起来跟下面的图那样子。

线上服务宕机时,如何保证数据100%不丢失

 

架构流程改成上面那样后,就意味着只有完成了仓储调度发货的代码业务逻辑,确保仓库系统收到通知之后,仓储服务才会在代码中手动发送ack消息给RabbitMQ。

此时,RabbitMQ收到了这个ack消息,才会标记对应的订单消息被删除了。

如果说在仓储服务收到了订单消息,但是还没来得及完成仓储调度发货的业务逻辑,那也就绝对不会执行这条订单消息的ack操作,然后RabbitMQ也就不会收到这条订单消息的ack通知。

一旦RabbitMQ发现代表消费者的某个仓储服务实例突然宕机了,而这个仓储服务收到的一些订单消息还没来得及处理,没给自己发送那些消息的ack通知。

此时,RabbitMQ会自动对这条订单消息重发推送给其他在运行中的仓储服务实例,让其他的仓储服务实例去处理这条订单消息。

这样的话,就可以保证这条订单消息不会因为某个仓储服务实例的宕机而丢失,他会确保必须由某个仓储服务实例完成这条订单消息的调度发货处理,然后才会删除那条订单消息。

四、总结 tips

最后再来一张图,大家直观的感受一下:

线上服务宕机时,如何保证数据100%不丢失

 

好了,各位同学,这篇文章是不是相对稍微深入一点点,让大家了解到了一些使用MQ技术时候要考虑的一些问题?

实际上无论是RocketMQ、Kafka还是RabbitMQ,都有类似的autoAck或者是手动ack的机制。

线上生产环境中运行时,你必须要考虑到消费者服务可能宕机的问题。

如果消费者服务没处理完消息就自己宕机了,那么一定会导致部分消息的丢失,进而影响核心业务流程的运转。

因此大家在线上使用MQ时,一定要充分考虑这些潜在问题,同时结合具体的MQ提供的一些API、参数来进行合理设置,确保消息不要随意丢失。



Tags:服务器   点击:()  评论:()
声明:本站部分内容来自互联网,内容观点仅代表作者本人,如有任何版权侵犯请与我们联系,我们将立即删除。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
第一步:创建脚本#!/bin/bash# func:自动监控tomcat脚本并且执行重启操作# 获取tomcat进程ID(其中[grep -w 'tomcat']代码中的tomcat需要替换为你的tomcat文件夹名)Tomc...【详细内容】
2019-11-27   服务器  点击:(0)  评论:(0)  加入收藏
最近在用freeswitch软交换进行语音通话,通话的时候需要调用音频文件进行播放,当并发量上来的时候,freeswitch监听服务的端口会不断的down掉,查看日志发现报了一个错如下: 这个问...【详细内容】
2019-11-25   服务器  点击:(1)  评论:(0)  加入收藏
有时候大家需要将一台服务器内的数据传输到另外一台设备,有很多种方法,如果两台物理机离得很近,可以通过移动硬盘传输。如果是跨地区的,有人首先通过filezilla将数据下载到windo...【详细内容】
2019-11-25   服务器  点击:(3)  评论:(0)  加入收藏
最近有业务上有抓包的需求,所以经理安排我看了一下whistle这个项目,这个项目在github上有6k的标星,链接就不贴了吧,可以自行取github上搜索`whistle`,第一个就是.拿到链接...【详细内容】
2019-11-22   服务器  点击:(12)  评论:(0)  加入收藏
基本环境准备jdk安装配置。安装目录例如:/usr/java/jdk1.8.0_05tomcat下载放到约定目录。例如:/usr/local/dmstomcat tomcat做成系统服务把tomcat做成系统服务,就可以使用servi...【详细内容】
2019-11-20   服务器  点击:(6)  评论:(0)  加入收藏
一、传统并发模型的缺点基于线程的并发 特点: 每任务一线程 直线式的编程 使用资源昂高, context切换代价高,竞争锁昂贵 太多线程可能导致吞吐量下降,响应时间暴涨。基于事件的...【详细内容】
2019-11-20   服务器  点击:(5)  评论:(0)  加入收藏
在日常工作中,有时候需要把公司内部的某些服务向外提供服务,例如FTP服务、WEB服务等等,像这种需求,应该怎样解决呢?下面通过一个简单的案例来讲解拓扑图 企业内网用户和FTP服务器...【详细内容】
2019-11-20   服务器  点击:(16)  评论:(0)  加入收藏
先说说上次被黑得经历,上次被黑的服务器是阿里云,服务器倒是没事,仅仅是被删库了,主要原因有两点:一是外网数据库端口没关,二是线上数据库密码过于简单,总结来说是弱密码口令攻击,数据库密码有多简单:123456,说到这里,一口老血喷...【详细内容】
2019-11-20   服务器  点击:(4)  评论:(0)  加入收藏
概述今天主要介绍一下linux系统的一些开源绘图应用程序。下面一起来看看吧~1、Pinta 主要亮点: Paint.NET / 微软“画图”的极好替代品 支持附加组件(有对 WebP 图像的支持) 支...【详细内容】
2019-11-15   服务器  点击:(7)  评论:(0)  加入收藏
上篇介绍了一个简单的UDP服务框架,但是面对海量的请求,同步框架显然有点力不从心。于是在我接手好友系统的接口服务的时候,就采用了一个强大的异步框架——MCP框架。...【详细内容】
2019-11-13   服务器  点击:(8)  评论:(0)  加入收藏
近年来,大量由僵尸网络驱动的DDoS攻击利用了成千上万的被感染的物联网,通过向受害者网站发起大量的流量为攻击手段,最终造成严重后果。常年以来的顽疾DDoS似乎难以根治,那服务器...【详细内容】
2019-11-13   服务器  点击:(6)  评论:(0)  加入收藏
在工作中会遇到mysql要跨服务器访问,下面就介绍mysql的FEDERATED引擎如何建立跨服务器访问进入mysql命令行,没有看到Federated,说明没有安装mysql>show engines; 安装Federated...【详细内容】
2019-11-12   服务器  点击:(8)  评论:(0)  加入收藏
经历了两天不懈努力,终于恢复了一次误操作删除的生产服务器数据。对本次事故过程和解决办法记录在此,警醒自己,也提示别人莫犯此错。也希望遇到问题的朋友能找到一丝灵感解决问题。...【详细内容】
2019-11-12   服务器  点击:(15)  评论:(0)  加入收藏
Rsyslog 是一个自由开源的日志记录程序,在 CentOS 8 和 RHEL 8 系统上默认可用。它提供了一种从客户端节点到单个中央服务器的“集中日志”的简单有效的方法。Rsyslog 是一...【详细内容】
2019-11-12   服务器  点击:(12)  评论:(0)  加入收藏
docker 相关命令 docker安装的教程大家从网上搜一下 下面介绍几个相关的docker服务相关命令启动dockersudo service docker start停止dockersudo service docker stop重启d...【详细内容】
2019-11-12   服务器  点击:(7)  评论:(0)  加入收藏
OpenStack是一个开源平台,可让你构建在商用硬件上运行的基础架构即服务(IaaS)云。OpenStack背后的技术由一系列项目组成,这些项目为云基础架构解决方案提供了各种组件。它可以处...【详细内容】
2019-11-11   服务器  点击:(13)  评论:(0)  加入收藏
以下为服务器常用端口列表:端口 服务 说明 21 FTPFTP 服务所开放的端口,用于上传、下载文件。 22 SSH SSH端口,用于通过命令行模式 远程连接 Linux 服务器或vps。23 Telnet Tel...【详细内容】
2019-11-11   服务器  点击:(19)  评论:(0)  加入收藏
我们给客户做网站,经常会涉及到 给客户购买服务器,因为客户也不是很清楚,一般都委托给我们来购买,这里简单介绍下 我们是如何购买的,这里以阿里云举例 阿里云有两大类操作系统,win...【详细内容】
2019-11-11   服务器  点击:(12)  评论:(0)  加入收藏
Web服务器信息收集域名收集 :ping www.baidu.com 得到IP :相关工具:Nslookup>www.baidu.com:子域名:子域名挖掘器,(使用工具时不要代理上网)还可以看到网站搭建的容器等,容器&mid...【详细内容】
2019-11-08   服务器  点击:(12)  评论:(0)  加入收藏
今天给大家讲解一下命令执行和代码执行漏洞的危害以及详解步骤。代码执行和命令执行是有区别的,一个叫命令,一个叫代码,代码执行的话,一般指的是执行代码命令执行的话,一般都是执...【详细内容】
2019-11-07   服务器  点击:(23)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条