V-xin:ruyuanhadeng获得600+页原创精品文章汇总PDF

目录

  • 一、背景引入
  • 二、先来思考一下消息中间件的可用性问题
  • 三、集群化部署 + 数据多副本冗余
  • 四、多副本同步复制强制要求
  • 五、多机器承载多副本强制要求
  • 六、架构原理与技术无关性

一、背景引入

这篇文章,我们来聊一下消息中间件高可用架构的一些原理。

对于一个合格的高级Java工程师而言,你肯定会碰到在系统里用到MQ的场景,那么这个时候你需要基于你的业务场景和需求,考虑在使用MQ的时候可能遇到的一些技术问题。

接着,你必须得针对这些技术问题设计一套完整的技术方案。

你需要从消息的订阅模式、消息的生产到消费全链路不丢数据、消息中间件本身如何保证高可用,等各个角度切入,来考虑好你的系统和MQ对接之后的完整技术方案。

所以,本文就来聊聊消息中间件高可用的架构原理。


二、先来思考一下消息中间件的可用性问题

咱们先抛开各种具体的技术,就来思考一下,啥是MQ的可用性问题

大家看看下面的图,其实道理很简单,假如你的MQ就部署在一台机器上,那么正常情况下,生产者都会发送消息到MQ去,然后让消费者获取到。

但是万一天有不测风云,MQ部署的那台机器,因为一些莫名的原因,MQ自己本身的进程挂掉了,或者是那台机器直接就宕机了,那么此时怎么办呢?

很尴尬,是不是,结果是很明显的,生产者没法发送数据出去,然后消费者也没法获取到数据了。

然后整个系统不就完蛋了?因为系统的核心流程根本无法跑通了,对不对?

MQ宕机就直接导致你的系统本身也故障了,然后可能会导致你的公司对外的APP、网站等产品就无法运作了,用户无法使用你们公司的服务了。


如果你们公司是电商平台、外卖平台、社交平台。那么来这么一出,不是会导致公司损失惨重?

如果你的系统持续几个小时无法被人使用,本来你公司电商平台一天营收可以达到1亿,结果现在导致几个小时内无法下单购买商品,最后当天营收就5000万,那么你的公司是不是直接活生生损失了5000万?

这个真的不是开玩笑的,如果大家留意互联网行业的新闻的话和小道消息的话,就应该知道近几年一些大型互联网公司都出现过类似的情况,损失惨重,咱们做码农的就得被祭天了是不是?


三、集群化部署 + 数据多副本冗余

好,问题来了!现在你感觉一个MQ中间件应该如何实现高可用呢?

这里的方式有很多种,比如说数据多副本冗余,集群镜像同步机制,我们就抛开具体的技术来从本质层面思考一下MQ集群实现高可用的几种方式。

先来看下面的一张图,假设我们写到MQ的数据都被多副本冗余了,也就是你写的每一条消息都被复制到了其他的机器上去了。

那么此时任何一台机器宕机,似乎都不会影响我们跟MQ继续通信,而且写出去的数据似乎也都还在。

上面的图里,MQ采用集群模式部署到了2台机器上去,然后生产者给其中一台机器写入一条消息,该机器自动同步复制给另外一台机器。

此时数据在2台机器上,就有2个副本了,那么如果第一台机器宕机了,会影响我们吗?

答案是:不会

因为数据本身是多副本冗余的,此时消费者完全可以从第二台机器消费到这条消息,并且生产者还可以继续给第二台机器写入消息,数据没丢失。

而且,系统根本不用中断流程,还可以继续运行,我们看下面的图。

这种感觉是不是很棒?实际上这种MQ集群化部署架构以及数据多副本冗余机制,是非常常见的一种高可用架构。

Kafka这个极为优秀的消息中间件,就是采用的这种架构保证高可用、数据容错性。


四、多副本同步复制强制要求

但是这里你要思考另外几个问题,第一个就是:你在写数据到其中一台机器的时候,是不是得要求,必须得让那台机器复制数据到另外一台机器了,保证集群里一定有这条数据双副本了,才可以认为本次写成功了?

没错,假如你要是不能保证这一点,比如你就写数据给了其中一台机器,然后他还没来得及复制给另外一台机器呢,直接第一台机器就宕机了。

此时虽然你可以继续基于第二台机器发送消息和消费消息,但是你刚才发送的一条消息就丢失了。

大家看下面的图来理解一下这个场景。

所以对于采用这种机制的时候,你必须得让生产者通过一些参数的设置,保证说写一条消息到某台机器,他必须同步这条消息到另外一台机器成功,集群里有双副本了,然后此时才可以认为这条消息写成功了。

但凡刚写一台机器他就宕机,还没来得及复制到另外一台机器的话,本次写应该报错失败,然后你应该重试再次写入数据到MQ集群里去。

大家看看下面的图。只要你一次写成功了,他就保证肯定已经同步数据为双副本了,此时哪怕一台机器宕机,数据不会丢失,生产和消费都可以有条不紊的继续进行。

五、多机器承载多副本强制要求

第二个问题,假如说现在你的集群中本来有两台机器,现在宕机了其中的一台,只有一台机器了,你还能允许你的生产者对唯一的一台机器继续写入数据吗

答案是:

因为如果集群里只有一台机器可以承载写入,那么万一剩余的一台机器又宕机了呢?是不是还是会导致数据丢失,集群完蛋?

所以说,你的生产者同理应该基于参数设置一下,集群里必须有超过2台机器可以接收你的数据副本复制。

否则如果只有1台机器可以接受你的数据副本复制的话,那么还是算了。

大家看看下面的图,感受一下那个场景。

假设集群里有3台机器,那么其中一台宕机了,你后续再写入另外一台的时候,判断一下集群里还有剩余两台机器,足以保证数据双副本的高可用性和容错性,所以可以继续正常的写入数据到MQ集群里去。

实际上,上面说的那一整套的机制,在Kafka里都可以采用,他有对应的一些参数可以配置数据有几个副本,包括你每次写入必须复制到几台机器才可以算成功,否则就要重新发送,以及你的集群剩余机器必须可以承载几个副本才能继续写入数据。

通过这一整套方案的设计和基于具体技术的落地,才可以保证在集群化部署的情况下,集群必须有几台机器承载多副本,同时数据写入之后必须是保证多副本冗余的。

此时,任何机器宕机,数据都不会丢失,还可以正常让系统继续运行。


六、架构原理与技术无关性

其实本文对消息中间件的集群高可用架构的探讨,是完全脱离于某个具体技术的,非常朴素的从本质的原理层面来讨论这个话题。

具体的RabbitMQ、Kafka、RocketMQ等各种不同的消息中间件,对这种高可用架构的实现,都有一定的相似想通性,但是也都有各自不同的技术实现,以及相对应的区别。

后面我们再通过不同的文章,以各种MQ中间件的具体技术实现举例来讨论一下相关的架构是如何落地的。

V-xin:ruyuanhadeng获得600+页原创精品文章汇总PDF

另外推荐儒猿课堂的1元系列课程给您,欢迎加入一起学习~

互联网Java工程师面试突击课(1元专享)

SpringCloudAlibaba零基础入门到项目实战(1元专享)

亿级流量下的电商详情页系统实战项目(1元专享)

Kafka消息中间件内核源码精讲(1元专享)

12个实战案例带你玩转Java并发编程(1元专享)

Elasticsearch零基础入门到精通(1元专享)

基于Java手写分布式中间件系统实战(1元专享)

基于ShardingSphere的分库分表实战课(1元专享)

美团三面:消息中间件实现高可用架构,你会怎么设计?相关推荐

  1. TA大数据分析系统的高可用架构从设计到实现

    随着大数据时代的到来,对海量数据进行数据分析,并依据分析结果进行精细化运营成为各大企业的重要课题.但大数据行业门槛高,自建平台成本高.难度大.效率低,因此企业越来越需要专业的大数据分析工具. 针对市场 ...

  2. 数据库高可用架构(MySQL、Oracle、MongoDB、Redis)

    一.MySQL MySQL小型高可用架构 方案:MySQL双主.主从 + Keepalived主从自动切换 服务器资源:两台PC Server 优点:架构简单,节省资源 缺点:无法线性扩展,主从失败之 ...

  3. 数据中心网络高可用架构

    文章不错,转来了 http://www.h3c.com.cn/Solution/Operational/DataCenter/Solutions/201003/802841_30004_0.htm 相 ...

  4. 美团点评基于MGR的CMDB高可用架构搭建之路

    来自:DBAplus社群 本文根据王志朋老师在dbaplus社群[2018年8月4日北京数据架构与数据优化技术沙龙]现场演讲内容整理而成. 讲师介绍 王志朋 美团点评DBA 曾在京东金融担任DBA,目 ...

  5. 美团点评基于MGR的CMDB高可用架构搭建之路【转】

    王志朋 美团点评DBA 曾在京东金融担任DBA,目前就职于美团点评,主要负责金融业务线数据库及基础组件数据库的运维. MySQL Group Replication(以下简称MGR),于5.7.17版 ...

  6. 美团数据库高可用架构的演进与设想

    本文介绍最近几年美团MySQL数据库高可用架构的演进过程,以及我们在开源技术基础上做的一些创新.同时,也和业界其它方案进行综合对比,了解业界在高可用方面的进展,和未来我们的一些规划和展望. 在2015 ...

  7. 【稳定性day10】美团MySQL的高可用架构 - 对标业内的一些解决方案

    本文来自美团蔡金龙老师的分享,介绍了最近几年美团点评MySQL数据库高可用架构的演进过程,以及我们在开源技术基础上做的一些创新.同时,也和业界其它方案进行综合对比,了解业界在高可用方面的进展,和未来我 ...

  8. 服务器又崩了?深度解析高可用架构的挑战和实践

    点击上方"服务端思维",选择"设为星标" 回复"669"获取独家整理的精选资料集 回复"加群"加入全国服务端高端社群「后 ...

  9. c++获取可用端口号_PG高可用架构实施方案

    1.PG概述 PostgreSQL是一个功能非常强大的.源代码开放的客户/服务器关系型数据库管理系统(RDBMS).PostgreSQL最初设想于1986年,当时被叫做Berkley Postgres ...

最新文章

  1. QT ToolBar 工具栏浮动状态
  2. Gartner:到2020年人工智能将创造出230万个工作岗位
  3. 女生学高铁和计算机哪个更好,2020铁路最好的5个专业 女生上铁路学什么专业好...
  4. 八皇后问题详解(最短代码)
  5. 【Kafka】Confluent Schema Registry
  6. 如何为团队选择有用的增量进度衡量标准
  7. linux共享文件夹开机自启,ubuntu16.04.6和 18.04添加开机启动脚本,重启后自动挂载vmware的共享文件夹...
  8. mysql不记录binlog_MySQL不同的binlog_format会导致哪些SQL不会被记录
  9. java mysql resultset_Java数据库——ResultSet接口
  10. Python 高层文件操作(shutil模块)(转载)
  11. Python打印杨辉三角
  12. cisco fabricpath 功能介绍
  13. 国内著名高校飞跃手册整理
  14. 由NTC电阻值 计算温度 C语言,NTC热敏电阻温度计算方法,Steinhart-Hart方程和B值法(转)...
  15. 常用电脑软件你选对了吗?(知道的不知道的,这些软件每个都值得你安装)
  16. 小米手机获取ROOT权限的一些坑及补坑经验
  17. fluent linux运行算例,在linux环境下运行fluent,case文件中带有udf的话,jou文件应该做什么改变呢?...
  18. (八)相机对焦功能实现
  19. 阿里云 linux nginx 环境配置 该网页无法正常运作
  20. 固态硬盘装到服务器上影响寿命吗,谈谈SSD固态硬盘的寿命问题

热门文章

  1. jmeter jtl文件生成的html 解析
  2. Day10 面向对象 、类和对象的关系
  3. 微信显示时间php,类似于微信的聊天时间显示
  4. 理解同步传输与异步传输(一)
  5. asp.net酒店客户管理系统VS开发sqlserver数据库web结构C#编程
  6. Oracle条件语句
  7. 安卓扁平化之路专题(一)Android 4.4新特性
  8. Lucene系列:(8)搜索结果摘要
  9. wxWidgets Ubuntu下安装 配置 编译 创建项目 实现“hello world”(CodeBlocks)详细图文教程
  10. 淘淘商城内容服务发布