MQ系列1:消息中间件执行原理

MQ系列2:消息中间件的技术选型

MQ系列3:RocketMQ 架构分析

MQ系列4:NameServer 原理解析

MQ系列5:RocketMQ消息的发送模式

MQ系列6:消息的消费

MQ系列7:消息通信,追求极致性能

MQ系列8:数据存储,消息队列的高可用保障

1 介绍

消息中间件是指在分布式系统中完成消息的发送和接收的基础软件。

消息中间件也可以称消息队列(Message Queue / MQ),互联网场景中经常使用消息中间件进行消息路由、订阅发布、异步处理等操作,来缓解系统的压力。

引入消息队列主要是为了解决如下问题的:

1、解耦 :如订单系统,可以通过消息队列把削减库存的工作交给库存系统去处理,而不用等实时响应。

2、执行有序性:先进先出原理,按照进入消息队列的顺序处理业务事件。

3、消息路由 :按照不同的规则,将队列中消息发送到不同的业务服务中。

4、异步处理 :将一些无需实时响应结果的计算放到异步中,提升系统的吞吐率。

5、削峰 :将峰值期间的操作削减,比如整个操作流程包含12个步骤,后11个步骤非强关注结果的数据,可以放在消息队列中。

既然本身就是为了解决大流量场面而设计的,那他自身的稳定性、健壮性就显的无比重要,下面我们来看看消息队列怎么去保证可用性的。

2 消息队列的基本构成

分析高可用特性前先复习下消息队列的基本组件,无论是哪一种类型的消息队列,基本都包含以下构成:

  • Broker:消息服务器,以服务的形式运行在server端,给各个业务系统提供核心消息数据的中转服务。
  • Producer:消息生产者,业务的发起方,负责生产消息传输给broker。
  • Consumer:消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理
  • Topic:主题模块,发布/订阅模式下的消息统一汇集地,不同生产者向topic发送消息,由MQ服务器分发到不同的订阅者,实现消息的广播
  • Queue:队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收。
  • Message:消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输。

上图中以kafka为例子,这是典型的集群模式,Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance。Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消息。

  • producer 负责生产消息
  • consumer 负责消费消息
  • broker 消息服务器,提供消息核心的处理工作
  • zookeeper 用于生产者和消费者的注册与发现

3 高可用性架构保证

了解了一个消息队列的构成之后,我们来看看这种结构是怎么保障高可用性的。

首先,高可用是指系统的出错概率和无故障运行时长,从消息队列角度出发,至少要保证一下几点:

  • 低消息丢失率:消息可靠性也是衡量消息中间件好坏的一个关键因素,尤其是在金融支付领域,消息可靠性尤为重要。

  • 低故障率:消息中间件的可用性是指无故障运行的时间百分比,通常用几个 9 来衡量,如 99.99% 就是一个不错的指标。

  • 多副本容错能力:一般会要求多副本及强一致性,多副本可以保证在 master 节点宕机异常之后可以提升 slave 作为新的 master 而继续提供服务来保障可用性。

3.1 RocketMQ

以为RocketMQ为例,集群模式如下:

  • 多master 模式
  • 多master多slave异步复制模式-
  • 多 master多slave同步双写模式。
  • Name Service 集群: RocketMQ 的 "中央大脑 " , RocketMQ 的服务注册中心,集群模式确保它的可用性。
  • Produer 集群
  • Consumer 集群:避免单例的消费服务故障导致消息堆积。

    多master 多slave模式部署架构图:

Producer 与 NameServer集群中的其中一个节点(随机或者RR选择)建立长连接,定期从 NameServer 获取 Topic 路由信息,既可以从 Broker Master 订阅消息,也可以从 Broker Slave 订阅消息。

3.2 Kafka

Kafka集群中包含如下组成部分:

  • 几个消息生产者Producer(可以是业务的Web程序、定时任务服务,其他下游服务的请求等)
  • 一个broker组(Kafka支持横向扩展,一般来说broker数量越多,集群吞吐率越高)
  • 一个消费组 Consumer Group,在资源充足的情况下,消费者越多,消费效率越高,性能也就越好
  • 一个Zookeeper集群:保证消费者和生产者的注册和订阅,避免业务之间的耦合,也提高了可用性。



    两个关键点:
  1. Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance。
  2. Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消息。

4 总结

上面介绍了简历高可用消息队列架构的条件,以及RocketMQ和Kafka实现方案。具体高可用性特性方面(如 消息顺序性保障、消息幂等性保障、消息安全性保障、消息事务性保障),我们会在后面的章节中详细的介绍。

MQ系列9:高可用架构分析的更多相关文章

  1. MySQL系列:高可用架构之MHA

    前言 从11年毕业到现在,工作也好些年头,入坑mysql也有近四年的时间,也捣鼓过像mongodb.redis.cassandra.neo4j等Nosql数据库.其实一直想写博客分享下工作上的零零碎碎 ...

  2. MQ系列3:RocketMQ 架构分析

    MQ系列1:消息中间件执行原理 MQ系列2:消息中间件的技术选型 1 背景 我们前面两篇对主流消息队列的基本构成和技术选型做了详细的分析.从本篇开始,我们会专注当下主流MQ之一的RocketMQ. 从 ...

  3. MySQL 高可用架构在业务层面的应用分析

    MySQL 高可用架构在业务层面的应用分析 http://mp.weixin.qq.com/s?__biz=MzAxNjAzMTQyMA==&mid=208312443&idx=1&a ...

  4. 【亲述】Uber容错设计与多机房容灾方案 - 高可用架构系列

    此文是根据赵磊在[QCON高可用架构群]中的分享内容整理而成.转载请事先联系赵磊及相关编辑. 赵磊,Uber高级工程师,08年上海交通大学毕业,曾就职于微软,后加入Facebook主要负责Messen ...

  5. (5.1)mysql高可用系列——高可用架构方案概述

    关键词:mysql高可用概述,mysql高可用架构 常用高可用方案 20190918 现在业内常用的MySQL高可用方案有哪些?目前来说,用的比较多的开源方案分内置高可用与外部实现,内置高可用有如下: ...

  6. 【转】单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构

    此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据 ...

  7. [转载] 单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构

    原文: http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=209406532&idx=1&sn=2e9b0cc02bdd ...

  8. 实现基于Haproxy+Keepalived负载均衡高可用架构

    1.项目介绍: 上上期我们实现了keepalived主从高可用集群网站架构,随着公司业务的发展,公司负载均衡服务已经实现四层负载均衡,但业务的复杂程度提升,公司要求把mobile手机站点作为单独的服务 ...

  9. mysql高可用架构之MHA,haproxy实现读写分离详解

    MySQL高可用架构之MHA 一.运维人员需要掌握的MySQL技术: 1.基本SQL语句 2.基本的管理[库表数据的管理    权限的管理] 3.容灾       保证数据不丢失. 二.工作中MySQ ...

  10. MySQL高可用架构之Mycat-关于Mycat安装和参数设置详解

    MySQL高可用架构之Mycat-关于Mycat安装和参数设置详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Mycat介绍 1>.什么是Mycat Mycat背后是 ...

随机推荐

  1. Scanner的用法 从键盘输入

    先导入包 import java.util.Scanner; 后输入 Scanner Sc=new Scanner(System.in); //(Sc可以自定义,无实质意义) int i; i=Sc. ...

  2. CURL提交--POST/GET-带header信息

    function https_request($url, $param, $data = '', $method = 'GET', $headers = '') { $opts = array( CU ...

  3. python 矩阵切片

    假设n是一个numpy或者torch.tensor张量,那么 n[a:b,c:d]则代表从a到b行(不含b行),c到d列(不含d列)的切片 当然,ab.cd中的数是可以省略掉,只要abcd中有一个数即 ...

  4. faker

    faker是一个生成伪造数据的Python第三方库,可以伪造城市,姓名,文班等各自信息,而且支持中文   安装 pip3 install faker   使用 # 导包 from faker impo ...

  5. 论文笔记 - Noisy Channel Language Model Prompting for Few-Shot Text Classification

    Direct && Noise Channel 进一步把语言模型推理的模式分为了: 直推模式(Direct): 噪声通道模式(Noise channel). 直观来看: Direct ...

  6. 【题解】CF1714F Build a Tree and That Is It

    题面传送门 解决思路 题目中虽然说是无根树,但我们可以钦定这棵树的根为节点 \(1\),方便构造,这是不 影响结果的. 以下记给定的三段长度为 \(a,b,c\). 先考虑无解的情况. 首先,给出的三 ...

  7. 远程桌面报错credssp

    远程桌面连接的时候有时出现"出现身份验证错误.要求的函数不受支持:这可能是由于CredSSP 加密 Oracle 修正"的提示, 针对这种情况有以下两种版本的操作系统解决方案: w ...

  8. VS 新版本无法打开旧项目问题处理

    问题 最近想阅读 WorkflowCore 的源码,苦于代码量巨大,就想将项目回退到 Init Commit 版本 但是在回退版本后,工程内Project 显示已卸载 重新加载后 提示: 不支持 Th ...

  9. 关于虚拟机使用桥接网络访问不到物理机IP的问题解决

    问题描述 物理机可以ping 到虚拟机IP,虚拟机 ping 不到物理机IP 解决方法 关闭物理机防火墙,重启虚拟机

  10. github及git入门笔记

    1 github https://github.com/ 1.1 github注册 进入官方 https://github.com/ 首页,点击如下图片中sign up按钮,按照提示信息注册即可. 注 ...