消息队列原理与实战 | 青训营笔记

75 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第12天

本节课重点内容

  • 普通业务面对流量高峰可能遇到的问题
  • 什么是消息队列
  • 消息队列的发展历程
  • 消息队列实现的几个实例介绍

本节课详细内容

普通业务面对流量高峰可能遇到的问题

  • 案例一:系统崩溃

    • 解决方案: 解耦合
  • 案例二:服务能力有限

    • 解决方案: 削峰
    • 引入一个消息队列,对队列内的请求慢慢处理
  • 案例三:链路耗时长尾

    • 解决方法: 异步实现订单后的过程
  • 案例四:日志存储

    • 日志坏掉怎么处理?

由此引入 消息队列

消息队列是什么?

  • 消息队列(MQ),指保存消息的一个容器,本质是个队列。但这个队列呢,需要支持高吞吐,高并发,并且高可用,常见比较流行的有ActiveMQ、RabbitMQ 、Kafak、阿里的RocketMQ,以及目前存算分离的Pulsar,在目前互联网应用中消息队列中间件基本上成为标配。

消息队列的发展历程

  • 1983年,美国的印度小哥Vivek设想了一种通用软件总线,这就是世界上第一个现代消息队列软件The Information Bus(TIB)
  • 2001年sun发布了jms技术,试图在各大厂商的层面上再包装一层统一的java规范。java程序只需要针对jms api编程就可以了,不需要再关注使用了什么样的消息中间件,但是jms仅仅适用于java。sun公司打破了技术壁垒,为
  • 2004年AMQP(高级消息队列协议)诞生了,才是真正促进了消息队列的繁荣发展,任何人都可以针对AMQP的标准进行编码。有好的协议指导,再加上互联网分布式应用的迅猛发展成为了消息中间件一飞冲天的最大动力。

消息队列- Kafka

使用步骤

  • 首先需要创建一个Kafka集群

  • 这个集群中创建一个Topic,并且设置好分片数量

  • 引入对应语言的SDK,配置好集群和Topic等参数,初始化一个生产者,调用Send方法,将你的Hello World发送出去

  • 引入对应语言的SDK,配置好集群和Topic等参数,初始化一个消费者,调用Poll方法,你将收到你刚刚发送的Hello World

    基本概念

  • Topic:Kakfa中的逻辑队列,可以理解成每一个不同的业务场景就是一个不同的topic,对于这个业务来说,所有的数据都存储在这个topic中

  • Cluster:Kafka的物理集群,每个集群中可以新建多个不同的topic

  • Producer:顾名思义,也就是消息的生产端,负责将业务消息发送到Topic当中

  • Consumer:消息的消费端,负责消费已经发送到topic中的消息

  • Partition:通常topic会有多个分片,不同分片直接消息是可以并发来处理的,这样提高单个Topic的吞吐

  • Offset:消息在partition内的相对位置信息,可以理解为唯一ID, 在partition内部严格递增。

  • Replica 分片的副本,分布在不同的机器上,可用来容灾,Leader对外服务,Follower异步去拉取leader的数据进行一个同步,如果leader挂掉了,可以将Follower提升成leader再对外进行服务

在集群的基础上,还有一个模块是ZooKeeper ,这个模块其实是存储了集群的元数据信息,比如副本的分配信息等等,Controller计算好的方案都会放到这个地方。