中间件自然是放在服务|模块之间的,用于处理服务之间的数据交互。
常见的中间件:消息中间件(比如Kafka、RabbitMQ)、缓存中间件(比如Redis)。
消息生产者、消息消费者
比如服务A发消息给服务B,那服务A就是消息生产者(产生消息、发送消息),服务B就是消息消费者(接收消息)。
消息的2种交互方式
peer to peer:即p2p,只有一个接收者。
发布/订阅:可有多个接收者。
消息中间件的作用
模块之间的解耦:
各系统|模块|服务通过消息中间件这个统一的接口来交换数据,无需耦合在一起
模块的扩展性
消息中间件是数据接口,各模块没有耦合在一起、可随意扩展。
消息冗余
计算机中的冗余有2个含义:一、多余的部分,二、数据备份、增强安全性。
有的消息中间件可以持久化消息,避免消息处理前丢失的风险。
并发压力
使用消息队列来处理消息,并发时可堆积、处理大量消息,减少各模块压力。
容错
某模块故障时,消息中间件中的消息不会丢失,待该模块恢复后,继续处理即可。
异步通信
如果不需要立即处理消息,可以将消息暂存在消息中间件中,合适的时候再处理。
常见的消息中间件
ActiveMQ、KafKa、RocketMQ、RabbitMQ,最常用的是Kafka、RabbitMQ。
MQ,即Message Queue 消息队列。
ActiveMQ
Apache开源的消息中间件,老牌消息中间件。
性能一般,一般场景够用了,但高并发时往往应付不了,在中小企业中使用广泛。
有2种集群模式:
一种是主从模式,另一种是分布式的主从模式。
slave 从属、奴隶
Kafka
最初由Linkedin公司开源,后来由Apache维护。
由Scala和Java编写,消息处理方式是 发布|订阅 。
kafka的特点:
高吞吐量、高性能:单台Kafka服务器的消息读写速率可达 100万条/秒,但消息直接存储在内存中,很吃内存
消息持久化:所有消息都会被持久化到磁盘(副本),单条消息发生故障时可从磁盘恢复。虽然支持持久化会拉低性能,但Kafka的性能依然剽悍。
不支持事务,如果一个事务(多条消息)失败,并不会回滚,所以安全性低(数据一致性差)。
Kafka适合收集、处理大量数据、但对数据一致性要求不高的场景,在大数据开发中用得多。
常用场景:
收集各服务的日志
记录用户的访问踪迹,比如用户访问的网页、点击的条目、搜索的关键词,发送给订阅者来分析、挖掘用户爱好、购买力
记录分布式系统各模块实时产生的数据,监控系统运行状况,方便报警、统计报告
集群模式:
replicate 复制
RocketMQ
最初由阿里开源,后来由Apache维护,纯java编写。
吸取了Kafka的思路,并修正了Kafka的不足(不支持事务、可靠性不高)。
高吞吐量、高可用、可靠性高、支持事务,适合大规模分布式系统。
但技术要求高(维护成本高)、要收费。
集群模式:
RabbitMQ
使用Erlang语言编写,基于AMQP协议。
追求安全、可靠性、稳定性、数据一致性,常在企业系统中使用。
性能、吞吐量略差(性能、吞吐量比Kafka、RocketMQ差,但比ActiveMQ高很多)。
AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。
基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。