中间件技术非常的多,但大体分为:
- 分布式消息中间件
- 负载均衡中间件
- 缓存中间件
- 数据库中间件
下面我们简单来看一看
分布式消息中间件
ActiveMQ
遵循JMS规范、AMQP协议的消息中间件,使用Java语言开发,老牌的分布式消息中间件
但相对于业界其它的MQ而言,复杂程度较高
RabbitMQ
目前很流行的消息中间件,它支持的协议、分发的模式、持久化等等是比较完善的。并且它和Spring师出同门,因此Spring对RabbitMQ的支持比较完善
Kafka
高性能消息中间件的代言人,它是基于TCP/IP这种二进制的协议来开发的,所以它的性能非常高,因为它最接近底层
不支持事务,但支持持久化和部分分发机制
RocketMQ
阿里、滴滴联合开发的国产消息队列
支持事务
使用场景
- 消息中间件监控场景
- 异步数据传输场景
- 削峰填谷场景
- 任务调度场景
- 海量数据同步场景
- 分布式事务场景
- 大数据分析场景
协议
之前我们了解到,中间件的特点:要遵守协议(为了传输数据)、持久化(高可用)、扩展性(做集群)等等。这里我们来看看消息中间件要遵循哪些协议
- AMQP
- MQTT
- Kafka协议
- OpenMessage
我们不是有TCP/IP协议、UDP协议吗,为什么还要搞这么多协议出来
因为TCP/IP协议无法满足我们的需求,所以我们在TCP/IP协议基础之上重新构建了一些内容,就成了上述协议。注意,这些协议的底层仍然是TCP/IP协议
负载均衡中间件
- Nginx(重点)
- LVS负载均衡中间件
- KeepAlive
- CDN(重点)
缓存中间件
MemCache
将缓存数据写在代码中,因此会占用JVM的内存,小型项目适用
Redis(重点)
分布式架构下,缓存中间件的首选
数据库中间件
MySQL天然支持持久化,但它并不具备高可用(因为MySQL本身不支持集群),如果我们要实现MySQL的集群以及分库分表,需要使用如下的第三方中间件,实现MySQL的高可用
- MyCat
- ShardingJDBC
单体式架构 vs 分布式架构
对于早期的单体式应用来说,所有的业务模块、所有的源代码、静态资源文件都放在同一个工程中,其中一个模块做了很小的改动,就需要重新编译和部署整个项目。随着业务不断膨胀,它的问题暴露如下:
- 耦合度高
- 维护性差
- 后续架构升级的难度大
基于以上的种种问题,我们引入了分布式架构
单体式应用中,一个请求由一个系统处理。而在分布式架构中,一个请求由服务端的多个服务协同处理完成
它的问题如下:
- 学习成本高
- 运维成本和服务器成本高
- 系统的可用性虽然提升,但面临的错误也会成倍增加
- 基于安全性的考虑,迫使我们选择RMI/MQ来进行服务器之间的通讯
好处:
- 可以合理的分配服务器资源,减少了服务器资源的浪费
- 各个模块可以独立的维护和部署,降低耦合度,不会造成整个平台因部署而造成的停服状态
- 系统的架构和技术栈变得灵活(除了Java,我们还可以选择python和Golang)
谁更好?
没有最好的架构,只有最合适的架构