本课时主要讲解消息队列与数据库相关的知识,重点讲解三部分知识点:
-
Kafka 的架构与消息交互流程;
-
数据库事务的 4 大特性和分类;
-
MySQL 相关的内容,比如索引、MySQL 调优等。
消息队列与数据库知识点
先来看看相关知识点汇总,如下图。首先为了防止歧义进行说明,本课时中提到的“队列“就是指“消息队列“。
消息队列
来看消息队列的应用场景,也就是队列能解决哪些问题。
-
队列可以对应用进行解耦合,应用之间不用直接调用。
-
可以通过队列来传递消息,完成通信。
-
队列也可以用来执行异步任务,任务提交方无需等待结果。
-
队列的另一个作用是削峰填谷,在突发流量时,可以通过队列做缓冲,不会对后端服务产生较大压力,当峰值过去时,可以逐渐消费堆积的数据,填平流量低谷。
-
消息队列一般还提供了一写多读的能力,可以用来做消息的多播与广播。
关于队列还需要知道两个主要的消息协议。
-
JMS 是 Java 的消息服务,规定了 Java 使用消息服务的 API,在前面 Spring 的课时提到过,Spring 提供了支持 JMS 的组件。
-
AMQP 是高级消息队列协议,是应用层协议的一个开放标准,AMQP 不从 API 层进行限定,而是直接定义网络交换的数据格式,因此支持跨语言的能力,例如 RabbitMQ 就使用了 AMQP 实现。
再来对比几个常用的消息队列。
- RabbitMQ
使用 Erlang 开发的开源消息队列,通过 Erlang 的 Actor 模型实现了数据的稳定可靠传输。支持 AMQP、XMPP、SMTP 等多种协议,因此也比较重量级。由于采用 Broker 代理架构,发送给客户端时先在中心队列排队,疑似 RabbitMQ 的单机吞吐量在万级,不算很高。
- ActiveMQ
可以部署于代理模式和 P2P 模式,支持多种协议,单机吞吐量在万级,但是 ActiveMQ 不够轻巧,对于队列较多的情况支持不是很好。并且有较低概率丢失消息。
- RocketMQ
阿里开源的消息中间件,单机能够支持 10w 级的吞吐量,使用 Java 开发,具有高吞吐量、高可用性的特点、适合在大规模分布式系统中应用。
- Kafka
由 Scala 开发的高性能跨语言分布式消息队列,单机吞吐量可以到达 10w 级,消息延迟在 ms 级。Kafka 是完全的分布式系统,Broker、Producer、Consumer 都原生自动支持分布式,依赖于 ZooKeeper 做分布式协调。Kafka 支持一写多读,消息可以被多个客户端消费,消息有可能会重复,但是不会丢失。本课时后面会对 Kafka 的架构进行详细介绍。
数据库中间件
数据库中间件一般提供了读写分离、数据库水平扩展的能力。下面主要介绍两个中间件。
一是 Sharding-Sphere,它是一个开源的分布式数据库中间件解决方案,由 Sharding-JDBC、Sharding-Proxy、Sharding-